向Docker传递秘密

向Docker传递秘密,docker,maven,docker-compose,Docker,Maven,Docker Compose,我有一个工件库(设置在GitLab上),下载工件时会受到一个秘密令牌的保护。当我尝试在Docker映像中构建依赖于下载工件的项目时,它无法下载工件,因为它没有一个带有秘密令牌的设置文件来访问存储库服务器 我的设置 我个人本地mavensettings.xml中的服务器 我的gitlab maven注册表 部署令牌 假部署令牌值 我的项目的pom.xml 真的 我的gitlab maven注册表 主Maven存储库 https://gitlab.com/api/v4/projects/123

我有一个工件库(设置在GitLab上),下载工件时会受到一个秘密令牌的保护。当我尝试在Docker映像中构建依赖于下载工件的项目时,它无法下载工件,因为它没有一个带有秘密令牌的设置文件来访问存储库服务器

我的设置

我个人本地maven
settings.xml中的服务器


我的gitlab maven注册表
部署令牌
假部署令牌值
我的项目的
pom.xml


真的
我的gitlab maven注册表
主Maven存储库
https://gitlab.com/api/v4/projects/1234567/packages/maven
我的项目的(简化)
Dockerfile
(运行
mvn包时失败)

来自maven:3.6.3-openjdk-15-slim-AS-build
复制src/home/app/src
复制pom.xml/home/app
运行mvn-f/home/app/pom.xml干净包-DskipTests
我的项目(简化)
docker compose.yml

版本:“3”
服务:
我的应用程序:
容器名称:我的应用程序
生成:。
端口:
- 8080:8080
我知道一个可能的解决方案是将我的本地设置(带有绝对路径)复制到Docker映像中,但考虑到我希望此项目由多台计算机上的多人使用,我希望有一种方法将设置或秘密令牌传递给Docker映像;因此,我基本上希望任何拥有秘密令牌的人都能够进行某种简单的配置,以便能够构建Docker映像--我希望避免将秘密令牌实际上载到版本控制的最简单解决方案

我的问题

那么,对于将用户的maven设置或秘密令牌传递给docker映像,我有哪些可能实现通用解决方案的方法呢

我对解决方案的想法

一种可能的选择是使用环境变量来保存秘密令牌,类似于GitLab CI所使用的方法:


${env.CI_JOB_TOKEN}

但是,如果使用环境变量,我真的不知道在运行
docker compose up
时如何将环境变量传递给服务,而不在
docker compose.yml

中对环境变量进行硬编码,正如您所说的,我将使用环境变量

${env.YOUR_TOKEN}
在您的Dockerfile中

ARG YOUR_TOKEN
RUN mvn package
然后在docker-compose.yml中

版本:“3”
服务:
我的应用程序:
容器名称:我的应用程序
建造:
上下文:。
args:
您的\u令牌:$您的\u令牌
端口:
- 8080:8080
现在应该可以了

导出您的\u令牌=abc123
docker组合构建
但是您不应该上载此生成映像,因为它在其历史记录中包含令牌。
如果您有一个多阶段的构建,并且maven步骤是您的构建步骤,它将被丢弃,这是可以的


一个更优雅的解决方案是buildkit机密。但我不知道他们是否已经和docker compose合作过。看到和


如果您在运行时需要变量(docker compose up)而不是构建时(docker compose build),您可以这样做:

版本:“3”
服务:
我的应用程序:
环境:
您的\u令牌:$您的\u令牌
端口:
- 8080:8080
然后

导出您的\u令牌=abc123
码头工人整理

最安全的方法是装入内存中的文件系统,并将相关凭据存储为其中的文件。既然您已经达到了这种复杂程度,那么最好转到kubernetes,因为这远远超出了docker compose的管理能力。Compose是为桌面开发人员设计的,而不是企业级的产品发布。是的,我最终肯定会把目光投向kubernetes。虽然我希望我的项目由多个开发人员完成,但我肯定还不在企业级。我们只有少数人在业余时间从事这个项目。我最终肯定会使用kubernetes,但我不确定现在是否是最佳时机,因为该项目仍处于起步阶段。如果只是开发阶段,稍后您将对其进行改进,那么您可以使用保存在.gitignore中的本地env文件()。但是,对于prod,这是不安全的,因为任何有权访问服务器的人都可以看到docker正在使用的env的值。就我个人而言,我认为如果不使用K8,你会浪费更多的时间让事情正常运转。k8s很难,但比其他任何东西都容易。当你更成熟的时候,你会想开始使用hashicorp vault和k8s,然后秘密变得更容易。是的,你是对的。我最终肯定需要使用secrets和K8,即使这意味着如果我不这样做的话,我现在需要做一些额外的工作。谢谢你指出这些秘密将存在于图像中,这很好。但是,是的,我正在考虑添加一个被忽略的env文件,@KeKru的答案是我现在要做的,直到我到达k8s。啊,这对我来说很有用!在你回答之前,我试图解决这个问题,我的很多问题是,我需要在构建时使用变量,但我在运行时提供它。因此,我是通过
环境
提供它的,而不是在构建
参数
中。因此,感谢您在这里详细介绍构建时和运行时变量的区别。也感谢您指出,秘密将出现在映像历史中。目前,我并没有在任何地方部署这些图像(它们只是为了本地开发atm),但在我达到这一点之前,最好先了解一下。