在容器中设置ENV变量不起作用,是否在容器运行的“/ usr / local / bin”下执行?

时间:2016-09-23 23:23:39

标签: bash docker sed environment-variables dockerfile

我在Dockerfile中有以下定义:

# This aims to be the default value if -e is not present on the run command
ENV HOST_IP=127.0.0.1
...
COPY /container-files/etc/php.d/zz-php.ini /etc/php5/mods-available/zz-php.ini
RUN ln -s /etc/php5/mods-available/zz-php.ini /etc/php5/apache2/conf.d/zz-php.ini
COPY /container-files/init-scripts/setup_xdebug_ip.sh /usr/local/bin/setup_xdebug_ip.sh
RUN chmod +x /usr/local/bin/setup_xdebug_ip.sh
CMD ["/usr/local/bin/setup_xdebug_ip.sh", "/usr/local/bin/setup_php_settings.sh"]

这是zz-php.ini的相关定义:

; Xdebug
[Xdebug]
xdebug.remote_enable=true
xdebug.remote_host="192.168.3.1"  => this should be overwrited by HOST_IP
xdebug.remote_port="9001"
xdebug.idekey="XDEBUG_PHPSTORM"

这是脚本setup_xdebug_ip.sh

的内容
#!/usr/bin/bash

sed -i -E "s/xdebug.remote_host.*/xdebug.remote_host=$HOST_IP/" /etc/php5/apache2/conf.d/zz-php.ini

更新了脚本

我更新了脚本以查看它是为什么值没有更改但仍无法正常工作的原因。请参阅以下代码:

#!/usr/bin/bash

sed -ri "s/^xdebug.remote_host\s*=.*$//g" /etc/php5/apache2/conf.d/zz-php.ini
echo "xdebug.remote_host = $HOST_IP" >> /etc/php5/apache2/conf.d/zz-php.ini

为了构建图像并运行容器,我按照以下步骤操作:

  • 构建图片:

    docker build -t reynierpm/dev-php55 .
    
  • 运行容器:

    docker run -e HOST_IP=$(hostname -I | cut -d' ' -f1) 
               --name dev-php5 
               -it /bin/bash reynierpm/dev-php55
    

构建映像并且容器正在运行后,我打开浏览器并指向:http://container_address/index.php(包含phpinfo()),我可以看到xdebug.remote_host的值为{{ 1}} ...

为什么呢?容器启动时没有运行什么?为什么在192.168.3.1命令上使用-e提供的值不会覆盖该值?

更新

我注意到我只复制文件并设置权限,但我根本没有运行它:

run

这可能是问题吗?我放在# Copy the script for change the xdebug.remote_host value based on HOST_IP COPY /container-files/init-scripts/setup_xdebug_ip.sh /usr/local/bin/setup_xdebug_ip.sh # Execute the script RUN chmod +x /usr/local/bin/setup_xdebug_ip.sh 下的所有内容都是在容器启动时执行的?如果不是那个确定的问题或者至少我认为。

更新#2:

@ charles-dufly 的建议之后,我已经解决了一些问题,但仍然无法正常工作。

现在Dockerfile看起来像:

/usr/local/bin

构建映像后,我运行以下命令:

# This aims to be the default value if -e is not present on the run command
ENV HOST_IP=127.0.0.1
...
ADD container-files /
RUN chmod +x /usr/local/bin/setup_xdebug_ip && \
/usr/local/bin/setup_xdebug_ip && \
chmod +x /usr/local/bin/setup_php_settings && \
ln -s /etc/php5/mods-available/zz-php.ini /etc/php5/apache2/conf.d/zz-php.ini && \
ln -s /etc/php5/mods-available/zz-php-directories.ini /etc/php5/apache2/conf.d/zz-php-directories.ini && \
a2enmod rewrite

EXPOSE 80 9001

CMD ["/usr/local/bin/setup_php_settings"]

我可以看到$ docker run -e HOST_IP=192.168.3.120 -p 80:80 --name php55-img-6 -it reynierpm/php5-dev-4 /bin/bash 的值被设置为xdebug.remote_host但是没有将127.0.0.1命令传递给-e,为什么?

2 个答案:

答案 0 :(得分:2)

你的/usr/local/bin下的项目不会自动执行,这是正确的。

Filesystem Hierarchy Standard/usr/local指定为具有自己的binlib和&n; c的“三级层次结构”。子目录,相当于它们的意图和用于//usr下的同名目录,但是对于机器本地安装的内容(实际上,这意味着安装的软件没有本地发行版的包装好处)系统)。

如果要执行命令,则需要RUN直接或间接调用它。

至于随着这个问题的变化而讨论的其他事项,请考虑以下事项:

FROM alpine
ENV foo=bar
RUN echo $foo >/tmp/foo-value
CMD cat /tmp/foo-value; echo $foo

用:

调用时
docker run -e foo=qux

...这会作为输出发出:

bar
qux

...因为barRUN命令规定的环境变量,而quxCMD命令执行时存在的环境变量。

因此,为了确保在配置中遵守环境变量,必须在CMD执行期间读取和应用它,而不是在之前的RUN阶段。

答案 1 :(得分:1)

repo的多个问题:

首先在docker文件中使用CMD时,在docker run:/bin/bash中的图像名称之后添加的命令将覆盖Dockerfile中的CMD ["/usr/local/bin/setup_php_settings"]

因此你的setup_php_settings永远不会被执行! 你应该使用ENTRYPOINT i.s.o. Dockerfile中的CMD。我找到了很好的解释herehere

总之,Dockerfile改变了CMD [...]行:

ENTRYPOINT bash -C '/usr/local/bin/setup_php_settings';'bash'

然后您可以使用以下命令运行容器:

docker run -it -e HOST_IP=<your_ip_address> -e PHP_ERROR_REPORTING='E_ALL & ~E_STRICT' -p 80:80 --name dev-php5 mmi/dev-php55

最后无需添加/ bin / bash。退房test-repo进行测试设置。

其次,在你的/ usr / local / bin / setup_php_settings中,你应该添加

a2enmod rewrite
service apache2 restart

最后,就在

之前
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND`

这样可以在您的网络应用中应用新设置。