2017-01-29 47 views
42

这可能是一个微不足道的问题,但是阅读ARGENV的文档并不会让事情变得清晰。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 "[email protected]" 

这是怎么了我的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吗?

我打开的想法,如果你有一个不同的方法为实现这一目标,请让我知道

+0

如果这些扩展名/功能在构建时与另一个不同,那么你应该使用'ARG'来为它们设置不同的值,每个构建都使用'--build-arg',并且你仍然可以在Dockerfile中使用默认值。如果你使用'ENV',你需要为每个版本编辑Dockerfile来设置不同的值 –

回答

85

Dockerfile reference约:

  • ARG指令定义一个变量,用户可以通过docker build命令使用--build-arg <varname>=<value>标志在构建时传递给构建器。

  • ENV指令环境变量<key>设置为值<value>
    从结果图像运行容器时,使用ENV设置的环境变量将保持不变。

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

如果我想补充假设扩展或任何其他保护功能,可实现20个(随机数)|禁用

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

,但你可以combine both通过:

  • 建立使用与特定ARG
  • 一个形象,ARG作为ENV

也就是说,具有Dockerfile包括:

ARG var 
ENV var=${var} 

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

+0

很好,但是那些'ARG'可以从我在容器启动时运行的脚本访问?如果是这样如何?你可以通过添加一个关于如何从bash脚本访问这些文件的小例子来改进你的答案吗? – ReynierPM

+0

@ReynierPM你可以通过在你的Dockerfile(构建时间)中声明* ADD *的* ARG','ENV var = $ {var}':参见http://stackoverflow.com/a/33936014/6309 。同时使用。 – VonC

+0

如果我使用你的方法,那么无论我在容器启动时将最终产生一个'var' ENV变量,我是对的?否则我根本没有跟踪你。请记住:脚本从本地文件夹复制到容器,并在容器初始化时使用,这就是为什么我使用ENV而不是ARG,因为我不知道容器何时启动ARG仍然活着,并且可以从内部访问一个bash脚本。 – ReynierPM

相关问题