如何处理Dockerfile在开发和生产环境中的差异

4

最近开始使用Docker并准备启动一个新项目。我已经创建了一个用于运行Node Web应用程序的Dockerfile,该Dockerfile设置了一个npm脚本来进行开发,该脚本会运行webpack并提供实时重新加载功能,以及一些其他进程,如linting等。

我正在为生产部署进行设置,这将有些不同。

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

2个回答

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:

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

生产环境中的Bash:

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

1

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

  • 第一个Dockerfile包含开发和生产环境的共同内容,这可以称为“my-app-base”;
  • 第二个 - 开发Dockerfile基于“First”图像,并仅包含特定于开发环境的内容;
  • 第三个 - 生产Dockerfile基于“First”图像,并仅包含特定于生产环境的内容。

让我以php项目为例向您展示:

基础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

开发 Dockerfile

在开发环境中,我希望能够在容器外部编辑源代码,因此我的 Dockerfile.dev 如下:

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

RUN docker-php-ext-install xdebug

VOLUME /src

一棵树是“tree”。可能不是你想要的。 - Alexander Azarov
谢谢,我已经修复了错误。 - Bukharov Sergey
关于你的回答。你能否解释一下如何在这些Dockerfile之间管理依赖关系? - Alexander Azarov
我会在我的回答中尝试解释这个问题。 - Bukharov Sergey
实际上我的问题是关于构建依赖的。你们的构建系统如何知道基础镜像已经改变,因此需要重新构建开发/生产环境呢? - Alexander Azarov
所有这些Dockerfiles都在同一个源代码仓库中。在处理源代码更改时,我们构建了所有的镜像。 - Bukharov Sergey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接