Docker Compose环境变量插值格式错误,如何传递AWS密钥变量?
解决Docker Compose环境变量插值格式无效的问题
这个报错是因为Docker Compose默认使用${VAR}语法进行变量插值,而你写的$(aws ...)是shell的命令替换语法,Compose会把它当成无效的插值格式来处理,所以抛出了错误。下面给你几种靠谱的解决方法:
方法1:先导出环境变量,再在Compose中引用
先在你的shell里执行这两条命令,把AWS密钥导出为当前会话的环境变量:
export AWS_ACCESS_KEY_ID=$(aws --profile default configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws --profile default configure get aws_secret_access_key)
然后修改你的docker-compose.yml,直接引用这些环境变量即可:
environment: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY
Compose会自动读取当前shell中已存在的同名环境变量,传递给容器。
方法2:使用.env文件传递变量
先通过shell命令生成一个临时的.env文件(注意不要把这个文件提交到版本控制,记得加到.gitignore里):
cat > .env <<EOF AWS_ACCESS_KEY_ID=$(aws --profile default configure get aws_access_key_id) AWS_SECRET_ACCESS_KEY=$(aws --profile default configure get aws_secret_access_key) EOF
然后在docker-compose.yml中引用这个文件:
env_file: - .env
或者也可以在environment里显式引用.env中的变量:
environment: - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
方法3:运行Compose时直接通过命令行传递变量
如果你不想修改配置文件,也可以在启动容器时直接用-e参数传递变量:
docker-compose up -d \ -e AWS_ACCESS_KEY_ID=$(aws --profile default configure get aws_access_key_id) \ -e AWS_SECRET_ACCESS_KEY=$(aws --profile default configure get aws_secret_access_key)
如果是用docker-compose run执行一次性命令,同样可以用-e参数。
方法4:修改Compose的插值分隔符(不推荐)
如果一定要在docker-compose.yml中直接写$(aws ...),可以修改Compose的变量插值分隔符,让它忽略$(...)的解析:
version: '3.8' services: your-service-name: # 其他配置... environment: - AWS_ACCESS_KEY_ID=$(aws --profile default configure get aws_access_key_id) - AWS_SECRET_ACCESS_KEY=$(aws --profile default configure get aws_secret_access_key) interpolation: variable_start_string: '[[' variable_end_string: ']]'
不过这个方法需要你的Docker Compose版本支持interpolation配置(一般是较新版本),而且会改变整个Compose文件的变量引用方式,所以除非必要,不建议使用。
另外要注意:AWS密钥属于敏感信息,绝对不要把包含密钥的.env文件或者docker-compose.yml提交到公共代码仓库里,一定要做好保密措施。
内容的提问来源于stack exchange,提问作者FrancMo
相关产品推荐
相关产品推荐

