如何在docker-compose.yml中使用动态生成的值?解决插值格式报错
解决Docker Compose传递命令执行结果的问题
你的判断没错,Docker Compose的${}语法只会读取环境变量值,不会执行shell命令,所以${id -u}会被当成包含空格的变量名,导致格式错误。以下是几种可行的解决方法:
方法1:临时导出环境变量后运行
在执行docker-compose前,先通过shell命令获取值并导出为环境变量:
export HOST_UID=$(id -u) export HOST_GID=$(id -g) export HOST_USER=$(whoami) docker-compose up --build
也可以合并为一行命令,避免污染当前shell环境:
HOST_UID=$(id -u) HOST_GID=$(id -g) HOST_USER=$(whoami) docker-compose up --build
方法2:动态生成.env文件
Docker Compose会自动读取当前目录下.env文件中的变量。可以先动态生成这个文件,再运行容器:
# 生成.env文件 cat > .env <<EOF HOST_UID=$(id -u) HOST_GID=$(id -g) HOST_USER=$(whoami) EOF # 启动容器 docker-compose up --build
如果不需要保留.env文件,执行完可删除:
rm .env
补充说明
- 无论用哪种方法,传递的变量都会被Docker Compose正确解析后作为build args传入Dockerfile,你的
RUN useradd $HOST_USER -u $HOST_UID命令可以正常工作。 - Docker Compose本身不支持在yaml配置中直接执行shell命令,所有动态值都需要通过shell环境传递。
内容的提问来源于stack exchange,提问作者netdjw
相关产品推荐
相关产品推荐

