java - 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 行)仍然是硬编码字符串。我们想从环境中读取它并在命令中设置。如何使用环境变量来实现相同的目标?
解决方案
您可以使用命令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 .
推荐阅读
- pandas - 如果条件发生在任何行/列中,则读取 Pandas 数据框
- web - 如何从网站列表中下载新文章?建议?
- c# - Windows 10 IoT Enterprise 2016 上的蓝牙 LE GATT 服务器
- flutter - 输入'列表
' 不是类型 'int' 的子类型 - firebase - Firebase:无法在 Firebase 中创建项目。" 创建项目时出现未知错误。请重试。"
- python - 使用 pytest 和假设进行异常处理和测试
- python - 如何通过将不同大小写的相同字母视为python中的相同字母来按字母顺序对列表进行排序
- c++ - 如何使用抽象类中不包含的方法
- apache - Solr '服务无法使用'
- office-js - 检测是否由加载项进行了更改