最近开始使用Docker并准备启动一个新项目。我已经创建了一个用于运行Node Web应用程序的Dockerfile,该Dockerfile设置了一个npm脚本来进行开发,该脚本会运行webpack并提供实时重新加载功能,以及一些其他进程,如linting等。
我正在为生产部署进行设置,这将有些不同。
处理这些差异的推荐方法是什么?需要两个Dockerfiles吗?
最近开始使用Docker并准备启动一个新项目。我已经创建了一个用于运行Node Web应用程序的Dockerfile,该Dockerfile设置了一个npm脚本来进行开发,该脚本会运行webpack并提供实时重新加载功能,以及一些其他进程,如linting等。
我正在为生产部署进行设置,这将有些不同。
处理这些差异的推荐方法是什么?需要两个Dockerfiles吗?
ARG
和 ENV
。
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
您可能会感到惊讶,但三个Dockerfiles看起来更好!
让我以php项目为例向您展示:
我们为项目创建基本镜像。
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.prod
如下所示:
# Set the base image
FROM my_company/php5.6:base
# begin instalation
# copy src
ADD . /src
在开发环境中,我希望能够在容器外部编辑源代码,因此我的 Dockerfile.dev
如下:
# Set the base image
FROM my_company/php5.6:base
RUN docker-php-ext-install xdebug
VOLUME /src
Dockerfile
之间管理依赖关系? - Alexander Azarov