如何用docker-compose v3.1来管理秘密值
简介
作为开发人员,我们经常需要在我们的应用程序中加入私人数据,包括密码、API密钥和数据库凭证。将这些变量硬编码到我们的代码或配置文件中不仅不安全,而且在必要时管理和改变它们也是一种挑战。
使用环境变量,让我们把敏感数据与我们的代码库和配置文件分开,是管理秘密值的一种方法。在这篇文章中,我们将看看如何使用docker-compose v3.1维护秘密值,并将其作为环境变量注入我们的容器中。
先决条件
要继续学习本教程,你需要在你的机器上安装Docker和docker-compose v3.1。
$ docker --version
$ docker-compose --version
方法
我们可以用几种方法来管理docker-compose v3.1的秘密值。
其中一些方法包括以下几点
- 使用环境变量
-
使用.env文件
现在让我们结合实例来详细讨论这些问题。
使用环境变量
用docker-compose v3.1来管理秘密值的一种方法是使用环境变量。环境变量是在运行时传递给容器的键-值对。它们可以在docker-compose文件中设置,也可以从主机上传入。
示例 1
要在docker-compose文件中设置一个环境变量,我们可以使用我们要设置变量的服务下的环境键。
第1步 – 在代码编辑器中导航到你的项目目录。
对于使用你的终端导航,使用以下命令—-。
$cd /directory-path
第2步 – 在你的docker-compose.yml文件中,指定我们要设置变量的服务下的环境键。
version: "3.1"
services:
web:
image: nginx:latest
ports:
- 8080:80
environment:
- API_KEY=123456
第3步 – 在同一目录下添加相应的名为 “Dockerfile “的Docker文件,不包含以下内容—-。
FROM nginx:latest
EXPOSE 80
ENV API_KEY=123456
第4步 – 现在通过在终端运行以下命令来运行和构建这个docker-compose —
$docker-compose up
输出
[+] Running 1/1
- Container examp2-web-1 Recreated 0.9s
Attaching to examp2-web-1
examp2-web-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
examp2-web-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
examp2-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
…
examp2-web-1 | 2023/01/09 17:53:54 [notice] 1#1: start worker process 38
examp2-web-1 | 2023/01/09 17:53:54 [notice] 1#1: start worker process 39
examp2-web-1 | 2023/01/09 17:53:54 [notice] 1#1: start worker process 40
使用.env文件
用docker-compose v3.1来管理秘密值的另一种方法是使用.env文件。.env文件是一个包含键值对列表的文件,在运行时传递给容器。docker-compose文件和.env文件必须都在同一个目录下。
第1步 – 在代码编辑器中导航到你的项目目录。
第2步 – 在你的项目目录下创建一个名为.env的文件。
第3步 – 为了在docker-compose v3.1中使用.env文件,我们可以使用api key命令在.env文件中设置环境变量,像这样 –
API_KEY=123456
第4步 – 使用以下命令在终端运行.env文件。
$ cat .env
输出
API_KEY=123456
第5步 – 在同一目录下创建一个docker-compose.yml文件,然后使用${VAR_NAME}语法引用这些环境变量–
version: "3.1"
services:
web:
image: nginx:latest
ports:
- 8080:80
environment:
- API_KEY=${API_KEY}
第6步 – 在终端使用以下命令来输出docker-compose.yml文件的内容 –
$ cat docker-compose.yml
输出
For Output Code pre classversion: "3.1"
services:
web:
environment:
- API_KEY=${API_KEY}
第7步 – 在终端中使用终端运行这个文件——。
$ docker-compose up
输出
[+] Running 1/0
- Container examp2-web-1 Created 0.0s
Attaching to examp2-web-1
examp2-web-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
examp2-web-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
examp2-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
examp2-web-1 | 10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled
examp2-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
examp2-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
examp2-web-1 | /docker-entrypoint.sh: Configuration complete; ready for start up
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: using the "epoll" event method
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: nginx/1.23.3
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: OS: Linux
…
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: start worker process 29
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: start worker process 30
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: start worker process 31
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: start worker process 32
examp2-web-1 | 2023/01/09 18:04:52 [notice] 1#1: start worker process 33
结论
在这篇文章中,我们已经探讨了用docker-compose v3.1管理秘密值的几种方法。我们可以使用环境变量、.env文件和Docker秘密,以安全的方式存储和管理敏感数据。我们还看了各种例子来实现同样的功能。通过使用这些方法,我们可以避免在代码库中以纯文本形式存储秘密值,并减少安全漏洞的风险。