问题描述
正在使用Docker,但没有使用Swarm(或任何其他编排工具)来管理项目。他想知道是否有一种方法可以在不使用Swarm的情况下利用Docker Secrets。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
你可以在不使用Swarm的情况下,使用docker-compose来使用Docker Secrets。这种方法可以让你以类似于定义卷和网络的方式来定义Secrets。
以下是一个示例docker-compose.yml文件:
version: "3.7"
services:
db:
image: mariadb:10.5.2
env_file:
- ./db.env
secrets:
- rootpass
- dbpass
- mysqldb
- mysqluser
restart: always
secrets:
rootpass:
file: /tmp/root_pass
dbpass:
file: /tmp/db_pass
mysqldb:
file: /tmp/mysql_db
mysqluser:
file: /tmp/mysql_user
在上面的示例中,我们定义了一个名为db的服务,使用了mariadb:10.5.2镜像。我们使用了env_file指令来指定环境变量文件,然后使用secrets指令来指定需要使用的Secrets。在secrets部分,我们定义了rootpass、dbpass、mysqldb和mysqluser四个Secrets,并指定了它们的文件路径。
请注意,这种方法并不是真正的Secrets实现,因为Secrets文件是以明文形式存储的。如果你需要更高级的Secrets管理功能,你可能需要考虑使用Swarm或其他编排工具。
方案2
另一种方法是直接在docker-compose.yml文件中使用Secrets。以下是一个示例docker-compose.yml文件:
version: "3.9"
services:
db:
image: mariadb:10.7
secrets:
- rootpass
- dbpass
- mysqldb
- mysqluser
environment:
MARIADB_ROOT_PASSWORD_FILE: /run/secrets/rootpass
MARIADB_DATABASE_FILE: /run/secrets/mysqldb
MARIADB_USER_FILE: /run/secrets/mysqluser
MARIADB_PASSWORD_FILE: /run/secrets/dbpass
restart: unless-stopped
ports:
- '3306:3306'
secrets:
rootpass:
file: ./cf/root_pass
dbpass:
file: ./cf/db_pass
mysqldb:
file: ./cf/mysql_db
mysqluser:
file: ./cf/mysql_user
在上面的示例中,我们定义了一个名为db的服务,使用了mariadb:10.7镜像。我们使用了secrets指令来指定需要使用的Secrets,并在environment部分使用了对应的Secrets文件路径。这样,容器在启动时会自动将Secrets文件中的内容作为环境变量传递给容器。
请注意,这种方法也不是真正的Secrets实现,因为Secrets文件是以明文形式存储的。如果你需要更高级的Secrets管理功能,你可能需要考虑使用Swarm或其他编排工具。