2014-06-19 69 views
9

我有一个应用程序使用名为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 

但是这取决于我如何逃脱的环境变量,它们无论是在我的搬运工运行时壳评估,并为空白(redis://:/0)或作为文字字符串传递(redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0)。

如何根据conatiner链接填充我的REDIS_URL应用程序环境变量?

回答

7

$REDIS_PORT_6379_TCP_ADDR$REDIS_PORT_6379_TCP_PORT变量在执行docker run命令时未知,因此无法从主机构建它。

但是,有一种解决方法。在firehose/server图片的Dockerfile中,必须有CMDENTRYPOINT指示图像运行时执行的命令。您可以在该命令周围放置一个包装,以构建REDIS_URL变量。事情是这样的:

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

使用包装脚本作为DockerfileCMDENTRYPOINT

+1

有道理。我结束了'export REDIS_URL = $ {REDIS_URL: - “redis:// $ REDIS_PORT_6379_TCP_ADDR:$ REDIS_PORT_6379_TCP_PORT/0”}'所以我可以保留其中的任何一个的功能。谢谢! –

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命令相应地设置变量,以便不依靠硬编码任何东西。