#javascript #node.js #docker #dockerfile
#javascript #node.js #docker #dockerfile
Вопрос:
Итак, у меня есть 3 файла:
- client.js
- app.js
- database.js
В app.js файл, я создал экспресс-сервер с несколькими службами, которые подключаются к базе данных. The client.js file запускает службы, используя node-fetch.
На данный момент я создал Dockerfile для запуска app.js:
FROM node:10
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD node app
EXPOSE 3000
Возможно, это глупый вопрос, но есть ли какой-нибудь способ создать другой файл Dockerfile для запуска client.js внутри контейнера?
Спасибо.
Комментарии:
1. Не внутри другого контейнера нет. Вы можете подключать контейнеры. Попробуйте выполнить поиск
docker compose
.2. Вы можете создать второй файл Dockerfile, чтобы создать второй образ с клиентом, чтобы запустить второй контейнер; пока два контейнера находятся в одной сети Docker, они могут обмениваться данными, используя имена контейнеров в качестве имен хостов. Вы также можете запустить изображение, которое у вас есть в данный момент, с помощью альтернативной команды,
docker run your-image node client.js
. Работает ли любой из этих подходов; есть ли более конкретная проблема, с которой вы столкнулись?
Ответ №1:
Используйте docker-compose
и объединяйте все службы в одну сеть.
Вот общее описание того, как это должно выглядеть:
version: "3.3"
services:
app:
image: #image built for client, I recommend node:alpine
ports:
- "MACHINE_PORT:CONTAINER_PORT"
network:
- your_network
database:
image: #image of database system you're using
#use docker pull NAME_OF_DATABASE_SYSTEM
network:
- your_network
ports:
...
client: #image of the client built with node:alpine
network:
- your_network
ports:
...
networks:
- your_network
Ответ №2:
Основной способ структурировать подобный проект — с помощью docker-compose .
Создайте docker-compose.yml
файл в корне вашего проекта:
version: "3.9"
services:
app:
image: sarah/app
build: app
ports:
- 3000:3000
environment:
SERVICES: http://services:3000
services:
image: sarah/services
build: services
environment:
DATABASE: database:2345
database:
image: mysql # whatever....
Затем создайте папку app
с Dockerfile и переместите app.js там
И создайте папку services и переместите туда другие файлы .js. Я добавил переменные среды, демонстрирующие, как можно настроить службы с правильными строками подключения к другим службам. Реализация конфигурации с помощью переменных среды зависит от вас.
docker-compose up
запустится 3 контейнера — по одному для служб, приложения и базы данных.
docker-compose build
перестроит любые изображения, которые были изменены Dockerfiles (или другими файлами).
В вашем контейнере приложений используйте строку подключения «services:» для подключения к приложению-сервису, поскольку каждый контейнер добавляется в частный dns с использованием его имени службы, поэтому «database:» также будет адресом, используемым для доступа к вашей БД из любого контейнера.
http://localhost:3000
на рабочем столе браузер перейдет к приложению по его опубликованному порту.
В compose v3 сервисы не нужно явно добавлять в сети или связывать, поскольку они автоматически добавляются в сеть «по умолчанию», которую вы увидите созданной при первом развертывании (запуске) файла compose.
Приношу извинения @gordon_freeman за избыточный ответ, но я хотел представить пример с современным синтаксисом.