这可能是一个微不足道的问题,但阅读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样子:
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
如果您有不同的方法来实现这一点,我愿意接受想法,请让我知道
从Dockerfile 参考:
该ARG指令定义了一个变量,用户可以在构建时使用该--build-arg <varname>=<value>标志通过 docker build 命令将其传递给构建器。 该ENV指令将环境变量<key>设置为 value <value>。当容器从生成的图像运行时, 使用设置的环境变量将保持不变。ENV
该ARG指令定义了一个变量,用户可以在构建时使用该--build-arg <varname>=<value>标志通过 docker build 命令将其传递给构建器。
ARG
--build-arg <varname>=<value>
该ENV指令将环境变量<key>设置为 value <value>。当容器从生成的图像运行时, 使用设置的环境变量将保持不变。ENV
<key>
<value>
所以如果您需要 构建时 定制,ARG是您的最佳选择。 如果您需要运行时自定义(以不同的设置运行相同的图像),ENV非常适合。
如果我想添加 20 个(随机数)扩展或任何其他可以启用|禁用的功能
考虑到所涉及的组合数量,ENV最好在这里使用在运行时设置这些功能。
但是您可以通过以下方式将两者结合起来:
也就是说,使用 Dockerfile 包括:
ARG var ENV var=${var}
然后,您可以在构建时构建具有特定var值的映像 ( docker build --build-arg var=xxx),或者运行具有特定运行时值 ( docker run -e var=yyy)的容器
var
docker build --build-arg var=xxx
docker run -e var=yyy