在Distroless Docker镜像运行时更新ca-certificates
在Docker容器运行期间执行update-ca-certificates的方案
一、常规Debian/Ubuntu系容器(带完整shell和工具链)
这类镜像默认自带update-ca-certificates工具,按以下步骤操作:
将自定义证书传入容器
可通过挂载主机文件或容器运行后复制的方式,将证书放到指定目录:- 挂载方式启动容器:
docker run -v /本地路径/自定义证书.crt:/usr/local/share/ca-certificates/自定义证书.crt 你的镜像名 bash -c "update-ca-certificates && 你的主启动命令" - 容器运行中传入证书:
先进入容器:
从主机复制证书到容器内目录:docker exec -it 容器ID/名称 bashdocker cp /本地路径/自定义证书.crt 容器ID/名称:/usr/local/share/ca-certificates/
- 挂载方式启动容器:
执行证书更新
在容器内执行命令:update-ca-certificates成功执行后会输出类似
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.的提示,新证书随即生效。
二、Distroless镜像(无shell和工具链)
Distroless镜像默认没有update-ca-certificates和shell,需要手动处理证书:
准备PEM格式证书
确保自定义证书为PEM格式(后缀通常为.crt或.pem),若不是可通过以下命令转换:openssl x509 -in 原证书文件 -out 目标文件.crt -outform PEM挂载证书并生成哈希链接
- 挂载证书到容器的
/etc/ssl/certs/目录:docker run -v /本地路径/自定义证书.crt:/etc/ssl/certs/自定义证书.crt 你的distroless镜像名 - 生成证书哈希链接(确保系统能识别证书):
若容器内带openssl工具,可在启动命令中添加:
若没有docker run -v /本地路径/自定义证书.crt:/etc/ssl/certs/自定义证书.crt 你的distroless镜像名 sh -c "ln -s /etc/ssl/certs/自定义证书.crt /etc/ssl/certs/$(openssl x509 -hash -noout -in /etc/ssl/certs/自定义证书.crt).0 && 你的主启动命令"sh和openssl,可在主机预先计算哈希值:
得到哈希值后,挂载时同时挂载链接文件:openssl x509 -hash -noout -in 自定义证书.crtdocker run -v /本地路径/自定义证书.crt:/etc/ssl/certs/自定义证书.crt -v /本地路径/哈希值.0:/etc/ssl/certs/哈希值.0 你的distroless镜像名
- 挂载证书到容器的
直接合并到CA证书文件
若容器的CA证书合并在/etc/ssl/certs/ca-certificates.crt中,可在主机将自定义证书追加到该文件,再挂载替换容器内的文件:cat 自定义证书.crt >> /本地路径/ca-certificates.crt docker run -v /本地路径/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt 你的distroless镜像名
内容的提问来源于stack exchange,提问作者Omri Shneor
相关产品推荐
相关产品推荐

