如果在书写 Dockerfile
时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢?
Dockerfile
文件配置
为了使得 Dockerfile
文件中的命令可以使用 SSH 连接,需要先进行如下配置:
# 1. 安装 openssh-client 和 git,具体使用的系统包管理器取决于你的基础镜像是什么
RUN apk add --no-cache openssh-client git
# 2. 下载服务器的公钥指纹,为了避免SSH连接时命令行的 'unknown host' 提示确认(因为我们无法对于Docker build过程的控制台做出响应)
# 这里以 github 为例
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
在以上配置完成之后,Dockerfile
中的 RUN
命令就可以像下面这样使用 SSH 了:
# RUN 命令使用 `--mount` 选项的 `type=ssh` 参数值
RUN --mount=type=ssh #后面像平常一样书写命令
配置文件 Dockerfile
现在已经写好了✅,接下来我们要做的就是构建镜像。
docker build
构建镜像
跟往常不一样,由于 Dockerfile
里使用了 SSH,所以这次在使用 docker build
构建镜像前需要一些额外的工作:
- 将要使用的 SSH Key 添加到 ssh-agent 中:
# 在后台启动一个 ssh-agent eval "$(ssh-agent -s)" # 将要使用的 SSH 私钥文件 添加到 ssh-agent 中 ssh-add ~/.ssh/your-ssh-private-key-file-needed-in-dockerfile
- 开启 Docker Buildkit 功能:
DOCKER_BUILDKIT = 1
- 使用
Dockerfile
进行构建:# 实际上是 docker build --ssh default=$SSH_AUTH_SOCK . 的简写 # 环境变量 $SSH_AUTH_SOCK 是SSH代理连接套接字 docker build --ssh default .
以上介绍的这些内容足以应付实践中绝大多数场景,可是当 Dockerfile
中的多个命令分别需要使用不同的 SSH 连接时,就束手无措了