簡體   English   中英

環境變量替換在 docker-compose 文件中不起作用

[英]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 inspectdocker exec等調試工具中將不可見,但主容器進程仍會看到它。

如果您根本無法更改圖像,您還可以配置 Compose 以傳遞來自主機環境的值

my-service:
  environment:
    - SOME_CACHE_VAR

您可以在調用 Compose 之前運行完全相同的腳本來計算值。

./entrypoint.sh docker-compose up

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM