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

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

贺高杰
2023-03-14

这可能是一个微不足道的问题,但是阅读ARG和ENV的文档并没有让我明白。

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

如果可以在Dockerfile中通过在构建命令上添加条件和传递标志来实现这一点,那就太好了,但是不支持AFAIK。

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

#!/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

我愿意听取意见,如果你有不同的方法来实现这一点,请让我知道

共有2个答案

江佐
2023-03-14

因此,如果希望为每个构建将环境变量的值设置为不同的值,那么我们可以在构建期间传递这些值,而无需每次更改docker文件。

ENV,一旦设置,就不能通过命令行值覆盖。因此,如果我们希望环境变量对于不同的构建具有不同的值,那么我们可以使用ARG并在docker文件中设置默认值。当我们想要覆盖这些值时,我们可以在每次构建时使用--build args来覆盖这些值,而无需更改docker文件。

有关更多详细信息,请参阅此。

宇文鸣
2023-03-14

从Dockerfile引用:

>

ENV指令设置环境变量

因此,如果您需要构建时定制,ARG是您的最佳选择。
如果您需要运行时定制(以不同的设置运行相同的映像),ENV非常适合。

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

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

但您可以通过以下方式将两者结合起来:

  • 使用特定的ARG
  • 将该ARG用作ENV

也就是说,Dockerfile包括:

ARG var
ENV var=${var}

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

 类似资料:
  • 问题内容: 这可能是一个琐碎的问题,但阅读ARG和ENV的文档对我而言并不清楚。 我正在构建一个PHP-FPM容器,我想提供启用/禁用某些用户需求扩展的功能。 如果可以在Dockerfile中通过添加条件并在build命令上传递标志来做到这一点,那就太好了,但不支持AFAIK。 就我而言,我的个人方法是在容器启动时运行一个小的脚本,如下所示: 这是我的样子: 如果您需要深入了解我的工作方式,那么这

  • 在哪种情况下会发生这种情况?

  • 问题内容: 我是T-SQL命令的新手,所以我在SQL逻辑中找到了一个可以使用它并想要对其进行测试的地方,但无法弄清楚我应该如何使用它: 请提出正确的用法。谢谢! 问题答案: 您在帮助中了吗?这是一个简单的例子:

  • 事件处理程序添加到GameGui.java类的GridPane中,从第82行开始。 基本上,我试图找到您在网格窗格中拖动这个对象的任何节点的索引。通过将SetonMouseEnter应用到gridpane中的每个节点,我可以在不拖动的情况下完成这一任务,但是当我试图利用SetonMouseDragEnter时,我什么也没有得到。 有人有办法让这个工作吗? 这些是我应用于GridPane中节点的事件

  • 这是我的建筑。格雷德尔: 我试图找出问题所在,使用以下代码来分析问题: 结果是:

  • 我在使用fs.readfile进行同步时遇到了一个问题,他们没有在第一次初始化,如果我再次尝试请求,那么我就有结果了。我知道我可以用promise和我从Kriskowal找到一些有用的东西。我试过但没有成功。我不太明白如何实施它。如果有人能帮忙,我将永远感激。 代码: