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

这可能是一个微不足道的问题,但是为ARG和ENV阅读文档并没有把事情弄清楚。

我正在构build一个PHP-FPM容器,我想给用户启用/禁用一些扩展function。

如果可以在Dockerfile中添加条件并在构build命令上传递标志,可能会很好,但是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或任何其他function,可以启用|禁用,然后我将结束20非必要的ENV (因为Dockerfile不支持。 env文件)的定义,其唯一的目的是设置这个标志让脚本知道该怎么做,然后…

  • 这是正确的做法吗?
  • 我应该使用ENV来达到这个目的吗?

如果你有一个不同的方法来实现这个,请让我知道

从Dockerfile参考 :

  • ARG指令使用--build-arg <varname>=<value>标志定义了一个用户可以在构build时通过docker build命令向构build器传递的variables。

  • ENV指令将环境variables<key>设置为值<value>
    使用ENV设置的环境variables将在从结果图像运行容器时持久化。

所以如果你需要build立时间定制, ARG是你最好的select。
如果您需要运行时定制(使用不同设置运行相同的图像), ENV非常适合。

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

鉴于涉及的组合数量,使用ENV在运行时设置这些function是最好的。

但是你可以通

  • 用特定的ARG构build图像
  • 使用ARG作为ENV

也就是说,使用Dockerfile包括:

 ARG var ENV var=${var} 

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