Node + Docker Compose: настройка разработки и производства

Я ищу решение, позволяющее иметь в моем проекте как разработку, так и производственную среду с использованием docker, docker-compose и nodejs.

Как мне подойти к этому?

По сути, мне нужна команда для запуска моей производственной среды Docker и команда для запуска моей среды разработки (которая может использовать, например, nodemon).

Вот мой докерфайл

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

CMD ["npm", "run", "prod"] # <--- Have a possibility to run something like "npm run dev" here instead

докер-compose.yml

version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"

пакет.json

// ...
    "scripts": {
        "build": "tsc",
        "dev": "nodemon source/index.ts",
        "prod": "node build/index.js"
    },
// ...

person Sir hennihau    schedule 31.05.2020    source источник


Ответы (3)


Вы можете использовать точку входа и передать команду контейнеру докеров. Затем вы можете использовать наследственность docker-compose для запуска компоновки для нужной вам среды и добавления команды к точке входа.

Файл Docker:

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

ENTRYPOINT ["npm", "run"]

Основной docker-compose.yml:

version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"

Затем создайте два файла docker-compose, чтобы добавить команду, переданную в точку входа образа. Для разработки — docker-compose.dev.yml:

version: "3"
services:
    findus:
        command: dev

и docker-compose.prod.yml :

version: "3"
services:
    findus:
        command: prod

Затем для запуска среды разработки:

docker-compose  -f docker-compose.yml -f docker-compose.dev.yml up    

и для рабочей среды:

docker-compose  -f docker-compose.yml -f docker-compose.prod.yml up   

Таким образом, command будет добавлено к инструкции ENTRYPOINT.


Также этот подход может работать с переменными среды, если вы хотите передать команду как переменную среды. Дополнительную информацию можно найти в документах.

person Michał Krzywański    schedule 31.05.2020

Один из способов сделать это — создать две «цели» в вашем Dockerfile следующим образом:

Докерфайл:

FROM node:13-alpine As development

RUN mkdir /app

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM node:13-alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /app

COPY package*.json ./

RUN npm install --only=production

COPY . .

COPY --from=development /app/dist ./dist

CMD ["node", "dist/index.js"]

И они на вашем docker-compose запускают только версию для разработчиков:

version: '3.7'

services:
  main:
    container_name: main
    build:
      context: .
      target: development
    command: npm run dev
...

Итак, в вашей среде разработки вы можете запустить:

докер-компоновать

и их в продукте вы можете запустить докер напрямую с

docker run --целевое производство

Я предполагаю, что когда вы запускаете «npm run build», вы создаете папку dist/production, поэтому лучше запускать узел там, а не запускать прямо в index.js в вашей корневой папке.

person André Oliveira    schedule 31.05.2020

Вы можете создать такую ​​структуру:

docker-compose.yml -->
      docker-compose.dev.yml
      docker-compose.prod.yml

Где базовая конфигурация находится в docker-compose.yml, а информация о среде, такая как порты или учетные данные пользователя, будет в docker-compose.dev.yml или docker-compose.prod.yml.

И затем вы можете запустить среду разработки с помощью:

docker-compose \
    -f docker-compose.yml \
    -f docker-compose.dev.yml \
    up -d

Или среда prod с:

docker-compose \
    -f docker-compose.yml \
    -f docker-compose.prod.yml \
    up -d
person Adi Dembak    schedule 31.05.2020