引用存储在文本中的环境variables

我有一个服务器上的文件包含我的github访问令牌。 我想将访问令牌存储在构buildDockerfile时调用的文本文件中

这是我在想的一些伪代码:

creds.sh

export GITHUB_CREDS mylongcred 

Dockerfile

 FROM some/image RUN ../path/to/creds.sh RUN install_github("my/repo", "$GITHUB_CREDS") 

显然这是行不通的。 从理论上讲,你在这里看到的东西有什么问题吗?

它是运行,或者我应该用来完成这个命令的其他命令指令?

更新:

  • 凭证文件不在构build范围之内(一个目录在后面)
  • dockerfile正在运行一个调用,我不能直接更改,因为它被jenkins插件调用

有几个可能的解决scheme(但是没有一个是理想的)。

1. 导出并单步运行

正如在@STLMikey的注释中指出的那样,导出的环境variables不会从一个RUN步骤持续到下一个RUN步骤,因为它们将在两个不同的中间容器中运行。 您可以通过使用一个构build步骤来避免这种情况:

 RUN path/to/creds.sh && install_github("my/repo", "$GITHUB_CREDENTIALS") 

请记住, path/to/creds.sh需要包含像export GITHUB_CREDENTIALS=<insert credentials here> (请注意=在您的问题中原始文件中不存在)。

警告 :请注意, path/to/creds.sh将包含在您的图像中,任何使用它的人都可以看到。 这很可能不是你想要的。 另外请记住,在这一步或后续步骤中读取文件将无济于事,因为凭证文件仍将存在于父层中。 这导致我们…

2. 第1步+图像压扁

使用像docker-squash这样的工具将图像中的所有图层合并为一个。 这使您可以删除在构build过程中添加的秘密文件,而不会在其中一个父层中留下痕迹:

 $ docker save <image-id> | docker-squash -t squash -verbose | docker load 

但是 ,当你这样做的时候,你将会失去所有的文件系统层,使得生成的图像难以高效地推送和拉取。 即使是最微小的变化也只会导致一个全新的图像,只有一个大的层次。 这可能也不是很理想。 这再次导致我们…

3. 构build时间variables

这个解决scheme在官方文档中是不鼓励的,在Docker问题跟踪器中也有关于这个问题的讨论 。 使用这个你自己的判断。

警告 :build议不要使用构build时variables来传递github密钥,用户凭据等秘密。使用docker history命令,构build时variables值对图像的任何用户都是可见的。

你可以使用build-timevariables来使用--build-arg标志。 为此,首先使用ARG语句在Dockerfile中定义参数:

 FROM some/image ARG GITHUB_CREDENTIALS RUN install_github("my/repo", ${GITHUB_CREDENTIALS}) 

然后在docker build上传递参数:

 docker build --build-arg GITHUB_CREDENTIALS=<insert credentials here>