如何在 Docker Compose 中使用密钥
目录
密钥是任何类型的數據,例如密码、证书或 API 密钥,不应通过网络传输或以未加密的方式存储在 Dockerfile 或应用程序的源代码中。
Docker Compose 提供了一种无需使用环境变量存储信息即可使用密钥的方法。如果您将密码和 API 密钥作为环境变量注入,则存在无意中暴露信息的风。服务只有在 `services` 顶级元素内的 `secrets` 属性显式授予权限时才能访问密钥。
环境变量通常对所有进程可用,并且难以跟踪访问。在调试错误时,它们还可能在您不知情的情况下打印在日志中。使用密钥可以降低这些风险。
使用密钥
将密钥放入容器是一个两步过程。首先,使用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/
` 下创建一个具有其特定值的临时文件系统挂载。
注意
此处演示的 `_FILE` 环境变量是某些镜像(包括像mysql 和 postgres 等 Docker 官方镜像使用的约定。
构建密钥
在以下示例中,`npm_token` 密钥在构建时可用。其值取自 `NPM_TOKEN` 环境变量。
services:
myapp:
build:
secrets:
- npm_token
context: .
secrets:
npm_token:
environment: NPM_TOKEN