如果在书写 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 构建镜像前需要一些额外的工作:

  1. 将要使用的 SSH Key 添加到 ssh-agent 中:
    # 在后台启动一个 ssh-agent
    eval "$(ssh-agent -s)"
    # 将要使用的 SSH 私钥文件 添加到 ssh-agent 中
    ssh-add ~/.ssh/your-ssh-private-key-file-needed-in-dockerfile
  2. 开启 Docker Buildkit 功能:
    DOCKER_BUILDKIT = 1
  3. 使用 Dockerfile 进行构建:
    # 实际上是 docker build --ssh default=$SSH_AUTH_SOCK . 的简写
    # 环境变量 $SSH_AUTH_SOCK 是SSH代理连接套接字
    docker build --ssh default .

以上介绍的这些内容足以应付实践中绝大多数场景,可是当 Dockerfile 中的多个命令分别需要使用不同的 SSH 连接时,就束手无措了。

Dockerfile 里用到多个 SSH

Dockerfile 中使用多个 SSH 连接与在 Dockerfile 使用单个 SSH 连接的配置是一样的,唯一不同的是当使用 RUN命令时,需要更具体地指出使用哪个 SSH 连接:

# RUN 命令使用 `--mount` 选项的 `id=xxx` 参数值来指定使用那个 SSH 连接
RUN --mount=type=ssh,id=a_identifier #后面像平常一样书写命令
RUN --mount=type=ssh,id=another_identifier #后面像平常一样书写命令

对于以上这样的 Dockerfile,当使用 docker build 构建镜像时我们就需要明确地指出 Dockerfile 中写的每个 ssh 连接标识符是什么:

# docker build 命令的 --ssh 选项参数值既可以是 `$SSH_AUTH_SOCK` 也可以是 ssh 私钥文件路径
DOCKER_BUILDKIT=1 docker build --ssh a_identifier=$SSH_AUTH_SOCK --ssh another_identifier=~/.ssh/your-ssh-private-key-file-path .

下图展示了启动 ssh-agent 后环境变量 $SSH_AUTH_SOCK 的值情况:

事实上,对于 Dockerfile 文件中的 RUN 命令,如果我们只写 RUN --mount=type=ssh 而不指定 ssh 连接 id,Docker 会认为其使用的标识符就是 default;这也就解释了在先前部分例子中,我们在 docker biuld --ssh default .命令行中使用的 default 是个什么东西。

参考


最新文章

  1. 自己写的一个Pager分页组件,WebForm,Mvc都适用
  2. Nginx主配置参数详解,Nginx配置网站
  3. WIN 下的超动态菜单(三)代码
  4. jquery mobile 输入框无边框
  5. js自执行函数的几种不同写法的比较
  6. MAVEN ERROR : Dynamic Web Module 3.0 requires Java 1.6 or newer
  7. -_-#【减少 DOM 访问】“离线”更新节点,再将它们添加到树中
  8. 385. Mini Parser
  9. python核心编程第二版笔记
  10. Ceilometer + Aodh + Gnocchi 介绍
  11. 偶写的第一个控件,一个用选择代替输入的Edit控件…
  12. js中的new Option默认选中
  13. python--第十四天总结(js)
  14. PHP检查当前数组为几维数组
  15. movielens 时间戳是秒级别的
  16. C++ malloc 和 new 的函数说明
  17. Tomcat9 配置在Windows7 64位 上安装步骤
  18. [转]Web前端浏览器兼容
  19. okhttp发送post请求
  20. 安装ale_python_interface时遇到make错误

热门文章

  1. django_day06
  2. C与C++有什么区别
  3. InnoDB_锁总结
  4. WindowsApps目录占用大量空间
  5. containerd使用总结
  6. kvm里的虚拟机硬盘和网卡使用virtio驱动
  7. 21. Fluentd输出插件:rewrite_tag_filter用法详解
  8. [基础] BS/CS 区别 Http/Https 区别 中间件请求
  9. echarts中setOption没有重新渲染表格
  10. 工业互联网领域的企业,都已经接入了ERP或者MES系统了吗?