2014-06-19 65 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命令相應地設置變量,以便不依靠硬編碼任何東西。