如何使用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 文件中设置环境变量,我们可以在我们要设置变量的服务下使用 `environment` 键。
步骤 1 - 在您的代码编辑器中导航到您的项目目录。
要使用终端导航,请使用以下命令:
$cd /directory-path
步骤 2 - 在您的 `docker-compose.yml` 文件中,在我们要设置变量的服务下指定 `environment` 键。
version: "3.1" services: web: image: nginx:latest ports: - 8080:80 environment: - API_KEY=123456
步骤 3 - 在同一目录中添加名为“Dockerfile”的相应 Dockerfile,其中不包含以下内容:
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 - 要将 .env 文件与 docker-compose v3.1 一起使用,我们可以使用 `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 密钥以安全的方式存储和管理敏感数据。我们还查看了各种实现示例。通过使用这些方法,我们可以避免在代码库中以纯文本形式存储密钥值,并降低安全漏洞的风险。