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 运行时能获取到这些变量。

示例:
yaml
version: "3.8" services: app: image: your_image env_file: - .env # 显式加载 .env 文件 command: bash -c "source /etc/profile && sh /start.sh" # 加载环境变量
  • env_file: 通过 env_file 配置项明确指定 .env 文件,这样可以将 .env 中的变量加载到容器环境中。
  • command 中使用 source: 使用 source /etc/profile 或其他加载环境变量的方式,确保子进程能获取到环境变量。

3. 使用 entrypoint 而不是 command

在某些情况下,使用 entrypoint 可以确保容器启动时加载环境变量,特别是当需要通过脚本启动服务时。

示例:
yaml
version: "3.8" services: app: image: your_image env_file: - .env entrypoint: /bin/bash -c "source /start.sh"

通过 entrypoint 启动容器时,可以确保容器启动脚本中的环境变量被正确加载。

4. 检查 .env 文件格式

确保 .env 文件格式正确,且变量没有空格或其他格式错误。

示例 .env 文件

env
MY_VAR=value ANOTHER_VAR=another_value

确保 .env 中没有空格,例如 MY_VAR = value 这种格式是错误的。

5. 使用 docker-compose exec 检查环境变量

在容器启动后,可以通过 docker-compose exec 检查环境变量是否正确加载到容器中。

bash
docker-compose exec app env

这将列出容器中的所有环境变量,确保 .env 文件中的变量已正确加载。


总结

为了确保在执行 command: bash -c "sh /start.sh" 时获取 .env 中的环境变量,可以通过以下方式:

  1. 使用 env_file 显式加载 .env 文件。
  2. commandentrypoint 中使用 source 来确保变量加载。
  3. 确保 .env 文件格式正确且路径正确。
  4. 使用 docker-compose exec 检查环境变量。

这些方法应该能够解决无法在 command 中访问 .env 环境变量的问题。如果问题依然存在,可以检查容器日志,查看是否有其他配置错误或权限问题。

点赞(366) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部