为 Docker 容器的映像构建设置值
Set values on image build for a Docker container
假设我在我的 Fedora 中以 reynierpm
身份登录,我将从 Docker 文件构建一个 Docker 映像。该图像将包含一个 LAMP 环境。我有一个 Apache 虚拟主机 (VH) 默认文件,如下所示:
<VirtualHost *:80>
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory /var/www>
AllowOverride All
Require all granted
</Directory>
ErrorLog /dev/stdout
CustomLog /dev/stdout combined
</VirtualHost>
作为构建过程的一部分,此文件被复制到图像上的正确位置。
我可以从主机上获取登录用户名并动态设置到这个VH中吗?最后我想得到以下结果:
<VirtualHost *:80>
ServerName reynierpm.dev
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory /var/www>
AllowOverride All
Require all granted
</Directory>
ErrorLog /dev/stdout
CustomLog /dev/stdout combined
</VirtualHost>
我知道我可以使用 $(whoami)
从 bash 获取当前用户的值,但我如何才能 insert/set 它到 Docker build 上的 VH 文件?
这是Dockerfile
的内容:
FROM ubuntu:14.04.5
MAINTAINER Me <myemail@gmail.com>
ARG USER_NAME=unknown
VOLUME ["/var/www"]
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y software-properties-common && \
apt-get update && \
apt-get install -y \
apache2 \
php5 \
php5-cli \
libapache2-mod-php5 \
php5-gd \
php5-json \
php5-mcrypt \
php5-mysql \
php5-xdebug \
php5-curl \
php5-memcached \
php5-mongo \
zend-framework \
mc \
nano
# Copy default virtual host file.
COPY /config/apache2_vhost/apache_default /etc/apache2/sites-available/000-default.conf
COPY run /usr/local/bin/run
RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite
EXPOSE 80
EXPOSE 9001
CMD ["/usr/local/bin/run"]
更新:尝试使用 args
时构建失败
根据@Elton 的建议,我将这一行添加到 run
文件中:
sed -i "s/#ServerName www.example.com/$USER_NAME.dev/g" /etc/apache2/sites-available/000-default.conf
然后尝试将图像构建为:
docker build --build-arg USER_NAME=$(whoami) -t dev-php55 .
但是失败并显示以下消息:
One or more build-args [USER_NAME] were not consumed, failing build.
怎么了?
如果您希望该值在映像中固定,最好的选择是使用构建参数,并在您的 Dockerfile 中进行一些文本替换:
FROM ubuntu
ARG USER_NAME=unknown
RUN echo Built by: $USER_NAME > /builder.txt
然后在构建时传递你的whoami
:
docker build --build-arg USER_NAME=$(whoami) -t temp .
构建参数会覆盖 Dockerfile 中的默认值,因此您的映像具有真实构建器的用户名:
docker run temp cat /builder.txt
Built by: ubuntu
编辑: build arguments 仅在构建过程中用作环境变量。变量或值都不存在于最终构建的图像中。所以你只能在构建指令中使用参数值,比如 RUN
.
假设我在我的 Fedora 中以 reynierpm
身份登录,我将从 Docker 文件构建一个 Docker 映像。该图像将包含一个 LAMP 环境。我有一个 Apache 虚拟主机 (VH) 默认文件,如下所示:
<VirtualHost *:80>
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory /var/www>
AllowOverride All
Require all granted
</Directory>
ErrorLog /dev/stdout
CustomLog /dev/stdout combined
</VirtualHost>
作为构建过程的一部分,此文件被复制到图像上的正确位置。
我可以从主机上获取登录用户名并动态设置到这个VH中吗?最后我想得到以下结果:
<VirtualHost *:80>
ServerName reynierpm.dev
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory /var/www>
AllowOverride All
Require all granted
</Directory>
ErrorLog /dev/stdout
CustomLog /dev/stdout combined
</VirtualHost>
我知道我可以使用 $(whoami)
从 bash 获取当前用户的值,但我如何才能 insert/set 它到 Docker build 上的 VH 文件?
这是Dockerfile
的内容:
FROM ubuntu:14.04.5
MAINTAINER Me <myemail@gmail.com>
ARG USER_NAME=unknown
VOLUME ["/var/www"]
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y software-properties-common && \
apt-get update && \
apt-get install -y \
apache2 \
php5 \
php5-cli \
libapache2-mod-php5 \
php5-gd \
php5-json \
php5-mcrypt \
php5-mysql \
php5-xdebug \
php5-curl \
php5-memcached \
php5-mongo \
zend-framework \
mc \
nano
# Copy default virtual host file.
COPY /config/apache2_vhost/apache_default /etc/apache2/sites-available/000-default.conf
COPY run /usr/local/bin/run
RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite
EXPOSE 80
EXPOSE 9001
CMD ["/usr/local/bin/run"]
更新:尝试使用 args
时构建失败根据@Elton 的建议,我将这一行添加到 run
文件中:
sed -i "s/#ServerName www.example.com/$USER_NAME.dev/g" /etc/apache2/sites-available/000-default.conf
然后尝试将图像构建为:
docker build --build-arg USER_NAME=$(whoami) -t dev-php55 .
但是失败并显示以下消息:
One or more build-args [USER_NAME] were not consumed, failing build.
怎么了?
如果您希望该值在映像中固定,最好的选择是使用构建参数,并在您的 Dockerfile 中进行一些文本替换:
FROM ubuntu
ARG USER_NAME=unknown
RUN echo Built by: $USER_NAME > /builder.txt
然后在构建时传递你的whoami
:
docker build --build-arg USER_NAME=$(whoami) -t temp .
构建参数会覆盖 Dockerfile 中的默认值,因此您的映像具有真实构建器的用户名:
docker run temp cat /builder.txt
Built by: ubuntu
编辑: build arguments 仅在构建过程中用作环境变量。变量或值都不存在于最终构建的图像中。所以你只能在构建指令中使用参数值,比如 RUN
.