Как запустить клиент javascript внутри контейнера Docker?

#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 за избыточный ответ, но я хотел представить пример с современным синтаксисом.