ARG 或 ENV,在这种情况下使用哪一个?

2024-01-24

这可能是一个微不足道的问题,但阅读文档ARG https://docs.docker.com/engine/reference/builder/#arg and ENV https://docs.docker.com/engine/reference/builder/#env并没有让我清楚地了解事情。

我正在构建一个 PHP-FPM 容器,我希望能够根据用户需求启用/禁用某些扩展。

如果这可以在 Dockerfile 中通过添加条件并在构建命令上传递标志来完成,那就太好了,但据我所知不受支持。

就我而言,我个人的方法是在容器启动时运行一个小脚本,如下所示:

#!/bin/sh   
set -e

RESTART="false"

# This script will be placed in /config/init/ and run when container starts.
if  [ "$INSTALL_XDEBUG" == "true" ]; then
    printf "\nInstalling Xdebug ...\n"
    yum install -y  php71-php-pecl-xdebug
    RESTART="true"
fi
...   
if  [ "$RESTART" == "true" ]; then
    printf "\nRestarting php-fpm ...\n"
    supervisorctl restart php-fpm
fi

exec "$@"

这就是我的Dockerfile好像:

FROM reynierpm/centos7-supervisor
ENV TERM=xterm \
    PATH="/root/.composer/vendor/bin:${PATH}" \
    INSTALL_COMPOSER="false" \
    COMPOSER_ALLOW_SUPERUSER=1 \
    COMPOSER_ALLOW_XDEBUG=1 \
    COMPOSER_DISABLE_XDEBUG_WARN=1 \
    COMPOSER_HOME="/root/.composer" \
    COMPOSER_CACHE_DIR="/root/.composer/cache" \
    SYMFONY_INSTALLER="false" \
    SYMFONY_PROJECT="false" \
    INSTALL_XDEBUG="false" \
    INSTALL_MONGO="false" \
    INSTALL_REDIS="false" \
    INSTALL_HTTP_REQUEST="false" \
    INSTALL_UPLOAD_PROGRESS="false" \
    INSTALL_XATTR="false"

RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
                   https://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN yum install -y  \
        yum-utils \
        git \
        zip \
        unzip \
        nano \
        wget \
        php71-php-fpm \
        php71-php-cli \
        php71-php-common \
        php71-php-gd \
        php71-php-intl \
        php71-php-json \
        php71-php-mbstring \
        php71-php-mcrypt \
        php71-php-mysqlnd \
        php71-php-pdo \
        php71-php-pear \
        php71-php-xml \
        php71-pecl-apcu \
        php71-php-pecl-apfd \
        php71-php-pecl-memcache \
        php71-php-pecl-memcached \
        php71-php-pecl-zip && \
        yum clean all && rm -rf /tmp/yum*

RUN ln -sfF /opt/remi/php71/enable /etc/profile.d/php71-paths.sh && \
    ln -sfF /opt/remi/php71/root/usr/bin/{pear,pecl,phar,php,php-cgi,phpize} /usr/local/bin/. && \
    mv -f /etc/opt/remi/php71/php.ini /etc/php.ini && \
    ln -s /etc/php.ini /etc/opt/remi/php71/php.ini && \
    rm -rf /etc/php.d && \
    mv /etc/opt/remi/php71/php.d /etc/. && \
    ln -s /etc/php.d /etc/opt/remi/php71/php.d

COPY container-files /
RUN chmod +x /config/bootstrap.sh
WORKDIR /data/www
EXPOSE 9001

目前这是有效的,但是...如果我想添加 20 个(随机数)扩展或任何其他可以启用|禁用的功能,那么我将以 20 个不必要的结尾ENV(因为 Dockerfile 不支持 .env 文件)定义,其唯一目的是设置此标志,让脚本知道接下来要做什么...

  • 这是正确的做法吗?
  • 我应该使用ENV以此目的?

我愿意接受想法,如果您有不同的方法来实现这一目标,请告诉我


From Dockerfile 参考 https://docs.docker.com/engine/reference/builder/:

  • The ARG指令定义了一个变量,用户可以使用 docker build 命令在构建时将其传递给构建器--build-arg <varname>=<value> flag.

  • The ENV指令设置环境变量<key>到值<value>.
    使用设置的环境变量ENV当容器从生成的映像运行时将持续存在。

所以如果你需要构建时定制,ARG是您最好的选择。
如果您需要运行时自定义(以不同的设置运行相同的图像),ENV很适合。

如果我想添加 20 个(随机数)扩展或任何其他可以启用|禁用的功能

考虑到涉及的组合数量,使用ENV在这里最好在运行时设置这些功能。

但是你可以结合两者 https://stackoverflow.com/a/33936014/6309 by:

  • 构建具有特定特征的图像ARG
  • 使用那个ARG as an ENV

也就是说,Dockerfile 包括:

ARG var
ENV var=${var}

然后,您可以使用特定的图像构建图像var构建时的值(docker build --build-arg var=xxx),或者运行具有特定运行时值的容器(docker run -e var=yyy)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARG 或 ENV,在这种情况下使用哪一个? 的相关文章

随机推荐

  • Swift 结构内存泄漏

    我们正在尝试尽可能使用 Swift 结构 我们还使用 RxSwift 它具有采用闭包的方法 当我们有一个结构体创建一个引用的闭包时self 这会创建一个强引用循环 https developer apple com library ios
  • 在TestNG中使用@BeforeMethod时有没有办法获取方法元数据?

    我正在使用 TestNG 并有一套测试 我想在每个需要有关该方法的信息的测试方法之前执行一个操作 举一个简单的例子 假设我想在执行之前打印方法的名称 我可以编写一个带有注释的方法 BeforeMethod 如何将参数注入该方法 看看依赖注入
  • XPath:通过纯文本查找 HTML 元素

    请注意 这个问题是一个更精致的版本上一个问题 https stackoverflow com q 18655765 1839209 我正在寻找一个 XPath 它可以让我在 HTML 文档中查找具有给定纯文本的元素 例如 假设我有以下 HT
  • Python 3+ 在函数调用中导入包?

    随着时间的推移 我已经为各种事情建立了一系列实用函数 我想将它们全部放在包中 其结构比仅包含所有功能的单个文件要多一些 其中一些函数是在假设已导入某些包的情况下编写的 例如我有一些numpy and pandas假设类似的效用函数impor
  • FPDF - 在放置之前确定 MultiCell 的高度?

    基本问题 在将 MultiCell 放入文档之前是否可以确定其高度 原因 我的任务是创建 PDF 版本的表单 这种形式允许文本输入 并且结果长度可变 一个人可以不输入任何内容 另一个人可以写几段 当权者 不希望这段文字在页面之间中断 目前
  • 何时在 django ORM 中使用或不使用 iterator()

    这是来自关于查询集的 django 文档iterator method https docs djangoproject com en dev ref models querysets django db models query Quer
  • java:Java 15 中包 jdk.incubator.foreign 不可见错误

    所以我下载了 JDK 15 OpenJDK 在Intellij中运行以下代码 import jdk incubator foreign MemorySegment The problem seems to occur here in thi
  • 将 std::multimap 转换为 std::priority_queue

    我有一个使用编写的函数std multimap正是因为std multimap 经过分析 我意识到我只使用了std multimap as a heap 所以我尝试用std priority queue它只允许堆操作 希望这种用法会更快 当
  • ASP.NET MVC - 如何让用户确认删除

    他 我有这个页面 其中表格中的每个项目旁边都有复选框 并且希望允许用户选择其中的一些项目并按我的删除按钮 我只是无法想出 jquery 来制作确认窗口并仅在按下 是 时才提交 这是我的页面 table width 100 cellpaddi
  • Fortran 77 中的字符串数组

    我有一个关于 Fortran 77 的问题 但找不到解决方案 我正在尝试存储定义如下的字符串数组 character matname 255 255 这是一个由 255 个字符串组成的数组 长度为 255 后来我从文件中读取名称列表 并像这
  • Rails 3 邮件程序不工作并且不记录任何错误

    我已经尝试了各种配置 但仍然无法在我的开发环境中从 Rails 发送电子邮件 我安装了 mailutils 以从命令行尝试此操作 它起作用了 我收到了电子邮件 当然是垃圾邮件 echo test 邮件 s 主题 电子邮件受保护 cdn cg
  • 通过 TFS 发布定义中的电子邮件批准进行持续集成

    我正在使用 Microsoft Visual Studio Team Foundation Server 版本 14 102 25423 0 作为贵公司持续集成部署的一部分 我想实现以下内容 我创建了一个发布定义 并在其下配置了两个环境 Q
  • Android意图系统背后的基本原理

    我一直在寻找对此的解释 但找不到 我在一次工作面试中被问到为什么 Android 不允许通过意图传递任何类型 我很清楚可能性 序列化 实现 Parcelable 接口 捆绑等 我想了解拒绝有意传递自定义类型 对象的决定背后的基本原理 我被引
  • 返回之前测试属性是否不为 Null

    我有以下财产 public MyType MyProperty get set 我想更改此属性 以便如果值为空 它将首先填充该值 然后返回它 但是without使用私有成员变量 例如 如果我这样做 public MyType MyPrope
  • Sympy:指数相乘而不是总和指数相乘

    我正在搜索如何告诉 SymPy 使用指数乘法而不是总和的指数 也就是说 它当前给我 exp a b 我想要得到 exp a exp b 一定有一个相当简单的方法 但我似乎找不到 你可以使用expand http docs sympy org
  • 具有可变单元格大小的 UICollectionView

    我在 UICollectionView 中单元格的大小方面遇到了一些困难 在android中 你可以轻松地 包裹 cell的大小 就像在 iOS 中一样 您有一个函数调用 GetCell 您可以决定它的大小 iOS 中的区别在于 在 UIC
  • 逐行检查列中是否存在值并逐行更新新列

    在 R 中 如何检查每行列表中的任何值 例如 2 3 或 4 是否出现在三列中的任何一列中 然后更改第四列中的该行 假设我有一个 df A B C D 1 1 1 2 1 1 3 1 1 我想写 没有for循环 如果第 n 行 A 列或 B
  • 查找给定纬度和经度坐标的州

    我有一组 900 个纬度和经度坐标 我需要一个相对简单的方法来查找这些坐标引用的 州 如果有帮助的话 数据是excel格式的 谷歌提供了一个地理编码 https developers google com maps documentatio
  • new PeerConnectionFactory() 在 android 上出现错误

    我正在尝试在 Android 上实现 WebRTC DataChannel 我想创建一个简单的对等连接对象 它将打开 DataChannel 以使用 WebRTC 通过网络发送数据 当我尝试创建 PeerConnection 对象时出现错误
  • ARG 或 ENV,在这种情况下使用哪一个?

    这可能是一个微不足道的问题 但阅读文档ARG https docs docker com engine reference builder arg and ENV https docs docker com engine reference