如果在书写 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. KingbaseES 实现MYSQL hex/unhex 函数

    MySQL 的hex 和 unhex 函数类似于KingbaseES 的encode 和 decoding,实现字符与16进制之间的转换. 一.先看MySQL例子 mysql> select h ...

  2. KingbaseES R6 集群主机锁冲突导致的主备切换案例

    ​ 案例说明: 主库在业务高峰期间,客户执行建表等DDL操作,主库产生"AccessExclusiveLock "锁,导致大量的事务产生锁冲突,大量的会话堆积,客户端session ...

  3. 对比es6class类和构造函数

    构造函数 在原来class 类这个语法糖没有出来之前 我们一般会把方法挂在prototype 上 为了防止过多的开辟内存 1 // 构造函数------------------------------ ...

  4. 凭借SpringBoot整合Neo4j,我理清了《雷神》中错综复杂的人物关系

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 虽然距离中秋放假还要熬过漫长的两天,不过也有个好消息,今天是<雷神4>上线Disney+流媒体的日子 ...

  5. vue开发组件开发中的小技巧

    声明:以下随笔由博主自主编写,也有部分引用网友的,引用部分版权归原作者所有,其他博主原创部分禁止转载.复制全部或部分用以重新发布! vue递归组件事件阻止冒泡 其实这里主要还有递归组件的自定义事件不生 ...

  6. MasaFramework的MinimalAPI设计

    在以前的MVC引用程序中,控制器负责接收输入信息.执行.编排操作并返回响应,它是一个功能齐全的框架,它提供了过滤器.内置了模型绑定与验证,并提供了很多可扩展的管道,但它偏重,不像其它语言是通过更加简洁 ...

  7. Vmware部署Linux无人值守安装Centos7系统

    Linux - 无人值守安装服务 # 需求分析 - 使用光盘镜像来安装 Linux 系统的方式; 坦白讲, 该方法适用于只安装少量 Linux 系统的情况, 如果生产环境中有数百台服务器都需安装系统, ...

  8. linux安装Texinfo

    安装步骤 tar zxvf texinfo-5.2.tar.gz cd texinfo-5.2 ./configure --prefix=/usr make make check make insta ...

  9. 邻接矩阵bfs

    #include<bits/stdc++.h> using namespace std; int a[11][11]; bool visited[11]; void store_graph ...

  10. flinksql读写redis

    0.前言 最近有个需求,需要使用flinksql读写redis,由于官网上并没有redis的connector,在网上找了很久,开源的几个connector又没法满足要求,所有这里就自己动手实现了一个 ...