【问题标题】:Certificate exceptions when running Scala SBT on Docker Alpine Linux container在 Docker Alpine Linux 容器上运行 Scala SBT 时出现证书异常
【发布时间】:2017-01-17 04:45:17
【问题描述】:

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

FROM frolvlad/alpine-oraclejdk8:slim

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

当我在 MacBook 上运行 $ docker build -t some_name . 时,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 提供完全隔离和一致的行为。

有人知道会发生什么吗?

【问题讨论】:

    标签: scala docker sbt typesafe-activator alpine


    【解决方案1】:

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

    显示与 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.CertificateExceptions 的无效(自签名)证书详细信息。

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

    这些iptables 设置如何影响 Docker?

    【讨论】:

      【解决方案2】:

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

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


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

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

      从 stable 和 edge 混合包通常不是一个好主意,可能存在 ABI 不兼容。因此,最好将您的系统也升级到边缘:将 v3.X/main 替换为 /etc/apk/repositories 中的 edge/main 并运行 apk update && apk upgrade


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

      您可以在my comment in gliderlabs/docker-alpine找到更多信息。

      【讨论】:

      • 使用openjdk:8-alpine 作为基础镜像会发生完全相同的事情。此外,主要问题仍然存在:Docker 在两个不同的环境(MacOS 和 Ubuntu)上的行为不一致。
      • 网络连接和 DNS 是否真的在 AWS 上的容器内工作?你能ping通吗? repo1.maven.org?
      • 是的,这是我检查的第一件事。如果我在 EC2 Ubuntu 主机上,而不是在容器中,我可以使用 wget 下载任何内容,包括 SBT 无法下载的依赖项。
      • 嗯,这似乎是不一致行为发生的地方。如果我在我的 MacOS 机器上运行映像,我可以成功使用 wget。如果我在 Ubuntu EC2 主机上运行映像,对于相同的 wget 命令,我会收到“连接被拒绝”。而现在,这更加不一致,因为使用 wget 它们不是证书错误。我检查了几次,它总是相同的行为。 Wget 直接在 EC2 主机上工作,但不能在同一主机上的 Docker 上工作,而在我的 MacOS 上,它在两种情况下都可以正常工作。
      • 所以它与SBT或Java无关,你只是错误地为Docker配置了网络......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 2021-10-24
      • 2019-07-12
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      相关资源
      最近更新 更多