Dockerfile build镜像的构建环境(build Context)

2023-11-09


通过dockerfile定义文件和docker build命令构建,是推荐使用的镜像构建方式。通常在执行docker build的命令时,最后会加上".", 这个被当做是当前目录的"."是指dockerfile所在的路径吗?

环境简介

假如我们有如下的结构:

  • 当前位于/root/docker/demo,该目录下有个Dockerfile,是我们即将用于构建镜像的定义文件
  • dockerfile的内容如下:从ubuntu基础镜像开始,然后试图导入待执行的jar包文件到指定目录下
  • 待导入的jar包文件目录当前dockerfile的上级目录

下面的环境帮助你理解上述

# cat Dockerfile 
FROM ubuntu:latest
#
ENV RUN_PATH /home/work/bin/demo
RUN mkdir -p $RUN_PATH

#加入待运行的包
ADD ../spring-demo-0.0.1-SNAPSHOT.jar $RUN_PATH/spring-demo-0.0.1-SNAPSHOT.jar


# pwd
/root/docker/demo
# ll
total 4
-rw-r--r--. 1 root root 302 Mar 28 10:59 Dockerfile
# tree ../
../
├── demo
│   └── Dockerfile
├── demoApp
│   ├── Dockerfile
│   └── spring-demo-0.0.1-SNAPSHOT.jar
└── spring-demo-0.0.1-SNAPSHOT.jar

执行构建

按照上述的环境及dockerfile, 执行如下构建,会发生什么了?

# docker build -t "docker/demo:v1" .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:latest
 ---> 72300a873c2c
Step 2/4 : ENV RUN_PATH /home/work/bin/demo
 ---> Using cache
 ---> 7ef7956d22f5
Step 3/4 : RUN mkdir -p $RUN_PATH
 ---> Using cache
 ---> ac1218623a72
Step 4/4 : ADD ../spring-demo-0.0.1-SNAPSHOT.jar $RUN_PATH/spring-demo-0.0.1-SNAPSHOT.jar
ADD failed: Forbidden path outside the build context: ../spring-demo-0.0.1-SNAPSHOT.jar ()

ADD命令执行失败,意思是jar包的位置超出了当前构建的上下文。在此注意如果认为docker build命令最后的"."是指构建时dockerfile的位置,这样是不准确的;实际上它是指当前的构建上下文。Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f …/Dockerfile 参数指定某个文件作为Dockerfile。

理解docker build 的工作原理

Docker实质上是一个C/S架构的程序。Docker的引擎提供了一组REST API,被称为Docker Remote API,而如docker命令这样的cli指令,则是通过API与Docker引擎交互。

当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如上文的ADD指令。而docker build 命令构建镜像,其实并非在本地构建,而是在server端,即Docker引擎中构建的。那么在这种C/S的架构中,如何才能让服务端获得本地文件呢?这就是build context(构建上下文)的意义。当构建的时候,用户会指定构建镜像上下文的路径,docker build命令得知这个路径后,会将路径下的所有内容打包,然后上传给Docker引擎。Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

因此,ADD这类指令中的源文件的路径都是基于上下文的相对路径。而当指定构建的时的上下文是".“时,自然本地的”…/"路径就超出了上下文的范围。同样
ADD /root/docker/demo/spring-demo-0.0.1-SNAPSHOT.jar $RUN_PATH/spring-demo-0.0.1-SNAPSHOT.jar 也是无法正常工作的。

那么如何修正上述错误了?
将错就错(不推荐)
那么在现有目录结构下该如何构建了?修改Dockfile如下

FROM ubuntu:latest
#
ENV RUN_PATH /home/work/bin/demo
RUN mkdir -p $RUN_PATH

#加入待运行的包
ADD ./spring-demo-0.0.1-SNAPSHOT.jar $RUN_PATH/spring-demo-0.0.1-SNAPSHOT.jar

构建:

docker build -t "docker/demo:v1" -f ../demo/Dockerfile ../

你看,如果将上一级目录("…/")作为构建上下文, 那么你需要指定dockerfile的位置,而此时ADD命令执行的是将构建环境目录下的jar包,添加到docker的指定目录下。

为什么不推荐:
如果你将一级目录("…/")作为构建上下文,那么上一级目录下的所有文件都会被打包上传至docker引擎,而demoApp目录下文件,对本次构建来说,完全是多余的,这不仅增加了构建成本,也使得构建结果镜像臃肿。

最佳实践

建一个空目录,创建Dockerfile,并将你要用的文件和所有包置于该目录下。

# tree .
.
├── Dockerfile
└── spring-demo-0.0.1-SNAPSHOT.jar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile build镜像的构建环境(build Context) 的相关文章

随机推荐

  • C++文件操作和文件流

    C 文件操作和文件流 1文件的概念 2 文件流的分类 2 打开文件 2 1 通过类对象调用 open 函数打开一个文件 2 2 通过类对象构造函数打开文件 3 关闭文件 4 读写文件 4 1 文本文件的读写 4 2 二进制文件的读写 1文件
  • ESP8266之AT指令

    一 8266作为client 1 AT 功能 测试8266能否工作 2 AT CWMODE 3 功能 设置工作模式 1 station模式 2 ap模式 3 ap station复位保存当前值 3 AT RST 功能 复位 4 AT CWL
  • Android利用AIDL实现apk之间跨进程通信

    AIDL 最广泛与最简单的应用是与四大组件之一 Serivce 的配合使用了 我们都知道 启动一个 Serivce 有两种方式 1 通过 startService 的方式 2 通过 bindService 的方式 通过 binService
  • 图像处理之目标检测入门总结

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文转自 机器学习算法那些事 本文首先介绍目标检测的任务 然后介绍主流的目标检测算法或框架 重点为Faster R CNN SSD YOLO三个检测框架 本文内容主要整理
  • linux安装自动化部署工具jenkins

    创建工程目录 mkdir home software jenkins 创建工作空间 mkdir home workspaces jenkins 进入工程目录 cd home software jenkins 下载Jenkins rpm安装包
  • 伪代码及其实例讲解

    伪代码 Pseudocode 是一种算法描述语言 使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言 Pascal C Java etc 实现 因此 伪代码必须结构清晰 代码简单 可读性好 并且类似自然语言 介于自然语言与编程
  • 基于svg.js实现对图形的拖拽、选择和编辑操作

    本文主要记录如何使用 svg js 实现对图形的拖拽 选择 图像渲染及各类形状的绘制操作 1 关于SVG SVG 是可缩放的矢量图形 使用XML格式定义图像 可以生成对应的DOM节点 便于对单个图形进行交互操作 比CANVAS更加灵活一点
  • 分享一下Python数据分析常用的8款工具

    Python是数据处理常用工具 可以处理数量级从几K至几T不等的数据 具有较高的开发效率和可维护性 还具有较强的通用性和跨平台性 Python可用于数据分析 但其单纯依赖Python本身自带的库进行数据分析还是具有一定的局限性的 需要安装第
  • 移动端开发技术小结(前端)

    移动端开发技术小结 前端 移动端处理webkit内核即可 浏览器的私有前缀只需要考虑添加 webkit 布局视口 视觉视口 理想视口 将布局宽度改为视觉视口 图片 2倍图 3倍图 背景缩放 background size 背景图片宽度 背景
  • windows 系统安装sonarqube

    SonarQube是一种自动代码审查工具 用于检测代码中的错误 漏洞和代码异味 它可以与您现有的工作流程集成 以便在项目分支和拉取请求之间进行连续的代码检查 官方网站 https www sonarqube org 1 使用前提条件 运行S
  • FTP-读取指定目录下的文件,上传到FTP服务器,一键复制黏贴,就是这么丝滑~

    背景 需要定时将服务器下的日志文件上传到指定FTP服务器的目录下 并通知第三方平台文件已上传 FTP服务器模拟工具 application yml配置 spring logfilepath home jboss server default
  • Cesium Terrain Builder (CTB) 简单使用_地形切片

    Cesium Terrain Builder CTB 简单使用 地形切片 目录 Cesium Terrain Builder CTB 简单使用 地形切片 官网地址 win r cmd 打开命令提示符工具运行 Create a GDAL Vi
  • windows计算机无法打开,为什么我的电脑无法运行Win11?原因可能是这个

    原标题 为什么我的电脑无法运行Win11 原因可能是这个 为什么我的电脑无法运行Win11 原因可能是这个 微软已经在日前正式发布Windows 11操作系统 虽然新系统的更新升级与发布并非同步进行 甚至现在连官方都未公开预览版 但由于此前
  • eccms静态页面出现出现基础链接已关闭,无法链接到远程服务器错误的解决办法

    出现 基础链接已关闭 无法链接到远程服务器 错误 一 系统组件错误 如果属于系统Socket组件错误 可以重启socket组件 netsh winsock reset 进行解决 二 实际发生的原因 由于实际情况所需 禁止服务器访问外网 解决
  • 【C++笔记】《C++编程思想-卷一》笔记

    C 编程思想 笔记 Volume 1 第一章 对象导言 OOP ObjectOriented Programming 面对对象编程 UML Unified Model Language 统一建模语言 堆 stack 和栈 heap 预备知识
  • dgl 操作

    dgl图的基本操作 dgl简单使用 udf函数怎么写 通过edges 打得到两端的列表 将所有nodes换成edges 截错图了 通过nodes则不是很好使 返回很多的tensor原因是这个函数运行好几遍
  • Seq2Seq模型学习(pytorch)

    在看pytorch的官方英文例子 做些笔记 如有纰漏请指正 原文 https pytorch org tutorials beginner chatbot tutorial html 数据准备 首先是单词编码 seq2seq的单词编码的方式
  • 02-线性结构3 Reversing Linked List(PTA)

    02 线性结构3 Reversing Linked List 25 point s Given a constant K and a singly linked list L you are supposed to reverse the
  • MacOS 安装、卸载Homebrew

    MacOS 安装 卸载Homebrew 1 Homebrew官网地址 2 安装 在终端中输入下列代码 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew ins
  • Dockerfile build镜像的构建环境(build Context)

    文章目录 环境简介 执行构建 理解docker build 的工作原理 最佳实践 通过dockerfile定义文件和docker build命令构建 是推荐使用的镜像构建方式 通常在执行docker build的命令时 最后会加上 这个被当