登录
首页 >  Golang >  Go问答

Docker 容器中 golang http.Get 报错“证书由未知颁发机构签发”

来源:stackoverflow

时间:2024-02-29 10:39:22 426浏览 收藏

今天golang学习网给大家带来了《Docker 容器中 golang http.Get 报错“证书由未知颁发机构签发”》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我有一个带有 golang 的容器,它调用 https api。我正在使用临时容器,当我尝试运行时,我得到了由未知权威机构 签名的 证书

url := "https://restcountries.eu/rest/v2/name/" + params.get("country")
response, err := http.get(url)

我的 dockerfile 是这样的:

from golang:1.15 as builder
workdir /greetingapi
copy . /greeting
workdir /greeting
env go111module=on
run cgo_enabled=0 goos=linux go build -o greeting

from scratch
copy --from=builder /greeting .
cmd ["./greeting"]

我使用这个 answare 更新了我的 dockerfile。但是,当我尝试构建容器时,出现 error: "/ca-certificates.crt" not found: not foundfailed to solution: rpc error: code = unknown desc = failed tocompute cache key: "/ca-certificates .crt”未找到:未找到

FROM golang:1.15 AS builder
WORKDIR /GreetingAPI
COPY . /greeting
WORKDIR /greeting
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o greeting

FROM scratch
ADD ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /greeting .
CMD ["./greeting"]

解决方案


我可能需要在链接的答案中更清楚地说明,第一个示例中的副本是一个单阶段示例,其中您有一个证书文件要注入到构建上下文中(通常包含 dockerfile 的目录): p>

from scratch
add ca-certificates.crt /etc/ssl/certs/
add main /
cmd ["/main"]

您有一个多阶段构建,可以遵循链接答案后半部分的多阶段方法。这会在发行版供应商的另一个阶段安装证书,并将它们复制到您的临时阶段:

from golang:alpine as build
run apk --no-cache add ca-certificates
workdir /go/src/app
copy . .
run cgo_enabled=0 go-wrapper install -ldflags '-extldflags "-static"'

from scratch
copy --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
copy --from=build /go/bin/app /app
entrypoint ["/app"]

但是,第二个示例假设 alpine 作为第一阶段的基础,使用 apk。 (它还假设证书需要安装在基础映像中,但事实证明当前 golang 映像中并非如此。)对于您的示例,它基于 golang:1.15 映像中的 debian。为此,您通常需要 apt-get 命令,但在这种情况下,ca-certificates 软件包已安装,因此您只需复制结果即可:

from golang:1.15 as builder
copy . /greeting
workdir /greeting
env go111module=on
run cgo_enabled=0 goos=linux go build -o greeting

from scratch
copy --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
copy --from=builder /greeting /
cmd ["/greeting"]

在构建器阶段安装 ca 证书并复制到最终映像。类似于:

FROM golang:1.15 AS builder
RUN apk update
RUN apk add -U --no-cache ca-certificates && update-ca-certificates
WORKDIR /GreetingAPI
COPY . /greeting
WORKDIR /greeting
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux go build -o greeting

FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /greeting .
CMD ["./greeting"]

到这里,我们也就讲完了《Docker 容器中 golang http.Get 报错“证书由未知颁发机构签发”》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>