on my github i'm creating a little fork from a debian minimal docker image.实际上是5个基于以前的软件包:
debian-base-minimal
debian-base-standard
debian-base-security
debian-base-apache
debian-base-apache-php
在debian-base-apache上,我想获取一个有效的env变量,稍后可以在docker-compose文件中定义该变量。环境应该做什么?
如果它是通过docker-compose定义的,则应在ServerName $SERVER_NAME
的末尾写上/etc/apache2/apache2.conf
以设置全局服务器名称。如果为空,则不应写入任何新行。
但是为什么当它为空时它什么也不写? Cauz在将Dockerfile构建为映像时不应包含SERVER_NAME
。
我已经尝试过类似的方法:
echo "ServerName $SERVER_NAME" >> /etc/apache2/apache2.conf
在我的040-debian-base-apache文件中。但是在构建写入的ServerName
时,cauz我没有定义值及其使用null
。如果我在Dockerfile(ENV SERVER_NAME=127.0.0.1
)中设置了默认值,则它使用127.0.0.1
构建映像,并且我无法通过变量更改127.0.0.1
,因为该变量已用值填充。 see here on GitHub with marked line
I build all the things with the following file.
在Dockerfile中定义了ENV SERVER_NAME=127.0.0.1
的建筑物的输出中(实际上不在回购中):
[...]
+ echo 'ServerName 127.0.0.1'
+ /etc/init.d/apache2 stop
Stopping Apache httpd web server: apache2.
ok.
+ /etc/init.d/apache2 start
Starting Apache httpd web server: apache2.
ok.
[...]
没关系,如果默认设置为127.0.0.1 cauz,则可以启动apache。但是我现在无法在docker-compose.yml cauz中定义它,它的硬编码为127.0.0.1,而不是变量的输出。
在没有Dockerfile中定义ENV的建筑物的输出中(实际上是回购版本):
[...]
+ echo 'ServerName '
+ /etc/init.d/apache2 stop
Stopping Apache httpd web server: apache2.
+ /etc/init.d/apache2 start
Starting Apache httpd web server: apache2 failed!
The apache2 configtest failed. ... (warning).
Output of config test was:
AH00526: Syntax error on line 228 of /etc/apache2/apache2.conf:
ServerName takes one argument, The hostname and port of the server
[...]
有人可以帮助我完成这项工作吗?很高兴了解它的工作原理。
非常感谢。
答案 0 :(得分:0)
如您所见,Dockerfile中的每个RUN命令都在docker build
时发生,尤其是文件的内容将根据运行构建时环境变量的状态进行固定。您希望它根据变量的运行时值进行更改,这意味着您需要编写一个在启动时运行的脚本才能执行此操作。
一种典型的方法是编写一个ENTRYPOINT脚本来进行首次设置。 ENTRYPOINT作为命令行参数传递给CMD(或传递给docker run
的任何命令),因此,如果它以exec "$@"
结尾,则最后要做的是启动“正常”命令。您可以在这里使用任何普通的shell脚本逻辑,所以我可以写
#!/bin/sh
if [ -n "$SERVER_NAME" ]; then
echo "ServerName $SERVER_NAME" >> /etc/apache2/apache2.conf
fi
exec "$@"
然后您可以在Dockerfile中提供它
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apachectl", "-DFOREGROUND"]
(如果可以保证文件对非Windows主机具有执行权限,则不需要chmod
。ENTRYPOINT
必须使用JSON-ish格式。如果您有其他图像在此基础上,请记住,组合的图像仅获得一个ENTRYPOINT和一个CMD;您建议的非常深的图像堆栈是非常不寻常的设置。)