【问题标题】:Docker id not picking the fileDocker id 没有选择文件
【发布时间】:2019-10-11 14:58:13
【问题描述】:

我有一个证书,正在尝试将证书设置为“javax.net.ssl.keyStore”。

System.setProperty("javax.net.ssl.keyStore", "certs/certfile.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");

//( 完全限定路径类似于 src/main/resources/certs/certfile.p12 )

当我在本地运行时,这些属性工作正常,但在 docker conatiner 中,问题是 certs/certfile.p12 中没有这样的文件或目录。

我需要将该 certfile.p12 添加到 JAR 中的 javax.net.ssl.keyStore 中。 也接受替代解决方案。

注意:完全限定路径在 JAR 中不起作用。

提前致谢。

【问题讨论】:

  • 能否提供您正在使用的镜像以及您使用什么命令来启动容器?
  • 我没有启动容器,我正在尝试在更高的环境中部署。我可以提供错误的屏幕截图。这里是 java.io.FileInputStream.open0(Native Method) 的日志 java.io.FileNotFoundException: file:/app.jar!/BOOT-INF/classes!/tls/certfile.p12 (No such file or directory) ~ [na:1.8.0_212] 在 java.io.FileInputStream.open(FileInputStream.java:195) ~[na:1.8.0_212] 在 java.io.FileInputStream.(FileInputStream.java:138) ~[na :1.8.0_212] 在 java.io.FileInputStream.(FileInputStream.java:93) ~[na:1.8.0_212]
  • 呃,certs/certfile.p12 文件是如何到达 docker 的?是否有一个文件夹被挂载或在构建过程中被复制?
  • 该文件夹是在开发过程中手动添加的,它是 jar 的一部分。

标签: java spring-boot docker


【解决方案1】:

将配置保留在图像外部是一种很好的做法(尝试)。除了这提供了明显的灵活性(一个图像具有许多可能的配置)之外,这还提供了一些安全性,因为配置(例如证书)是在外部管理的(并且可能是安全的)。

你有两个选择:

  • 在创建|运行容器时将certfile.p12 挂载到卷中:
docker run \
.... \
--volume=path/to/local/certfile.p12:/path/to/image/certfile.p12 \
...
  • 不推荐(参见序言),您可以在图像中包含certfile.p12。这需要您创建一个新映像(需要 Dockerfile):
FROM original-image
...
ADD /path/to/local/certfile.p12 /path/to/image/certfile.p12
...

您的配置也需要设置password。将这个值从图像中外化也是一个很好的做法。一种方法是使用环境变量,然后您必须从 Java 应用程序中获取该变量。您可以设置变量:

docker run \
...
---env=PASSWORD=password
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2019-11-08
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多