Rey*_*rPM 95 arguments environment-variables docker dockerfile
这可能是一个微不足道的问题,但阅读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 "$@"
Run Code Online (Sandbox Code Playgroud)
这是我的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
Run Code Online (Sandbox Code Playgroud)
如果您需要深入了解以了解我的工作方式,这是整个存储库
目前这是有效但...如果我想添加让我们说20(随机数)的扩展或任何其他可以启用|禁用的功能,那么我将以20非必要结束ENV(因为Dockerfile不支持.env文件)定义,其唯一目的是设置此标志,让脚本知道该怎么做...
ENV用于此目的吗?如果您有不同的方法来实现这一点,我愿意接受我的想法,请让我知道
Von*_*onC 173
该
ARG指令定义了一个变量,用户可以使用--build-arg <varname>=<value>标志使用docker build命令在构建时将该变量传递给构建器.该
ENV指令将环境变量<key>设置为该值<value>.当从生成的图像运行容器时,
使用的环境变量ENV将保持不变.
因此,如果您需要构建时自定义,那么这ARG是您的最佳选择.
如果您需要运行时自定义(使用不同的设置运行相同的图像),ENV则非常适合.
如果我想添加让我们说20(随机数)的扩展名或任何其他可以启用的功能
考虑到所涉及的组合数量,使用ENV在运行时设置这些功能最好.
但你可以将两者结合起来:
ARGARG作为ENV也就是说,使用Dockerfile包括:
ARG var
ENV var=${var}
Run Code Online (Sandbox Code Playgroud)
然后,您可以var在build-time(docker build --build-arg var=xxx)构建具有特定值的图像,或者运行具有特定运行时值的容器(docker run -e var=yyy)
一根额外的绊线:如果在 FROM 子句之前和之下使用 ARG 默认值,则需要重复定义。所以而不是
ARG var1=default1
FROM your_base:${var1}
ENV var1=${var1} # <- this will fail!; the ARG var1 default is empty
Run Code Online (Sandbox Code Playgroud)
你需要
ARG var1=default1
FROM your_base:${var1}
ARG var1=default1
ENV var1=${var1} # <- this works
Run Code Online (Sandbox Code Playgroud)
请注意,您必须手动/显式地将默认值(示例中的 default1)设置为两次相同的值。您可以在 FROM 语句之前/之后为 ARG 变量设置两个不同的默认值。
| 归档时间: |
|
| 查看次数: |
73651 次 |
| 最近记录: |