docker - 环境变量替换在 docker-compose 文件中不起作用
问题描述
想象一下我们有这样的 .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
计算值在or等调试工具中不可见docker exec
,但主容器进程仍会看到它。
如果您根本无法更改图像,您还可以配置 Compose 以传递来自主机环境的值
my-service:
environment:
- SOME_CACHE_VAR
您可以在调用 Compose 之前运行完全相同的脚本来计算值。
./entrypoint.sh docker-compose up
推荐阅读
- javascript - 在使用保存之前,我应该在 Mongoose 中验证唯一性吗?
- spring-boot - 调用 [asyncError()] 对具有异步状态 [MUST_DISPATCH] 的请求无效
- sql - Impala - 从一张表计算百分比
- java - 从 Google Cloud pub/sub 反序列化 JSON 并保留 UTF-8 编码
- ios - 目标函数未被调用 UIButton
- mysql - 无法连接本地 MySql
- webpack - 如何使用 webpack 跟踪对 html 的更改?
- python - 正则表达式在 SQL 中获取值
- reactjs - 在 React 中使用 refs 和 portals 从子级渲染到父级
- mysql - 如何检查用户在文本框中输入的用户名和密码是否与数据库中的记录匹配