引用存储在文本中的环境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>