我有一个使用名为REDIS_URL
的环境变量的应用程序。典型的REDIS_URL
将是redis://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
但是根据我如何逃避环境变量,它们要么在我的shell中在docker运行时进行评估,并且是空白的(redis://:/0
),要么作为文字字符串(redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0
)传递。
如何根据conatiner链接填充我的REDIS_URL
应用程序环境变量?
答案 0 :(得分:7)
执行$REDIS_PORT_6379_TCP_ADDR
命令时,$REDIS_PORT_6379_TCP_PORT
和docker run
变量未知,因此无法从主机构造它。
但是,有一种解决方法。在Dockerfile
映像的firehose/server
中,必须有CMD
或ENTRYPOINT
来指示运行映像时执行的命令。您可以在该命令周围放置一个包装器来构造REDIS_URL
变量。像这样:
#!/bin/sh
export REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0"
<run command>
将包装器脚本用作CMD
中的ENTRYPOINT
或Dockerfile
。
答案 1 :(得分:2)
首先让我略微偏离主题。如果要将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命令相应地设置变量,这样就不会依赖于硬编码。