天天看點

Docker 中使用 scratch 鏡像建構 Go 應用鏡像,容器報錯:X509: Certificate Signed by Unknown Authority

本文首發于 Ficow Shen’s Blog,原文位址: Docker 中使用 scratch 鏡像建構 Go 應用鏡像,容器報錯:X509: Certificate Signed by Unknown Authority。

内容概覽

  • 前言
  • 将證書添加到鏡像中
  • 不使用 HTTPS
  • 總結

前言

當使用

FROM scratch

建構基于

scratch

鏡像的

Go

應用鏡像時,如果沒有向鏡像中添加證書頒發機構(CA, Certificate Authority)釋出的證書,您就有可能遭遇這個錯誤:

X509: Certificate Signed by Unknown Authority

其實,解決的方法比較簡單,隻需要将部署該容器的伺服器的證書導入到鏡像中即可。或者,采用下策,不使用 HTTPS。

将證書添加到鏡像中

最終運作該容器的伺服器的作業系統的不同,證書在檔案系統中存儲的位置就會有所不同。

對于多數

Linux

發行版來說,這個目錄是:

/etc/ssl/certs

。比如,在

Ubuntu 20.04.1 LTS

中,我們可以使用

ca-certificates.crt

使用

scp

指令,我們可以很容易地将這個檔案發送到本地機器中:

scp 使用者名@伺服器IP位址:/etc/ssl/certs/ca-certificates.crt .

, 如:

scp [email protected]:/etc/ssl/certs/ca-certificates.crt .

最後,将這個檔案放到與

Dockerfile

相同的目錄下,然後修改

Dockerfile

。比如:

FROM scratch

# ...

WORKDIR /app
ADD ca-certificates.crt /etc/ssl/certs/ # 使用 ADD 指令,将 ca-certificates.crt 添加到鏡像中
ADD . /app

EXPOSE 8000

# ...
           

參考文章中的解決方案是使用

wget

指令下載下傳由

Mozilla

提供的證書:

wget https://curl.haxx.se/ca/cacert.pem

不使用 HTTPS

請注意,這是一個下策!!!

觸發此錯誤時,

Go

應用一定發起了基于

HTTPS

協定的網絡請求。您隻需要找到發起網絡請求的代碼,然後修改請求位址的協定為

HTTP

即可。比如:

https://ficowshen.com

-->

http://ficowshen.com

但是,這樣您的網絡請求資訊就完全暴露了,我并不推薦您這樣做。請三思而後行~

參考内容

使用 docker 運作 golang 程式

Golang 容器部署

X509: Certificate Signed by Unknown Authority (Running a Go App Inside a Docker Container)