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
构建镜像前需要一些额外的工作:
- 将要使用的 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 连接时,就束手无措了。
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的更多相关文章
- docker build 指定dockerfile
1. Dockerfile文件使用 docker build命令会根据Dockerfile文件及上下文构建新Docker镜像.构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地 ...
- Docker build Dockerfile 构建镜像 - 二
Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...
- docker使用Dockerfile构建ssh容器
一.使用Dockerfile构建centos 1.创建 Dockerfile mkdir centos # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd centos # 进入目录 ...
- 使用dockerfile文件创建镜像时docker build没有反应
问题: 先 docker pull centos:7 拉取了一个官方的基础镜像,为后续创建jdk8镜像做准备,在创建如下的dockerfile文件 执行docker build -t jdk_8u19 ...
- 使用dockerfile构建镜像(docker build)
Docker buidl . 找出当前文件夹下的Docker build文件名的文件 Docker build -t centos(镜像名) . 在当前目录下找centos的镜像文件 Docker ...
- 使用Dockerfile创建ssh服务的镜像02
使用Dockerfile创建ssh服务的镜像02 1:创建工作目录---一个镜像的所有文件都放这个目录下 ubuntu@ubuntu:~$ mkdir sshd_ubuntu ubuntu@ubunt ...
- Dockerfile 使用 SSH
如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 使用 SSH Dockerfile 文件配置 为了使得 ...
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...
- docker: "build" requires 1 argument. See 'docker build --help'.
http://bbs.csdn.net/topics/391040030 docker build --tag="ouruser/sinatra:v3" -<Dockerf ...
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...
随机推荐
- 4、StringBuilder类
StringBuilder类 一个可变的字符序列,此类提供一个与StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全). 该类被设计用作 StringBuf ...
- Coprime
Coprime 前置芝士 莫比乌斯反演 正文 首先,我们来分析题意. 题目中给出 \(n\) 个人,每个人有一个编号 \(k\) ,要求我们从中选出 \(3\) 个人,三人编号分别为 \(k_a\) ...
- Minio VS Ceph
文章转载自:https://blog.csdn.net/Moolight_shadow/article/details/123204412
- (三)JPA - EntityManager的使用
(二)JPA 连接工厂.主键生成策略.DDL自动更新 建议在需要使用时,看看之前的文章,先把环境搭起来. 4.EntityManager EntityManager 是完成持久化操作的核心对象. En ...
- 1-Mysql数据库简洁命令
1-进入mysql数据库 mysql -u root -p 2-创建数据库 mysql> CREATE DATABASE serurities_master; mysql> USE ser ...
- MySQL数据库-数据表(上)
数据表的基本操作. MySQL 数据库支持多种数据类型,大致可以分为 3 类:数值类型.日期和时间类型.字符串(字符)类型. (1)数值类型 数值类型用于存储数字型数据,这些类型包括整数类型(TINY ...
- Linux+Proton without Steam玩红警3指南
首先你需要Proton5.13 without Steam,使用说明和下载链接看这里https://www.cnblogs.com/tubentubentu/p/16716612.html 然后在/e ...
- PHP全栈开发(六):PHP与HTML页面交互
之前我们在HTML表单学习这篇文章里面创建了一个HTML页面下的表单. 这个表单是用户用来输入数据的 具体代码如下 <!DOCTYPE html> <html> <hea ...
- HYSBZ1036 [ZJOI2008]树的统计(树链剖分)
将树通过树链剖分转化成线性序列,用线段树维护最值,和值即可. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N ...
- MatrixOne Linux 编译文档
MatrixOne Linux 编译文档 编译环境 硬件环境 操作系统 内存 CPU 磁盘 Windows环境下的Linux虚拟机 Linux version 3.10.0-1160.el7.x86_ ...