Docker / Compose:定义和使用env变量

时间:2019-02-02 10:40:35

标签: apache docker debian

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 
[...]

有人可以帮助我完成这项工作吗?很高兴了解它的工作原理。

非常感谢。

1 个答案:

答案 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主机具有执行权限,则不需要chmodENTRYPOINT必须使用JSON-ish格式。如果您有其他图像在此基础上,请记住,组合的图像仅获得一个ENTRYPOINT和一个CMD;您建议的非常深的图像堆栈是非常不寻常的设置。)