设置Docker容器的图像构build值
假设我在Fedora上以reynierpm
login,并且reynierpm
构build一个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>
作为构build过程的一部分,该文件被复制到图像上的适当位置。
我可以从主机获取login的用户名,并dynamic地设置到这个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>
我知道,我可以从bash中使用$(whoami)
获取当前用户的值,但是如何在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"]
更新:尝试使用参数时生成失败
在@Eltonbuild议之后,我将这一行添加到run
文件中:
sed -i "s/#ServerName www.example.com/$USER_NAME.dev/g" /etc/apache2/sites-available/000-default.conf
然后尝试将图像构build为:
docker build --build-arg USER_NAME=$(whoami) -t dev-php55 .
但是失败的消息如下:
一个或多个构build参数[USER_NAME]未被使用,构build失败。
怎么了?
如果你想在图像中修正这个值,最好的select是使用一个构build参数,并在Dockerfile中做一些文本replace:
FROM ubuntu ARG USER_NAME=unknown RUN echo Built by: $USER_NAME > /builder.txt
然后当你build立时传递你的whoami
:
docker build --build-arg USER_NAME=$(whoami) -t temp .
构build参数会覆盖Dockerfile中的默认值,以便您的映像具有真正的构build器用户名:
docker run temp cat /builder.txt Built by: ubuntu
编辑: 构build参数只能在生成过程中作为环境variables。 最终构build的图像中不存在variables或值。 所以你只能使用像RUN
这样的构build指令中的参数值。