在容器中设置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指定为具有自己的binlib ,&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阶段。