Bash 容器中的Set ENV变量不工作,是否每个都在“下”/usr/local/bin“;在容器运行时执行?

Bash 容器中的Set ENV变量不工作,是否每个都在“下”/usr/local/bin“;在容器运行时执行?,bash,docker,sed,environment-variables,dockerfile,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 /et

我在
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"
这是脚本
设置\u xdebug\u 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\u 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
下的所有内容都是在容器启动时执行的?如果不是,那肯定是问题所在,至少我认为是这样

更新#2:

根据查尔斯·杜弗利的建议,我已经解决了一些问题,但仍然没有奏效

现在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
,为什么?

您是正确的,
/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
命令设置的环境变量,而
qux
是执行
CMD
命令时存在的环境变量


因此,为了确保环境变量在配置中得到尊重,必须在执行
CMD
期间读取和应用环境变量,而不是在先前的
运行
阶段。

您的环境变量存在多个问题:

首先,在docker文件中使用CMD时,在docker运行中的映像名称之后添加的命令:
/bin/bash
将覆盖docker文件中的
CMD[“/usr/local/bin/setup\u php\u settings”]

因此,您的设置\u php\u设置永远不会执行! 您应该在Dockerfile中使用ENTRYPOINT i.s.o.CMD。我找到了很好的解释和建议

总之,对于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
最后,就在之前

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

这是为了在web应用程序中应用新设置。

好吧,我不是Docker专家,但是如果您希望
运行chmod…
行来执行脚本,我很确定它不会这样做。看起来它只会设置权限。正在尝试添加另一行,
RUN/usr/local/bin/setup\u xdebug\u ip.sh
,但
/usr/local/bin
中的内容从未自动执行。在任何Linux发行版上都没有,因为,
/usr/local/bin
是本地添加的地方,相当于
/usr/bin
,没有人会自动执行
/usr/bin
@CharlesDuffy下的所有内容,这是有意义的,这也是我所关心的,我将尝试添加一个
CMD
RUN
命令,当我有话要说它有效或无效时会回来,看看我对OP所做的更新(第一个代码示例的最后一行是
CMD
),假设该命令将运行文件,对吗?结果与OP中的结果相同,值设置不正确。当前命令没有意义。将
“/usr/local/bin/setup\u php\u settings.sh”
作为参数传递给
“/usr/local/bin/setup\u xdebug\u ip.sh”
不会执行前者,因为后者从不查看其参数,更不用说尝试将该参数作为命令执行。使用
运行
,而不是
CMD
数组条目,以获取作为先决条件运行的其他脚本。并考虑使用<代码> SET-X/CODE >(如通过让你的SeBuff[Case> Suff./Ur/Bi/EnvBasH-X/Cuth>)来记录你的脚本实际上在做什么。移动你想在运行时被环境变量设置为你的<代码> StUpUpPHPB设置脚本的更新。你的
RUN
s不会在每次调用时都重新执行,而
CMD
的内容则会重新执行。顺便说一句,拥有赏金会让人们在正常的站点规则上有很大的回旋余地,但在通常情况下是“变色龙问题”(从最初提出的问题转变为第一个问题解决后遇到的新问题)是相当不受欢迎的。这就像一个符咒,非常感谢您花时间检查这些错误并提出建议一个问题,在容器内并从
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND`