Docker 在应用程序环境中使用链接容器环境变量?

Docker 在应用程序环境中使用链接容器环境变量?,docker,Docker,我有一个应用程序,它使用一个名为REDIS\u URL的环境变量。典型的REDIS\uurl是redis://172.17.0.5:6379/0。我希望能够基于容器链接填充REDIS\u 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_POR

我有一个应用程序,它使用一个名为
REDIS\u URL
的环境变量。典型的
REDIS\uurl
redis://172.17.0.5:6379/0
。我希望能够基于容器链接填充
REDIS\u 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
但根据我转义环境变量的方式,它们要么在docker运行时在我的shell中求值,要么为空(
redis://:/0
),要么作为文本字符串传递(
redis://$redis\u PORT\u 6379\u TCP\u ADDR:$redis\u PORT\u TCP\u PORT/0


如何基于conatiner链接填充我的
REDIS\u URL
应用程序环境变量?

执行
$REDIS\u PORT\u 6379\u TCP\u ADDR
$REDIS\u PORT\u 6379\u TCP\u PORT
命令时,变量未知,因此无法从主机构造它

然而,有一个解决办法。在
firehose/server
映像的
Dockerfile
中,必须有
CMD
ENTRYPOINT
指示运行映像时执行的命令。您可以在该命令周围放置一个包装器,它将构造
REDIS\u URL
变量。大概是这样的:

#!/bin/sh
export REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0"
<run command>
#/垃圾箱/垃圾箱
export REDIS_URL=“REDIS://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0”

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

让我先稍微偏离主题。如果要将env变量转换为CLI变量,可以通过在docker容器中求值该变量来避免使用包装器脚本

docker run image /bin/bash -c '/container-command $INSIDE_DOCKER'
现在,您可能会抱怨无法从容器外部使用shell变量。在这种情况下,以下技术有效:

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之外编写一个包装器,该包装器检查已发布的端口(可能与默认命令一起),并使用link命令相应地设置变量,这样您就不会依赖硬编码了。

很有意义。最后我得到了导出REDIS\u URL=${REDIS\u URL:-“REDIS://$REDIS\u PORT\u 6379\u TCP\u ADDR:$REDIS\u PORT\u 6379\u TCP\u PORT/0”},这样我就可以保留其中一个的功能。谢谢