文章目录

  • 环境简介
  • 执行构建
  • 理解docker build 的工作原理
  • 最佳实践

通过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

Dockerfile build镜像的构建环境(build Context)相关推荐

  1. docker build -t_利用Dockerfile自定义镜像-图解轻松学Dockeramp;K8S

    >>>点我开始播放<<< 你好,我是老齐,本节咱们来学习使用docker file配置文件,构建属于自己的镜像.回到咱们的控制台,在这首先来看一下.上一节课我们学习 ...

  2. 华为鸿蒙操作系统学习(3):经过上次的编译发现,鸿蒙的整个项目的源代码现在使用的是v1.0版本。原来可以编译3个设备固件,但是只编译成功两个。使用Dockerfile进行源代码的构建,构建成功。

    目录 前言 1,关于鸿蒙系统 2,使用 3,使用Dockerfile进行源代码的构建 3,总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/articl ...

  3. docker build -t_在Docker环境构建、打包和运行Spring Boot应用

    为何考虑采用Docker? Docker是提供用户构建镜像的一种容器化技术,所构建的镜像包含了主要的应用程序和运行应用所需的所有依赖项.该镜像可在任何虚拟机或物理机器上的Docker容器上运行.它的强 ...

  4. containerd环境下build镜像

    containerd环境下build镜像 安装nerdctl 使用nerdctl打包docker镜像 下载安装 `buildkit` 编写systemd unit文件: 启用`buildkit.ser ...

  5. Docker系列之八:在Dockerfile中使用多段构建Muti-stage build

    系列链接 Docker系列之一:Docker介绍及在Ubuntu上安装 Docker系列之二:Docker 入门 Docker系列之三:使用Docker镜像和仓库 Docker系列之四:Dockerf ...

  6. 在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇

    每日构建,对我们团队来说一个全新的概念.随着项目开发的进展,在开发过程需要及时反馈一些BUG和功能要求的处理情况.而在这种情况下每天或隔一段时间Build一个版本,工作量还是比较大的,所以就特别有必要 ...

  7. 【Docker实战之入门】Dockerfile详细分析:构建docker镜像(4)构建动态网站WordPress...

    代码文件 [root@Optimus /]# cd docker-training/ [root@Optimus docker-training]# ls centos7 mysql php-fpm ...

  8. 使用Dockerfile为SpringBoot应用构建Docker镜像

    使用Dockerfile为SpringBoot应用构建Docker镜像 原创: 梦想de星空 macrozheng 6月17日 上次写过一篇使用Maven插件构建Docker镜像 ,讲述了通过dock ...

  9. docker镜像的构建及Dockerfile的详解应用,镜像加速器,镜像优化

    docker镜像的构建及dockerfile的祥解应用 1.镜像的构建 1.1创建一个Dockerfile 1.2构建镜像 1.3查看镜像的分层结构 1.4镜像的缓存特性 2.Dockerfile详解 ...

最新文章

  1. 期望dp ---- E. Vasya and Magic Matrix(二维转一维+前缀和优化的期望dp)
  2. pdo mysql.so不存在_PHP致命错误:找不到类’PDO’
  3. 我应该如何处理MySQL中的--secure-file-priv?
  4. 类 property属性
  5. org.apache.jasper.JasperException: Unable to compile class for JSP:
  6. 技术实践丨Prometheus+Grafana搭建HBase监控仪表盘
  7. 【python基础知识】-引入文件失败问题(同一文件夹和不同文件夹)
  8. solid 铝型材框架_solidworks铝型材库
  9. C# 控件BackColor = Color.Transparent没有透明的原因
  10. 如何在 Mac 上更改 iCloud 钥匙串的密码?
  11. 亚马逊AWS营收1700亿,阿里云213亿,差距巨大能追赶吗?...
  12. Atitit.软件仪表盘(8)--os子系统--资源占用监测
  13. 博士申请 | 美国弗吉尼亚理工大学周大为老师招收图神经网络方向全奖博士生...
  14. 西文是指什么,【英语中的复合句是指什么具体来说是指哪些类的语法知识?】作业帮...
  15. mysql库函数说明_MySQL 数据库函数库
  16. 短波红外成像技术与原理
  17. 计算机黑屏启动超慢,电脑开机很慢然后黑屏连不上网怎么办(新手可学的4种简单处理方法)...
  18. git 克隆到指定分支
  19. 【TensorFlow学习之路】一--TensorFlow基本概念
  20. Qt 中messageBox使用

热门文章

  1. 《PyTorch深度学习实践》学习笔记 【2】
  2. Spring Cloud Pipelines
  3. 超2TB缓存 Radware进军中国云安全市场
  4. H5盲盒源码商|城盲盒源码PHP+视频搭建视频部署教程
  5. 终于把进程和线程学会了
  6. 锐动视频SDK在金融业务加密双录管理系统通用解决方案
  7. 除了质量三问,如何应对质量管理5大灵魂拷问?
  8. JAVA 实现远程文件下载
  9. 【STM32学习】(23)STM32实现TELESKY 2262/2272四路无线遥控
  10. Linux中Redis的安装过程