如何在 docker 构建期间指定和使用证书文件

Posted

技术标签:

【中文标题】如何在 docker 构建期间指定和使用证书文件【英文标题】:How to specify and use a cert file during a docker build 【发布时间】:2022-01-02 07:09:44 【问题描述】:

我的公司刚刚更新了我们的安全性,现在我们需要添加自定义证书文件的使用。我的本地 docker 构建现在无法在构建期间下载包。为了解决这个问题,我需要在 docker build 中使用一个证书文件。

如果我尝试在本文末尾使用 Dockerfile 构建映像,则会收到以下错误,表明权限被拒绝,因为它需要证书 -

=> ERROR [4/4] RUN apk update && apk upgrade                                                                                                            0.3s
------                                                                                                                                                        
 > [4/4] RUN apk update && apk upgrade:                                                                                                                       
#8 0.194 fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz                                                                        
#8 0.232 140008555400008:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#8 0.233 ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/main: Permission denied
#8 0.233 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/main: No such file or directory
#8 0.233 fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
#8 0.273 140008555400008:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1913:
#8 0.273 ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/community: Permission denied
#8 0.273 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/community: No such file or directory
#8 0.273 2 errors; 14 distinct packages available

如果我注释掉RUN apk update && apk upgrade,它就会生成。我shell进入容器,手动运行export SSL_CERT_FILE=~/trusted-certs.pem,然后手动运行apk update && apk upgrade,它将执行apk安装。

我也尝试过使用 ENV 和 ARG,但没有成功。

如果我像这样RUN SSL_CERT_FILE=~/biw-trusted-certs.pem apk update && SSL_CERT_FILE=~/biw-trusted-certs.pem apk upgrade 更新 Dockerfile 中的 apk 命令,它将在构建期间工作,但添加到所有 apk 命令中会很乏味。

我确实需要这个才能在 Alpine linux 中工作。

我的 Dockerfile -

FROM alpine:3.14.1

COPY trusted-certs.pem ~/trusted-certs.pem

#ARG SSL_CERT_FILE=~/trusted-certs.pem
#ENV SSL_CERT_FILE=~/trusted-certs.pem
RUN export SSL_CERT_FILE=~/trusted-certs.pem

RUN apk update && apk upgrade

【问题讨论】:

【参考方案1】:

我终于明白了。

所有都可以用这个 -

FROM alpine:3.14.1

COPY trusted-certs.pem /root/trusted-certs.pem
RUN SSL_CERT_FILE=~/trusted-certs.pem apk add ca-certificates
RUN update-ca-certificates
RUN apk update && apk upgrade
RUN apk add curl
RUN curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip

更干净:

FROM alpine

COPY ./trusted-certs.pem /usr/local/share/ca-certificates/
RUN cat /usr/local/share/ca-certificates/trusted-certs.pem >> /etc/ssl/certs/ca-certificates.crt

RUN apk update && apk add --no-cache jq
RUN apk add curl
RUN curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip

【讨论】:

以上是关于如何在 docker 构建期间指定和使用证书文件的主要内容,如果未能解决你的问题,请参考以下文章

docker镜像构建

如何用Dockerfile创建镜像

在构建期间将文件从 GCS 复制到 Cloud Run docker 容器中

如何为使用 OpenSSL 创建客户端证书指定 CA 私钥密码

Docker Compose Django、Webpack 和构建静态文件

在构建期间向 Docker 添加别名