2016-08-10 4 views
3

Suppeose У меня есть простое приложение node.js. Я могу построить контейнер, чтобы запустить приложение с простым Dockerfile, как это:Docker: лучшая практика для среды разработки и производства

FROM ubuntu:16.04 
RUN apt-get update && apt-get install -y nodejs nodejs-legacy npm 
COPY . /app 
WORKDIR /app 
RUN npm install 
CMD node index.js 

Это позволит скопировать исходный код в контейнер, и я не могу отправить его в реестре нет проблем.

Но для разработки я не хочу перестраивать контейнер для каждого изменения в моем коде. Естественно, я использую громкость в сочетании с nodemon. Вот мои вопросы:

  • Как сохранить различные конфигурации? Два докерных фильтра? Использовать компоновку с двумя разными файлами компоновки?
  • Папка node_nodules на моем хосте отличается от той, которая мне нужна в контейнере (то есть некоторые пакеты устанавливаются глобально на хосте). Можно ли исключить его из тома? Если это так, мне нужно запустить npm install после установки тома. Как мне это сделать?

Так что мой вопрос в самом деле: как я могу развернуть среду разработки и развертывания. Два докерных файла? Два compose-файла? Есть ли лучшие практики?

+0

, что отличается от разработки до производства? можете ли вы использовать для этого среду? –

ответ

5

Так как я справляюсь с этим, у меня есть 2 файла Docker (Dockerfile и Dockerfile.dev).

В Dockerfile.dev у меня есть:

FROM node:6 

# Update the repository 
RUN apt-get update 

# useful tools if need to ssh in or used by other tools 
RUN apt-get install -y curl net-tools jq 

# app location 
ENV ROOT /usr/src/app 

COPY package.json /usr/src/app/ 

# copy over private npm repo access file 
ADD .npmrc /usr/src/app/.npmrc 

# set working directory 
WORKDIR ${ROOT} 

# install packages 
RUN npm install 

# copy all other files over 
COPY . ${ROOT} 

# start it up 
CMD [ "npm", "run", "start" ] 

# what port should I have 
EXPOSE 3000 

Мои НПЕ скрипты выглядеть следующим образом

"scripts": { 
    .... 
    "start": "node_modules/.bin/supervisor -e js,json --watch './src/' --no-restart-on error ./index.js", 
    "start-production": "node index.js", 
    .... 
}, 

Вы заметите это использует супервизор для запуска так что любые изменения в любой файл под ЦСИ будут вызывать он должен перезапустить сервер, не требуя перезагрузки докеров.

Последнее, что делает докер.

dev: 
    build: . 
    dockerfile: Dockerfile.dev 
    volumes: 
    - "./src:/usr/src/app/src" 
    - "./node_modules:/usr/src/node_modules" 
    ports: 
    - "3000:3000" 

prod: 
    build: . 
    dockerfile: Dockerfile 
    ports: 
    - "3000:3000" 

Так что вы видите в режиме разработчика он загружает его монтирует папку Src текущей директории на контейнере в/USR/SRC/приложение/ЦСИ, а также каталог node_modules в/USR/SRC/node_modules.

Это делает так, что я могу внести изменения локально и сохранить, тома обновит файл контейнера, а затем супервизор увидит это изменение и перезапустит сервер.

** Примечание, поскольку это не смотреть node_modules папки вы должны изменить другой файл в каталоге Src сделать рестарт **

4

Использовать переменные среды. См. Документацию Docker env. Это рекомендуемый способ, а также для использования в производстве.

+1

, например.docker run -e FOO_VAR = $ FOO_VAR –

1

Вы можете использовать один файл Dockerfile, в котором вы просто объявите раздел VOLUME.

Помните, что объем не будет установлен, если вы не будете указывать, что в явном виде во docker run с -v <path>:<path> опции. Имея это, вы можете объявить несколько VOLUME s даже в своей среде prod.

Смежные вопросы