Dockerfile env зависимая отправная точка - PullRequest
1 голос
/ 29 сентября 2019

Подбирая докер, немного поздно на шоу, но лучше поздно, чем никогда.

После нескольких онлайн-уроков я нашел файл докера и скомпоновал docker для моего 1-го микросервисного узла + mongo.

Ужасная настройка для dev, поэтому теперь будет реализован trusty pm2: https://dev.to/itmayziii/step-by-step-guide-to-setup-node-with-docker-2mc9

Production может захотеть следующее, но dev, я бы хотел, чтобы pm2 instance mgr перезагружался при изменении файла ..

Но очевидный вопрос, который у меня сейчас возникает, - как различать dev и prod в Dockerfile?

Dockerfile

FROM node:12-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm i
COPY . /usr/src/app
EXPOSE 3000
CMD node ./build/server.js

docker-compose

version: "3"

services:

  ms-authentication-service:
    image: "ms-authentication-image"
    depends_on:
      - mongodb
    build:
      dockerfile: Dockerfile
      context: .
    links:
      - mongodb
    networks:
      - default
    ports:
      - "8080:8000"
    restart: always

  mongodb:
    image: mongo:4.2
    container_name: "ms-authentication-mongo-image"
    environment:
      MONGO_INITDB_ROOT_USERNAME: bob
      MONGO_INITDB_ROOT_PASSWORD: bob
    networks:
      - default
    ports:
      - 27017:27017

1 Ответ

2 голосов
/ 29 сентября 2019

В целом, управление средой, такой как подготовка или производство, основанное на ENV, является обычной практикой, но в случае с Docker лучшим подходом является tag.

Лучше использовать tag для dev, stage and production в случае с докером. Есть много причин, одна из которых - mount code в среде разработки, это хорошо, но это не рекомендуется в производственной среде.

При построении изображений всегда tag их с полезными тегами, которые кодируют версиюинформация, предполагаемое место назначения (prod or test, for instance), стабильность или другая информация, которая полезна при развертывании приложения в различных средах. Не полагайтесь на автоматически созданный последний тег .

enter image description here Рекомендации по разработке приложений Docker

Но если вы все еще хотите использовать подход ENV, вы можете использовать сценарий docker-entrypoint.

Dockerfile

FROM node:alpine
RUN npm install pm2 -g
COPY . /app
WORKDIR /app
ENV NODE_ENV=development
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT  ["sh","docker-entrypoint.sh"]

Docker-entrypoint

 #!bin/sh 
     if [ $NODE_ENV = development ]; then
     pm2 start server.js
     else
     node server.js
    fi

Так что вы готовы пойти и вы можете изменить это в Dockerfile или во время выполнения

 docker run --env NODE_ENV=production -it --rm node:production

или

 docker run --env NODE_ENV=development -it --rm dev
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...