在应用环境中使用链接的容器环境variables?

我有一个应用程序使用名为REDIS_URL的环境variables。 典型的REDIS_URLredis://172.17.0.5:6379/0 。 我想能够基于容器链接填充REDIS_URL

 docker run --name redis -d redis docker run --name firehose --link redis:redis -e REDIS_URL="redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0" -d firehose/server 

但取决于我如何转义环境variables,它们要么在我的shell在docker运行时进行评估,而是空白( redis://:/0 ),或者作为文字string传递( redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0 )。

我怎样才能填充我的REDIS_URL应用程序环境variables基于conatiner链接?

执行$REDIS_PORT_6379_TCP_ADDR docker run命令时, $REDIS_PORT_6379_TCP_ADDR$REDIS_PORT_6379_TCP_PORTvariables是未知的,因此无法从主机构build它。

但是,有一个解决方法。 在Dockerfile firehose/server映像的ENTRYPOINT ,必须有一个CMDENTRYPOINT来指示运行映像时执行的命令。 你可以在该命令的周围放置一个包装器来构buildREDIS_URLvariables。 像这样的东西:

 #!/bin/sh export REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0" <run command> 

使用包装器脚本作为ENTRYPOINT中的CMDDockerfile

首先,让我稍微偏离主题。 如果要将envvariables转换为CLIvariables,则可以通过评估Docker容器中的variables来避免包装脚本。

 docker run image /bin/bash -c '/container-command $INSIDE_DOCKER' 

现在,您可能会抱怨无法使用容器外部的shellvariables。 以下技术适用于这种情况:

 docker run image /bin/bash -c "/container-command $OUTSIDE_DOCKER \$INSIDE_DOCKER" 

回到原来的问题。 如果您不使用Dockerfile中的默认命令,而是指定它,则可以使用相同的方法。

 docker run image /bin/bash -c "export FOO=\${INSIDE_DOCKER}; echo \$FOO" 

在你的情况下,对容器内的包装器的潜在优点是容器内的包装器被硬编码为一个端口和一个链接名称。 应该有一种方法可以在Docker之外编写一个检查已发布端口的包装器(可能还有默认命令),并用链接命令设置相应的variables,这样就不会依赖任何硬编码。