在 docker-compose.yml 中使用 command: bash -c "sh /start.sh" 时,环境变量无法正确加载,可能是因为 .env 文件中的环境变量并没有被传递到容器内的 bash 命令执行环境中。默认情况下,docker-compose 会加载 .env 文件中的环境变量,并传递给容器,但在 command 中直接执行时,这些变量可能没有被传递到子进程。
解决方法
1. 确保 .env 文件与 docker-compose.yml 文件在同一目录
Docker Compose 默认会加载与 docker-compose.yml 文件同目录下的 .env 文件。确保 .env 文件存在且路径正确。
2. 在 docker-compose.yml 中显式传递环境变量
可以通过 environment 配置显式传递 .env 文件中的变量,或者确保 command 运行时能获取到这些变量。
示例:
env_file: 通过env_file配置项明确指定.env文件,这样可以将.env中的变量加载到容器环境中。command中使用source: 使用source /etc/profile或其他加载环境变量的方式,确保子进程能获取到环境变量。
3. 使用 entrypoint 而不是 command
在某些情况下,使用 entrypoint 可以确保容器启动时加载环境变量,特别是当需要通过脚本启动服务时。
示例:
通过 entrypoint 启动容器时,可以确保容器启动脚本中的环境变量被正确加载。
4. 检查 .env 文件格式
确保 .env 文件格式正确,且变量没有空格或其他格式错误。
示例 .env 文件:
确保 .env 中没有空格,例如 MY_VAR = value 这种格式是错误的。
5. 使用 docker-compose exec 检查环境变量
在容器启动后,可以通过 docker-compose exec 检查环境变量是否正确加载到容器中。
这将列出容器中的所有环境变量,确保 .env 文件中的变量已正确加载。
总结
为了确保在执行 command: bash -c "sh /start.sh" 时获取 .env 中的环境变量,可以通过以下方式:
- 使用
env_file显式加载.env文件。 - 在
command或entrypoint中使用source来确保变量加载。 - 确保
.env文件格式正确且路径正确。 - 使用
docker-compose exec检查环境变量。
这些方法应该能够解决无法在 command 中访问 .env 环境变量的问题。如果问题依然存在,可以检查容器日志,查看是否有其他配置错误或权限问题。
