docker多级生成Go映像-x509:由未知权限签署的证书
我尝试在私人公司网络使用中创建图像:docker多级生成Go映像-x509:由未知权限签署的证书,go,docker-multi-stage-build,docker,go-build,go-git,Go,Docker Multi Stage Build,Docker,Go Build,Go Git,我尝试在私人公司网络使用中创建图像: 并获取x509:由未知机构签名的证书错误 Step 1/13 : FROM golang:latest as builder ---> 2421885b04da Step 2/13 : WORKDIR /app ---> Using cache ---> 6555644dbd16 Step 3/13 : COPY go.mod go.sum ./ ---> 55d45a30f492 Step 4/13 : RUN go mod
并获取
x509:由未知机构签名的证书
错误
Step 1/13 : FROM golang:latest as builder
---> 2421885b04da
Step 2/13 : WORKDIR /app
---> Using cache
---> 6555644dbd16
Step 3/13 : COPY go.mod go.sum ./
---> 55d45a30f492
Step 4/13 : RUN go mod download
---> Running in 88c21c6b4fab
go: github.com/dgrijalva/jwt-go/v4@v4.0.0-preview1: Get "https://proxy.golang.org/github.com/dgrijalva/jwt-go/v4/@v/v4.0.0-preview1.mod": x509: certificate signed by unknown authority
The command '/bin/sh -c go mod download' returned a non-zero code: 1
make: *** [docker] Error 1
我试图从中找到答案
,
及
,但结果是一样的
❗️如果添加
-不安全
标志
...
RUN go env -w GOPROXY=direct GOFLAGS="-insecure"
COPY go.mod go.sum ./
...
对于
Dockerfile
我将提出几点建议:
- 在与最终代码映像相同的操作系统发行版中构建代码,以便确保代码将在该特定发行版中运行。另外,一些发行版要求证书位于不同的文件夹中,因此请注意这一点
- 在第一张图像中使用alpine将大大缩短构建时间。您可以看到
尺寸约为260M,但最新的
尺寸约为100M阿尔卑斯山的
- 更好的做法是使用特定版本的alpine,这样您就可以确保代码在该版本中运行(我将由您自行决定)
- Golang非常强大的一点是,您可以在名为
的空docker映像中运行它,这意味着您的最终docker映像只包含您自己的可执行文件scratch
- 如果您需要自己的证书,则必须在代码中包含这些证书,并在执行
之前复制它们,以便将它们包含在最终文件中update ca certificates
下面是dockerfile的一个例子,我在上面解释过
FROM golang:alpine as builder
WORKDIR /app
# This will download all certificates (ca-certificates) and builds it in a
# single file under /etc/ssl/certs/ca-certificates.crt (update-ca-certificates)
# I also add git so that we can download with `go mod download` and
# tzdata to configure timezone in final image
RUN apk --update add --no-cache ca-certificates openssl git tzdata && \
update-ca-certificates
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN GO111MODULE="on" CGO_ENABLED=0 GOOS=linux go build -o main ${MAIN_PATH}
# Golang can run in a scratch image, so that, the only thing that your docker
# image contains is your executable
FROM scratch
LABEL maintainer="Kozmo"
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
# This line will copy all certificates to final image
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
如果自己的证书将第一个docker阶段替换为:
FROM golang:alpine as builder
WORKDIR /app
RUN apk --update add --no-cache ca-certificates openssl git tzdata
COPY your/cert/path /usr/local/share/ca-certificates/your-cert-name
RUN update-ca-certificates
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN GO111MODULE="on" CGO_ENABLED=0 GOOS=linux go build -o main ${MAIN_PATH}
因为您使用自己的证书,所以最终的
Dockerfile
将如下所示:
FROM golang:alpine as builder
WORKDIR /app
RUN apk --update add --no-cache ca-certificates openssl git tzdata
COPY your/cert/path /usr/local/share/ca-certificates/your-cert-name
RUN update-ca-certificates
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 scratch
LABEL maintainer="Kozmo"
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
# This line will copy all certificates to final image
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
如果您有任何疑问,请随时问我:)来自您的错误消息
得到 "https://proxy.golang.org/github.com/dgrijalva/jwt-go/v4/@v/v4.0.0-preview1.mod”: x509:由未知权限签署的证书
看起来proxy.golang.org的CA根不是您的私有公司docker环境中受信任的根CA的一部分
我会尝试使用以下工具安装它:
1-从proxy.golang.org获取证书:
echo -n | openssl s_client -connect proxy.golang.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./golang.cer
如果打开golang.cer,您应该会看到证书链
2-将其安装到受信任的根CA中:
certutil.exe -addstore root golang.cer
…或在Mac上:
2a-双击证书文件(扩展名为“.cer”)
2b-从钥匙链选项中选择“系统”。然后按“OK”
2c-当弹出以下窗口时,单击“始终信任”按钮。
git
使用curl
访问https
服务器,因此您需要将证书导入系统的CA存储
解决方法是在代理环境变量上定义环境变量
GIT\u SSL\u NO\u VERIFY=1
,但在使用go-get
或go-mod-download
时,它不起作用。您是否尝试在客户端重新启动docker.service?@Ashok-zero results?这是否回答了您的问题?@Peter-当我使用golang:latest
I get命令'/bin/sh-c apk add--no cache ca certificates'返回一个非零代码:127
@Peter-当我使用golang:alpine
I getgo:github.com/dgrijalva/jwt-go时/v4@v4.0.0-预览1:git init——裸入/go/pkg/mod/cache/vcs/DBB1616A13223A75321E21A8150B1A778150B73E761213ECC0AB67568C38AC2:exec:“git”:在$PATH中找不到可执行文件
我有相同的错误(x509:由未知机构签署的证书
)在步骤RUN go mod download
中,您对我为什么获得x509:由未知机构签署的证书有什么建议吗
使用您提供的Dockerfile
❓您是否复制了第二部分所述的证书?此外,我忘了提到它们必须是.pem
格式,以便更新ca证书
将它们拾取并添加到可信证书如果我使用golang:latest as builder
并复制自证书(查看我的答案),我的意思是复制您自己的证书作为我答案的第二部分。将它们复制到/usr/local/share/ca certificates/
阶段中的golang:latest as builder
添加将其安装到受信任的根ca中…
对于mac/nix,请
certutil.exe -addstore root golang.cer