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