【问题标题】:Set values on image build for a Docker container为 Docker 容器设置映像构建值
【发布时间】:2017-01-31 02:06:43
【问题描述】:

假设我在我的 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"]

更新:尝试使用参数时构建失败

根据@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 .

但失败并显示以下消息:

一个或多个构建参数 [USER_NAME] 未使用,构建失败。

怎么了?

【问题讨论】:

    标签: docker containers development-environment docker-build


    【解决方案1】:

    如果您希望在映像中固定该值,最好的选择是使用构建参数,并在您的 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这样的构建指令中使用参数值。

    【讨论】:

    • 你能看看我的编辑吗?也许我错过了什么
    • 该错误表示--build-arg 中的参数名称与ARG 中的名称不匹配。
    • 好的,但这不是我想要实现的。您了解我遇到的主要问题吗?看看OP现在可能更好
    • 如果您想动态地将有关主机的信息放入图像中,那么我认为这是不可能的。 Dockerfile 中的每条指令都在一个临时的中间容器中运行——容器不知道主机。如果您希望主机详细信息进入构建中的临时容器,则需要使用构建参数传递它们。
    • 所以我不能将 arg USER_NAME 传递到 run 文件中?这就是你说的?如果这是不可能的,我仍然需要这个,有什么解决方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2018-03-27
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多