首页 > 解决方案 > DockerFile : RUN 传递参数

问题描述

我们需要更改 docker 镜像中 Keystore 的 JKS 密码。

DockerFile 中的以下命令有效

1. RUN [\
2.  "/usr/lib/jvm/java-11-openjdk-amd64/bin/keytool",\
3.  "-storepasswd",\
4.  "-storepass",\
5.  "changeit",\
6.  "-new",\
7.  "NEW_JKS_PASSWORD",\
8.  "-cacerts"\
9.  ]

但是,更改后的密码(第 7 行)仍然是硬编码字符串。我们想从环境中读取它并在命令中设置。如何使用环境变量来实现相同的目标?

标签: javadockersecuritydockerfile

解决方案


您可以使用命令ARG的 shell 形式RUN

ARG jks_password
RUN "/usr/lib/jvm/java-11-openjdk-amd64/bin/keytool -storepasswd -storepass …"

然后,在构建使用时docker build --build-arg jks_password=XYZ .

但这有一个警告,请参阅 Docker 文档中的警告:

警告: 不建议使用构建时变量来传递 github 密钥、用户凭据等机密信息。任何使用 docker history 命令的图像用户都可以看到构建时变量值。请参阅“使用 BuildKit 构建镜像”部分,了解构建镜像时使用机密的安全方法。

相反,应该使用该--secret标志:

RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

以及相应的 docker build 参数:--secret id=mysecret,src=mysecret.txt .


推荐阅读