Docker 多阶段构建具有证书颁发机构问题的 Go 镜像
问题:
何时尝试使用 Docker 多阶段构建在私有公司网络中构建 Go 镜像,您可能会遇到一条错误,指出“x509:由未知权威机构签名的证书”。当 Git 尝试从安全 HTTPS 服务器检索依赖项时,就会出现这种情况。
原因:
问题源于系统的 CA 存储中缺少所需的证书,导致 Git拒绝 HTTPS 连接。
解决方案:
要解决此问题,需要使用 OpenSSL 将丢失的证书导入到系统的 CA 存储中。下面是一个示例 Dockerfile,演示了如何实现此目的:
FROM golang:latest as builder RUN apt-get update && apt-get install -y ca-certificates openssl ARG cert_location=/usr/local/share/ca-certificates # Get certificate from "github.com" RUN openssl s_client -showcerts -connect github.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > ${cert_location}/github.crt # Get certificate from "proxy.golang.org" RUN openssl s_client -showcerts -connect proxy.golang.org:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > ${cert_location}/proxy.golang.crt # Update certificates RUN update-ca-certificates WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN GO111MODULE="on" CGO_ENABLED=0 GOOS=linux go build -o main ${MAIN_PATH} FROM alpine:latest LABEL maintainer="Kozmo" RUN apk add --no-cache bash WORKDIR /app COPY --from=builder /app/main . EXPOSE 8080 CMD ["/main"]
说明:
与原始 Dockerfile 相比,此 Dockerfile 包括几个额外的步骤。它首先安装 OpenSSL 并更新系统的 CA 证书。然后,它使用 OpenSSL 从“github.com”和“proxy.golang.org”检索证书并将其导入到 CA 存储中。最后,它更新证书,使 Git 能够在 go mod download 命令期间成功检索依赖项。
注意:
无需编辑 Dockerfile 来导入证书,您还可以在代理环境变量上设置环境变量 GIT_SSL_NO_VERIFY=1 。但是,不建议将此方法用于生产用途,因为它会禁用 SSL 验证。
以上是如何解决 Docker 多阶段构建 Go 镜像中的“x509:证书由未知机构签名”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!