1

我有一个带有以下基本映像的 Dockerfile:

FROM frolvlad/alpine-oraclejdk8:slim

在同一个 Dockerfile 中,我还运行:activator compile

当我$ docker build -t some_name .在 MacBook 上运行时,SBT 步骤按预期工作。

当我在远程 Ubuntu 主机(AWS 上的 EC2 实例)上通过相同的 Dockerfile 运行相同的命令时,我收到许多证书错误,如下所示:

[info] Resolving org.webjars#strip-json-comments;1.0.2-1 ...
[error] Server access Error: java.security.cert.CertificateException: No name matching repo.typesafe.com found url=https://repo.typesafe.com/typesafe/ivy-releases/org.webjars/strip-json-comments/1.0.2-1/ivys/ivy.xml
[error] Server access Error: java.security.cert.CertificateException: No name matching repo.scala-sbt.org found url=https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/org.webjars/strip-json-comments/1.0.2-1/ivys/ivy.xml
[error] Server access Error: java.security.cert.CertificateException: No name matching repo1.maven.org found url=https://repo1.maven.org/maven2/org/webjars/strip-json-comments/1.0.2-1/strip-json-comments-1.0.2-1.pom
[info] Resolving com.typesafe.sbt#sbt-rjs;1.0.7 ...
[error] Server access Error: java.security.cert.CertificateException: No name matching repo.typesafe.com found url=https://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbt/sbt-rjs/scala_2.10/sbt_0.13/1.0.7/ivys/ivy.xml
[error] Server access Error: java.security.cert.CertificateException: No name matching repo.scala-sbt.org found url=https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbt/sbt-rjs/scala_2.10/sbt_0.13/1.0.7/ivys/ivy.xml
[error] Server access Error: java.security.cert.CertificateException: No name matching repo1.maven.org found url=https://repo1.maven.org/maven2/com/typesafe/sbt/sbt-rjs_2.10_0.13/1.0.7/sbt-rjs-1.0.7.pom

似乎 SBT 正在联系存储库以下载依赖项,并且无法验证其 SSL 证书。docker build但是,在我的 MacBook 上运行时,同样的过程可以正常工作并下载大量依赖项而没有任何问题。因此,我的 MacBook 和那个 Ubuntu 主机之间的环境看起来有些不同。但是,无论在何处运行,都希望 Docker 提供完全隔离和一致的行为。

有人知道会发生什么吗?

4

2 回答 2

0

我相信我发现了问题,尽管我无法解释为什么会发生。

与 Docker 显示不一致行为的 EC2 Ubuntu 主机具有如下iptables规则:

$ sudo iptables -L -t nat
[...]
Chain xyz (1 references)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https /* xyz */ redir ports 8443

该规则用于将所有入站流量从端口 443 重定向到 8443。它旨在将流量重定向到在同一台机器上运行并具有自签名 SSL 证书的基于 Java 的应用程序。

当我使用 Docker 的默认网络设置在同一台机器上运行 Docker 容器时,我从容器、Docker 或操作系统中发出 HTTPS wget,似乎将出站连接重定向到 Ubuntu 主机上的端口 8443,因此, 到本地基于 Java 的应用程序,该应用程序反过来接受连接(大多数时候)并返回导致java.security.cert.CertificateException我之前观察到的 s 的无效(自签名)证书详细信息。

但是,该iptables规则应该只影响到主机的入站连接。谁能解释为什么 Docker 容器内的出站连接被重定向到本地端口?

这些iptables设置如何影响 Docker?

于 2016-09-13T05:02:02.327 回答
-1

Imagefrolvlad/alpine-oraclejdk8:slim没有使用 Alpine 的官方 Java 包,而是使用 Oracle JDK(仅作为针对 glibc 编译的二进制文件分发)和 glibc hack,使其以某种方式在基于 musl 的系统上运行。Alpine不支持它,我强烈建议您不要使用它。

您应该使用openjdk:8-alpineimage 代替或仅使用普通的 Alpine 图像并简单地安装 openjdk8 包。SBT 在这里工作正常。


如果您想尝试现在还包含来自 IcedTea 的补丁的最新版本,请使用纯 Alpine 映像并从边缘分支安装 openjdk8:

echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
apk update
apk add openjdk8

将稳定版和边缘的软件包混合在一起通常不是一个好主意,可能存在 ABI 不兼容问题。因此,最好将您的系统也升级到边缘:替换v3.X/mainedge/mainin/etc/apk/repositories并运行apk update && apk upgrade


Oracle JDK 只是 OpenJDK(即开源)的品牌(专有)发行版,代码库几乎相同。这意味着几乎所有在 Oracle JDK 8 上运行的 Java 应用程序也在 OpenJDK 8 上运行。

您可以在我的 gliderlabs/docker-alpine 评论中找到更多信息。

于 2016-09-09T09:03:08.527 回答