在 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
环境变量的问题。如果问题依然存在,可以检查容器日志,查看是否有其他配置错误或权限问题。