[英]Environment variable substitution doesn't work in docker-compose file
想象一下我們有這樣的 .env 文件:
VAR_A=300
VAR_B=$(($VAR_A/100))
VAR_MEM=$((50*$VAR_B))M
我的 docker-compose 文件這樣使用它:
my-service:
environment:
SOME_CACHE_VAR: ${VAR_MEM:-100M}
當我運行 docker-compose 時,它給了我一個錯誤:
docker.errors.DockerException: Failed converting the string value for memory ($((50*$VAR_B))) to an integer.
所以,它似乎根本不能替代變量。 那我該怎么做呢?
如果實際計算是固定的並且只有一個可配置的值,您可以在容器內進行計算,而不是嘗試在 Compose 級別進行設置。 編寫一個 shell 腳本來計算這些值,然后啟動主容器進程:
#!/bin/sh
if [ -n "$VAR_A" ]; then
VAR_B=$(($VAR_A/100))
SOME_CACHE_VAR=$((50*$VAR_B))M
else
SOME_CACHE_VAR=100M
fi
export SOME_CACHE_VAR
exec "$@"
將此腳本復制到您的圖像中,並使其成為圖像的入口點。
COPY entrypoint.sh ./
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD (as before)
現在,當您運行容器時,您需要提供$VAR_A
,但不需要提供任何派生變量。 圖像的CMD
或您使用 Compose command:
將在正確計算$SOME_CACHE_VAR
的情況下運行。
docker run --rm -e VAR_A=1000 my-image sh -c 'echo $SOME_CACHE_VAR'
# Should print "500M"
計算值在docker inspect
或docker exec
等調試工具中將不可見,但主容器進程仍會看到它。
如果您根本無法更改圖像,您還可以配置 Compose 以傳遞來自主機環境的值
my-service:
environment:
- SOME_CACHE_VAR
您可以在調用 Compose 之前運行完全相同的腳本來計算值。
./entrypoint.sh docker-compose up
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.