在容器中设置ENVvariables不工作,是否在容器运行时执行“/ usr / local / bin”下的每一个?
我在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
为了构build图像并运行容器,我遵循以下步骤:
-
build立图像:
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
的值为192.168.3.1
.. 。
为什么? 容器启动时什么不运行? 为什么在run
命令中使用-e
提供的值不会覆盖该值?
更新:
我注意到,我只是复制文件并设置权限,但我没有运行它:
# 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
这可能是问题吗? 我放在/usr/local/bin
下的所有东西都是在容器启动时执行的? 如果不是这个问题,或者至less我想。
更新#2:
从@ charles-dufly的build议后,我已经修复了一些东西,但仍然无法正常工作。
现在Dockerfile看起来像:
# 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
但是没有将run
命令中的值作为-e
传递,为什么呢?
你的回购存在多个问题:
首先,在Docker文件中使用CMD时,在docker run中映像名称之后添加的命令: /bin/bash
将覆盖CMD ["/usr/local/bin/setup_php_settings"]
的CMD ["/usr/local/bin/setup_php_settings"]
。
因此你的setup_php_settings永远不会被执行! 您应该在Dockerfile中使用ENTRYPOINT iso CMD。 我在这里和这里find了很好的解释。
最后,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。 签出testing回购testing设置。
其次,在/ usr / local / bin / setup_php_settings中,应该添加
a2enmod rewrite service apache2 restart
最后,就在之前
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND`
这是为了让您的新设置应用在您的networking应用程序。
你是正确的,在/usr/local/bin
项目不会自动执行。
文件系统层次结构标准将 /usr/local
指定为具有自己的bin
, lib
,&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
…因为bar
是由RUN
命令规定的环境variables,而qux
是在CMD
命令执行时存在的环境variables。
因此,为了确保configuration环境variables,必须在CMD
执行期间读取和应用环境variables,而不是在之前的RUN
阶段。