docker-compose up不使用.env文件传递环境变量的方法及报错处理
不使用.env文件向docker-compose传递环境变量的方法
问题背景
需要确认不使用.env文件的前提下,能否通过docker-compose up命令向docker-compose.yml传递环境变量,涉及的配置片段如下:
db: container_name: mysql image: mysql:5.7 restart: always environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
执行命令MYSQL_ROOT_PASSWORD=root docker-compose up时出现如下报错:
MYSQL_ROOT_PASSWORD=root : 无法将“MYSQL_ROOT_PASSWORD=root”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,若包含路径请确认路径正确后重试。
所在位置 行:1 字符:1
- MYSQL_ROOT_PASSWORD=root docker-compose up
- CategoryInfo : ObjectNotFound: (MYSQL_ROOT_PASSWORD=root:String) [], CommandNotFoundException
- FullyQualifiedErrorId : CommandNotFoundException
结论
完全可以不依赖.env文件实现环境变量传递。上述报错和docker-compose功能无关,是当前使用的Windows PowerShell终端不支持Linux/macOS下Bash/Zsh终端原生支持的变量名=值 命令临时环境变量写法,才会提示命令不存在。
实现原理
docker-compose启动时会自动读取当前终端会话内的所有环境变量,自动替换yml配置中${变量名}格式的占位符。.env文件只是docker-compose默认自动加载环境变量的来源之一,不是强制要求的配置项。
不同终端的正确执行命令
- Linux/macOS 环境的 Bash/Zsh 终端
最初的写法可直接正常运行,设置的变量仅对本次docker-compose命令生效,不会残留到终端全局环境:MYSQL_ROOT_PASSWORD=root docker-compose up - Windows PowerShell 终端
单次命令行执行写法:$env:MYSQL_ROOT_PASSWORD="root"; docker-compose up
若需要在当前终端窗口多次执行docker-compose相关命令,可先单独赋值,变量会在终端关闭前持续生效:$env:MYSQL_ROOT_PASSWORD = "root" docker-compose up - Windows CMD 命令提示符
单次执行生效写法:set MYSQL_ROOT_PASSWORD=root && docker-compose up
内容的提问来源于stack exchange,提问作者Piotror
相关产品推荐
相关产品推荐

