我想在registry.access.redhat.com/ubi8/ubi-micro
图像上运行一个简单的 GO 应用程序。
但不幸的是,x509: certificate signed by unknown authority
我的应用程序出现错误,因为 ubi8-micro 容器上似乎没有根 ca 信任库。
在我的 Dockerfile 中尝试了类似的操作,但没有成功:
FROM registry.access.redhat.com/ubi8/go-toolset as build
USER root
RUN yum update ca-certificates && \
update-ca-trust
COPY . .
RUN go mod tidy && \
go build .
FROM registry.access.redhat.com/ubi8/ubi-micro
COPY --from=build /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt /etc/pki/tls/certs/ca-bundle.trust.crt
COPY --from=build /opt/app-root/src/my-app .
RUN ./my-app # Go app gives 509 error on GET https://google.com
Go中的main函数
func main() {
_, err := http.Get("https://www.google.com")
if err != nil {
log.Printf("Error during Get is: %s", err) // throw 509
}
}
更新/解决方案
通过使用作为运行器ubi8-minimal
来修复它ubi8-micro
另请参阅(提交): https://github.com/michelmeeuwissen/redhat-go-example
答案1
目前尚不清楚您在哪个阶段遇到了错误,因此我将介绍所有内容。
在主机上,您需要将自定义 CA 证书添加到系统信任存储区 ( /etc/pki/ca-trust/source/anchors
) 并运行update-ca-trust
。
在构建容器时,我建议始终将主机信任存储公开给容器,即使您只在访问网络时才真正需要它(buildah build --volume /etc/pki/ca-trust:/etc/pki/ca-trust:ro
)。
运行容器时,将主机信任存储公开给容器(--volume /etc/pki/ca-trust:/etc/pki/ca-trust:ro
在create
或期间run
)。
由于 go 本身会查看你的系统信任存储,这与许多其他需要你重写的运行时不同,所以这应该是你所需要的。