如果在书写 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 是个什么东西。

参考


Dockerfile 使用 SSH docker build的更多相关文章

  1. docker build 指定dockerfile

    1. Dockerfile文件使用 docker build命令会根据Dockerfile文件及上下文构建新Docker镜像.构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地 ...

  2. Docker build Dockerfile 构建镜像 - 二

    Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...

  3. docker使用Dockerfile构建ssh容器

    一.使用Dockerfile构建centos 1.创建 Dockerfile mkdir centos # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd centos # 进入目录 ...

  4. 使用dockerfile文件创建镜像时docker build没有反应

    问题: 先 docker pull centos:7 拉取了一个官方的基础镜像,为后续创建jdk8镜像做准备,在创建如下的dockerfile文件 执行docker build -t jdk_8u19 ...

  5. 使用dockerfile构建镜像(docker build)

    Docker buidl .  找出当前文件夹下的Docker build文件名的文件 Docker build -t  centos(镜像名) . 在当前目录下找centos的镜像文件 Docker ...

  6. 使用Dockerfile创建ssh服务的镜像02

    使用Dockerfile创建ssh服务的镜像02 1:创建工作目录---一个镜像的所有文件都放这个目录下 ubuntu@ubuntu:~$ mkdir sshd_ubuntu ubuntu@ubunt ...

  7. Dockerfile 使用 SSH

    如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 使用 SSH Dockerfile 文件配置 为了使得 ...

  8. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  9. docker: "build" requires 1 argument. See 'docker build --help'.

    http://bbs.csdn.net/topics/391040030 docker build  --tag="ouruser/sinatra:v3" -<Dockerf ...

  10. 使用Dockerfile构建镜像-Docker for Web Developers(5)

    1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...

随机推荐

  1. 类的常成员const

    成员数据 以Human为例: 类中: 传统的初始化方式:                                                                        ...

  2. Java的lamda表达式/函数式接口/流式计算

    在我们看他人code的时候经常会看到,可能会经常看到lambda表达式,函数式接口,以及流式计算.在刚接触这些新功能时,也觉得真的有必要吗?但是现在写多了,发现这个功能确实能简化代码结构,提升编码效率 ...

  3. ProxySQL 审计

    1.审计日志 ProxySQL 2.0.5 引入了审计日志.此功能允许跟踪某些连接活动.要启用此功能,需要配置变量 mysql-auditlog_filename,也就是审计日志的文件名.此变量的默认 ...

  4. 02_快捷键及常用DOS命令

    快捷键 一. 电脑快捷键 Ctrl + C:复制 Ctrl+ V:粘贴 Ctrl+ A:全选 Ctrl+ S:保存 Ctrl+ Z:撤销 Ctrl+ X:剪切 Alt + F4:关闭窗口 Shift ...

  5. Handler机制与生产者消费者模式

    本文梳理了 Handler 的源码,并详细阐述了 Handler 与生产者消费者模式的关系,最后给出了多版自定义 Handler 实现.本文首发于简书,重新整理发布. 一.Handler Handle ...

  6. 计算机三大硬件和操作系统以及python解释器

    今日分享内容概要 计算机五大组成部分详解 计算机三大核心硬件 操作系统 编程与编程语言 编程语言的发展历史 编程语言的分类 python解释器 python解释器多版本共存 分享详细 计算机五大组成部 ...

  7. 一个好玩的deep learning Demo!

    对于生活中的熟悉的动物,我们人脑经过一次扫描,便可以得到该动物的物种!那么机器是如何识别这个图片上的动物是属于哪一物种呢? 本次实验借生活中最常见的猫和狗来探究其原理! 环境准备: tensorflo ...

  8. mac通过docker一键部署Nexus3

    目录 mac通过docker一键部署Nexus3 一.前言 二.系统配置 三.安装步骤 1.Dockerhub查看镜像地址 2.一键安装 2.1.克隆脚本 2.2.安装程序 2.2.1.程序安装详情 ...

  9. Collection接口中的方法的使用

    add(Object e):将元素e添加到集合coll中size():获取添加的元素的个数addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中clear():清 ...

  10. 后端框架学习3------SpringMVC

    springMVC学习笔记 官方文档地址:https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html# ...