Docker容器运行时无法找到/run/secrets中的机密问题排查
问题解答
为什么docker run看不到/run/secrets?
Docker Compose的**运行时机密(run-time secrets)**是编排层提供的功能,不属于镜像本身:
docker compose build只负责构建镜像,不会处理compose.yml里的运行时挂载、secret这类编排配置- 直接用
docker run启动镜像时,完全没加载Compose文件里的secret挂载规则,自然不会生成/run/secrets目录和对应机密文件
你之前把secrets嵌套在build块里能在构建阶段访问,那是Compose的构建阶段机密(build secrets),专门给镜像构建过程用的,和运行时机密是两码事。
docker compose up比docker compose build多做了哪些操作?
docker compose build仅聚焦于镜像构建,而docker compose up是完整的服务编排启动流程,额外做了这些事:
- 自动检查服务依赖的镜像:如果镜像未构建/需要更新,会先触发
docker compose build - 创建并管理专属Docker桥接网络(默认以项目目录名命名),让同一Compose下的服务能通过服务名互相访问
- 根据compose.yml配置,为容器挂载运行时资源:包括secrets、configs、volumes
- 配置容器的环境变量、端口映射、重启策略、资源限制等参数
- 按照
depends_on定义的依赖顺序启动容器 - 监控容器运行状态,统一聚合容器日志
- 管理服务的生命周期(比如停止、重启、扩容)
适配GCE实例模板的解决方案
GCE实例模板是直接基于Docker镜像启动容器,没法直接复用Compose的编排配置,得换GCP原生的机密管理方式:
- 把机密存储到GCP Secret Manager中
- 给GCE实例配置对应的IAM权限,让实例能访问Secret Manager
- 在实例的启动脚本里,拉取机密到实例本地(比如
/opt/secrets/service_account_key) - 启动容器时,用
docker run -v /opt/secrets/service_account_key:/run/secrets/service_account_key your-image,把本地机密文件挂载到容器指定路径
注意:绝对不要把机密打包进镜像,哪怕是构建阶段临时用的,都有泄露风险。
内容的提问来源于stack exchange,提问作者Rob Lyndon
相关产品推荐
相关产品推荐

