Dockerfile 使用 SSH docker build

如果在书写 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
  1. 开启 Docker Buildkit 功能:
DOCKER_BUILDKIT = 1
  1. 使用 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 使用 SSH docker build

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

参考

Dockerfile 使用 SSH docker build

Original: https://www.cnblogs.com/astrofeyx/p/dockerfile-ssh-docker-build-ssh.html
Author: 徐风吟
Title: Dockerfile 使用 SSH docker build

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582470/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 设计模式——中介者模式

    中介者模式定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Mediator抽象中介者角色 抽象中…

    Linux 2023年6月7日
    088
  • LAMP 架构介绍及环境搭建

    1、LAMP 架构介绍及环境搭建 1.LAMP分别代表什么? L代表服务器操作系统使用Linux A代表网站服务使用的是Apache软件基金会中的httpd软件 M代表网站后台使用…

    Linux 2023年6月7日
    0115
  • 11-K8S部署普罗米修斯

    K8S-Kubernetes 集群部署 Prometheus 和 Grafana 1.实验环境 控制节点/master01 192.168.80.20 工作节点/node01 19…

    Linux 2023年6月13日
    095
  • MySql集群之读写分离配置

    一、主从复制原理 二、环境准备 192.168.140.131 主库 192.168.140.132 从库 三、主库配置 1、修改配置文件 /etc/my.cnf #mysql服务…

    Linux 2023年6月14日
    099
  • k8s-简介

    Kubenetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统,K8s 作为缩写的结果来自计算”K”和”s”之间的八个…

    Linux 2023年6月13日
    092
  • flask操作(增删改查操作)

    增加数据 from .models import Goods from app.extensions import db goods1 = Goods(name=’魅族18s’, …

    Linux 2023年6月8日
    0109
  • CentOS——Redis远程连接可视化工具Rdis Desktop Manage

    前排提示 Centos没有安装Redis的可参考 https://www.cnblogs.com/tianhengblogs/p/15265028.html 一。 修改redis….

    Linux 2023年5月28日
    0173
  • Linux 进程卡住了怎么办?

    在我们使用 Linux 系统时,如果网络或者磁盘等 I/O 出问题,会发现进程卡住了,即使用 kill -9 也无法杀掉进程,很多常用的调试工具,比如 strace, pstack…

    Linux 2023年5月27日
    093
  • WEB自动化-10-Page Object 模型

    10 Page Object 模型 10.1 概述 在针对一个WEB页面编写自动化测试用例时,需要引用页面中的元素( 数据)才能进行操作( 动作)并显示出页面内容。如果编写的测试用…

    Linux 2023年6月7日
    092
  • shell 脚本 根据PID过滤查看进程所有信息

    根据PID过滤查看进程所有信息 #!/bin/bash read -p "输入要查询的PID: " P #筛选第二列等于输入的PID号 n=ps aux | a…

    Linux 2023年5月27日
    0125
  • 【windows】在windows右键菜单加入在当前路径打开cmd功能?

    在Ubuntu中可以在一般目录下点击右键选中Open in Terminal即可打开一个命令终端,由于自己平常在windows上开发时也常常使用cmd命令行进行操作,但是每次都需要…

    Linux 2023年6月13日
    0112
  • 大华海康NVR录像JAVA下载及WEB播放

    近期在处理一个将NVR录像机上的录像下载到服务器并通过浏览器播放的需求。 梳理记录下过程,做个备忘,同时遇到的一些细节问题解决,也供需要的同学参考。 需求比较简单,就是把指定时间段…

    Linux 2023年6月13日
    0163
  • Ceph创建一个新集群 报错: File “/usr/bin/ceph-deploy”, line 18, in……….

    [root@ceph-node1 ceph]# ceph-deploy new node1 Traceback (most recent call last): File &quo…

    Linux 2023年6月13日
    0104
  • 记录一次shell脚本环境全局变量在函数内部生效问题

    背景 计划核对内网IP的使用情况,所以写了个小脚本扫描有哪些IP还在使用。执行脚本过程中发现函数中一直获取不到变量的值,排查后将结论记录下来。 问题现象 全局变量已配置,但在函数中…

    Linux 2023年5月27日
    082
  • Samba:文件共享

    samba:现主要用于Linux与Windows之间的文件共享。 samba的特点: 用于Linux与Windows之间进行文件共享和打印机共享 不仅用于Windows之间的文件共…

    Linux 2023年6月13日
    0117
  • 如何使用yum来下载RPM包而不进行安装

    yum是基于Red Hat的系统(如CentOS、Fedora、RHEl)上的默认包管理器。使用yum,你可以安装或者更新一个RPM包,并且他会自动解决包依赖关系。但是如果你只想将…

    Linux 2023年6月6日
    0168
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球