本文首發于 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)