在Docker容器的映像构建上设置值

时间:2016-09-22 13:08:34

标签: docker containers development-environment docker-build

让我们说我在Fedora中以reynierpm身份登录,我将从Dockerfile构建一个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>

我知道我可以使用bash中的$(whoami)来获取当前用户的值,但是如何在Docker构建中将其插入/设置为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 .

但是没有收到以下消息:

  

一个或多个build-args [USER_NAME]未被使用,构建失败。

出了什么问题?

1 个答案:

答案 0 :(得分:2)

如果你想在图像中修复该值,最好的选择是使用构建参数,并在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 .

build参数会覆盖Dockerfile中的默认值,因此您的图像具有真实构建器的用户名:

docker run temp cat /builder.txt                                                                                                                   
Built by: ubuntu 

编辑: build arguments仅在构建过程中作为环境变量提供。最终构建的图像中不存在变量或值。因此,您只能在RUN等构建指令中使用参数值。