如何在 Docker Compose 中使用秘密
目录
秘密是指任何不应通过网络传输或以未加密方式存储在 Dockerfile 或应用程序源代码中的数据,例如密码、证书或 API 密钥。
Docker Compose 提供了一种使用秘密的方式,而无需使用环境变量来存储信息。如果您将密码和 API 密钥作为环境变量注入,则存在无意中暴露信息的风险。只有当在顶级 services
元素的 secrets
属性中明确授权时,服务才能访问秘密。
环境变量通常对所有进程都可用,并且难以跟踪访问。在调试错误时,它们也可能在您不知情的情况下打印在日志中。使用秘密可以减轻这些风险。
使用秘密
秘密作为文件挂载到容器内的 /run/secrets/<secret_name>
中。
将秘密添加到容器是一个两步过程。首先,使用 Compose 文件中的顶级 secrets 元素 定义秘密。接下来,更新您的服务定义,通过 secrets 属性 引用它们所需的秘密。Compose 按服务授权对秘密的访问。
与其他方法不同,这允许通过标准文件系统权限在服务容器内进行细粒度访问控制。
示例
简单
在下面的示例中,frontend 服务被授予访问 my_secret
秘密的权限。在容器中,/run/secrets/my_secret
的内容设置为文件 ./my_secret.txt
的内容。
services:
myapp:
image: myapp:latest
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
高级
services:
db:
image: mysql:latest
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_root_password
- db_password
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: db_password.txt
db_root_password:
file: db_root_password.txt
volumes:
db_data:
在上面的高级示例中
- 每个服务下的
secrets
属性定义了您想要注入特定容器的秘密。 - 顶级的
secrets
部分定义了变量db_password
和db_root_password
,并提供了填充其值的file
。 - 部署每个容器意味着 Docker 在
/run/secrets/<secret_name>
下创建临时文件系统挂载,其中包含它们的特定值。
注意
此处演示的
_FILE
环境变量是某些镜像使用的约定,包括 Docker 官方镜像,例如 mysql 和 postgres。
构建秘密
在下面的示例中,npm_token
秘密在构建时可用。其值取自 NPM_TOKEN
环境变量。
services:
myapp:
build:
secrets:
- npm_token
context: .
secrets:
npm_token:
environment: NPM_TOKEN