如何处理dev / prod的Dockerfile差异

时间:2017-01-20 08:07:25

标签: node.js docker dockerfile

最近开始使用Docker,我正在设置一个新项目。我有一个用于Node web应用程序的Dockerfile,用于运行用于开发的npm脚本,该脚本通过实时重新加载和一些其他过程(如linting等)运行webpack。

我正在为我的生产部署进行设置,这看起来会有所不同。

处理这些差异的推荐方法是什么?两个Dockerfiles?

3 个答案:

答案 0 :(得分:1)

你可能会感到惊讶,但三个Dockerfiles看起来更好!

  • 第一个Dockerfile包含开发和生产环境的常见内容,这可能会命名为" my-app-base";
  • 第二个 - 开发Dockerfile基于" First"图片并且仅包含 dev env;
  • 的特定内容
  • 第三 - 生产Dockerfile基于" First"图片并且仅包含生产环境
  • 的特定内容

让我向您展示php项目的示例:

Base dockerfile

我们为项目创建基本图像。 Dockerfile.base看起来像

# Set the base image
FROM php:5.6-apache

# install php dependencies
RUN apt-get update && apt-get install -y \
        php5-pgsql \
        postgresql-client \
        php5-mongo \
        libxml2-dev \
        php-soap \
        libpq-dev \
        libmcrypt-dev \
        php-pear \
    && docker-php-ext-install pdo \
    && docker-php-ext-install pgsql \
    && docker-php-ext-install pdo_pgsql \
    && docker-php-ext-install soap \
    && docker-php-ext-install pcntl \
    && docker-php-ext-install mcrypt

# preconfiguring apache
RUN a2enmod rewrite && a2enmod headers && a2enmod proxy && a2enmod proxy_http
RUN echo "export DISPLAY=':0'" >> /etc/apache2/envvars
VOLUME /var/log/apache2
EXPOSE 80

# configure envarionments
RUN echo "date.timezone=Europe/Moscow" > $PHP_INI_DIR/conf.d/date_timezone.ini

...settings env, configuring apache, etc...

,图片将命名为my_company/php5.6:base

生产Dockerfile

在制作中我希望容器中包含源代码,然后我的Dockerfile.prod将如下所示:

# Set the base image
FROM my_company/php5.6:base

# begin instalation
# copy src
ADD . /src

Dev Dockerfile

在开发环境中,我希望能够在容器外编辑源代码,那么我的Dockerfile.dev将如下所示:

# Set the base image
FROM my_company/php5.6:base

RUN docker-php-ext-install xdebug

VOLUME /src

答案 1 :(得分:1)

我认为你应该"玩"使用ARGENV

https://docs.docker.com/engine/reference/builder/#/arg

https://docs.docker.com/engine/reference/builder/#env

示例:

Dockerfile:

FROM node:7.1

ARG NODE_ENV
ENV NODE_ENV=${NODE_ENV:-production}

COPY package.json .
RUN npm install

COPY . .

CMD npm start # the start script can handle the NODE_ENV variable to run a special command

bash for development:

docker build --tag myimage:development --build-arg "NODE_ENV=development" .
docker run myimage:development

bash for production:

docker build --tag myimage:production --build-arg "NODE_ENV=production" .
# or
docker build --tag myimage:production .
docker run myimage:production

答案 2 :(得分:0)

调查" 12-factor app"宣言适合你。如果是,那么Doc​​ker为这些应用程序提供了非常好的方法:

  • 构建和部署阶段之间的良好分离
  • 不可变构建工件(Docker镜像)
  • 可以指定端口绑定
  • 可以指定环境

一些谷歌搜索会给你一些关于如何使用Docker的12因素应用程序的文章。我将仅为搜索页面提供one link