当前位置: 首页 > 知识库问答 >
问题:

为Docker容器设置映像构建值

梁磊
2023-03-14

假设我在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-html" target="_blank">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的建议,我将这一行添加到< code>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 .

但是失败,并显示以下消息:

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

怎么了?

共有1个答案

穆俊杰
2023-03-14

如果您希望该值在图像中是固定的,最好的选择是使用build参数,并在docker文件中进行一些文本替换:

FROM ubuntu                                                                                                                                          
ARG USER_NAME=unknown                                                                                                                                
RUN echo Built by: $USER_NAME > /builder.txt

然后在构建时传递您的< code>whoami:

docker build --build-arg USER_NAME=$(whoami) -t temp .

build参数覆盖docker文件中的缺省值,因此您的图像具有真正的构建者的用户名:

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

EDIT:构建参数在构建过程中只能作为环境变量使用。变量或值都不存在于最终生成的图像中。因此,您只能在构建指令(如RUN)中使用参数值。

 类似资料:
  • 我正在尝试设置一个运行UbuntuLinux18.04作为docker主机的构建服务器。 主机有三个docker容器在运行——docker注册表——Gitlab服务器——Gitlab Runner(用于构建应用程序) 我希望Gitlab Runner容器使用nginx和编译的Angular代码构建docker映像,并将其推送到docker注册表。 我已经成功地设置了所有三个运行的容器,Gitlab

  • 目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个

  • 问题内容: 我有一个Jenkins作为docker容器运行,现在我想使用管道构建Docker映像,但是Jenkins容器总是告诉未找到Docker。 这是我运行詹金斯图像的方式: Jenkins映像的DockerFile是:https : //github.com/jenkinsci/docker/blob/9f29488b77c2005bbbc5c936d47e697689f8ef6e/Dock

  • 我有一个Jenkins作为docker容器运行,现在我想使用管道构建docker映像,但Jenkins容器总是告诉docker not found。 以下是我如何运行我的詹金斯形象: Jenkins图像的DockerFile是:https://github.com/jenkinsci/docker/blob/9f29488b77c2005bbbc5c936d47e697689f8ef6e/Dock

  • 问题内容: 我从dockerfile构建了Docker映像。我看到映像已成功构建,但是该如何处理?它不应该能够作为容器运行吗? 问题答案: 运行它的具体方法取决于您是否为图像指定了标签/名称。 使用名称(让我们使用 Ubuntu ): 没有名称,只需使用ID: 请参阅 Docker运行参考 以获取更多信息。

  • 通过前面的介绍,我们知道了Docker 镜像是多个基于 UnionFS 的镜像层依次挂载的结果,而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的文件系统复合而成。 Docker 中为我们提供了将容器中的这个可读可写的环境持久化为一个镜像层的方法,即docker commit。 docker commit将容器修改的内容保存为镜像,我们可以把它理解为提交容器的更改。 1.生成变更后的镜