Docker-Context

简介: 在 Docker-Dockerfile入门 - 1 中我们提到了build中.的作用,当时说的是代表当前目录其实说的并不准确具体,我们今天来说一下这个问题,如果理解不对请指正之前提到了Docker context ,那么这到底是个什么东西,有什么作用,在 <>中大致意思是这样解释的:表面在...
  1. 在 Docker-Dockerfile入门 - 1 中我们提到了build中.的作用,当时说的是代表当前目录其实说的并不准确具体,我们今天来说一下这个问题,如果理解不对请指正
  2. 之前提到了Docker context ,那么这到底是个什么东西,有什么作用,在 <>中大致意思是这样解释的:

    表面在本机执行docker build,但是其实是有一个docker daemon在运行的,所以你所执行的命令与产生的结果都是与docker服务交互后的结果,这是一种C/S架构的东西,所以构建其实并非是在本地执行,而是在服务端完成的

  3. 所以我们指定了.这个上下文路径后,docker会根据这个上下文路径来去构建镜像,我们来测试一下
  4. 首先最简单的构建操作如下

    [qidai@qidai-pc cc]$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              881bd08c0b08        9 days ago          109MB
    ubuntu              latest              47b19964fb50        5 weeks ago         88.1MB
    centos              latest              1e1148e4cc2c        3 months ago        202MB
    [qidai@qidai-pc cc]$ tree .
    .
    └── file
    0 directories, 1 file
    [qidai@qidai-pc cc]$ docker build -t x:x -f file .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM nginx
     ---> 881bd08c0b08
    Step 2/2 : RUN touch succ /
     ---> Running in a57757a928f2
    Removing intermediate container a57757a928f2
     ---> 8ce68f7c4572
    Successfully built 8ce68f7c4572
    Successfully tagged x:x
    • tree:linux命令,列出当前目录结构
    • 同时我们也知道了用来构建的文件不一定是叫Dockerfile,Dockerfile只是docker的默认文件名而已
  5. 刚才为docker指定了上下文,为.,这时候docker知道这个路径后, docker会将这个目录下的所有东西打包上传到服务端,然后进行解析构建
  6. 现在我们全部用错误的构建来说明docker的context路径问题,
  7. 先说一下 -f 参数的问题

    • 构建如下

      [qidai@qidai-pc cc]$ cd ..
      [qidai@qidai-pc test]$ tree .
      .
      └── cc
          └── file
      1 directory, 1 file
      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file .
      Sending build context to Docker daemon   2.56kB
      Step 1/2 : FROM nginx
       ---> 881bd08c0b08
      Step 2/2 : RUN touch succ /
       ---> Running in ef1fa8e3bb07
      Removing intermediate container ef1fa8e3bb07
       ---> 416623a1c3f7
      Successfully built 416623a1c3f7
      Successfully tagged s:s
    • 更改构建路径

      [qidai@qidai-pc test]$ docker build -f s:s -f cc/nofile .
      unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /run/media/qidai/_yingpan/test/cc/nofile: no such file or directory
      [qidai@qidai-pc test]$ docker build -t s:s -f cc .
      Sending build context to Docker daemon   2.56kB
      Error response from daemon: unexpected error reading Dockerfile: read /var/lib/docker/tmp/docker-builder684771877/cc: is a directory
    • 如上我们就很清楚了,首先-f参数指定的Dockerfile的具体路径在本地是必须存在的,这个无可质疑,如果本地都不存在那么本地的机器就会跟你爆出不存在的错误,其次那就是本地存在,而且本地不报错了,这就通过过了第一步的本地审查,所以就打包上传到docker服务器,在服务器中解析,发现cc并不是具体的构建文件的路径,所以会给你再次报错,我们从两次的报错中的路径也可以看出来,/run/media是本地检查,而/var/lib/tmp/...是docker的检查
  8. 然后我们在说一下后面的.的问题

    • 构建如下

      [qidai@qidai-pc cc]$ cd ..
      [qidai@qidai-pc test]$ tree .
      .
      └── cc
          └── file
      1 directory, 1 file
      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file .
      Sending build context to Docker daemon   2.56kB
      Step 1/2 : FROM nginx
       ---> 881bd08c0b08
      Step 2/2 : RUN touch succ /
       ---> Running in ef1fa8e3bb07
      Removing intermediate container ef1fa8e3bb07
       ---> 416623a1c3f7
      Successfully built 416623a1c3f7
      Successfully tagged s:s
    • 更改构建路径

      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file cc
      Sending build context to Docker daemon  2.048kB
      Step 1/2 : FROM nginx
       ---> 881bd08c0b08
      Step 2/2 : RUN touch succ /
       ---> Using cache
       ---> 416623a1c3f7
      Successfully built 416623a1c3f7
      Successfully tagged s:s
      [qidai@qidai-pc test]$ docker build -t s:s -f cc/  cc
      Sending build context to Docker daemon  2.048kB
      Error response from daemon: unexpected error reading Dockerfile: read /var/lib/docker/tmp/docker-builder657763113: is a directory
    • 如上,我们给出的context路径其实是上传后的服务器的相对路径,当给出的context为cc的时候,那么docker就会在context_path/cc/ 下去找构建文件,这时候会根据-f参数去找构建文件,然后开始构建, 而上面第二次构建就不行了,依旧传入的context为cc,然后根据-f找构建文件,但是-f并没有具体指定文件,所以构建失败
    • 当然也可以指定本机的绝对路径为docker的context路径,如下

      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file .
      Sending build context to Docker daemon   2.56kB
      Step 1/1 : FROM nginx
       ---> 881bd08c0b08
      Successfully built 881bd08c0b08
      Successfully tagged s:s
      [qidai@qidai-pc test]$ pwd
      /run/media/qidai/_yingpan/test
      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file /run/media/qidai/_yingpan/test
      Sending build context to Docker daemon   2.56kB
      Step 1/1 : FROM nginx
       ---> 881bd08c0b08
      Successfully built 881bd08c0b08
      Successfully tagged s:s
  9. 知道了路径问题后,我们再来看一下Dockerfile中的文件问题,拿COPY指令来说

    • 构建文件内容如下

      FROM nginx
      COPY cc/file /file.bak
    • 构建过程

      [qidai@qidai-pc test]$ tree .
      .
      └── cc
          └── file
      1 directory, 1 file
      [qidai@qidai-pc test]$ docker build -t a:a -f cc/file .
      Sending build context to Docker daemon   2.56kB
      Step 1/2 : FROM nginx
       ---> 881bd08c0b08
      Step 2/2 : COPY cc/file /file.bak
       ---> 9b5b8bcc0246
      Successfully built 9b5b8bcc0246
      Successfully tagged a:a
    • 如果我们将COPY的源目的地址改一下呢 ?,如下

      [qidai@qidai-pc test]$ touch /home/qidai/tempFile   #本机新建一个文件
      [qidai@qidai-pc test]$ cat cc/file
      FROM nginx
      COPY /home/qidai/tempFile /file.bak  #想法是将本机内的指定文件复制到容器
      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file .
      Sending build context to Docker daemon   2.56kB
      Step 1/2 : FROM nginx
       ---> 881bd08c0b08
      Step 2/2 : COPY /home/qidai/tempFile /file.bak
      COPY failed: stat /var/lib/docker/tmp/docker-builder527470065/home/qidai/tempFile: no such file or directory
    • 如上我们就可以看到了,构建文件中也是应用的是context的相对路径,所以想将我们的文件复制到容器内只能是将文件放入我们指定的context目录下(COPY 和 ADD 命令不能拷贝上下文之外的本地文件)
  10. 下面是我自己画的一张图,更直观的展示了Docker命令和目录路径之间的关联,如果有异议请评论指出,谢谢

markdown_img_paste_20190315141029959

目录
相关文章
|
2月前
|
人工智能 弹性计算 安全
阿里云新用户、老用户与企业用户定义及优惠活动政策完整解析,权益申领与实操避坑全指南
很多用户开通账号之后,分不清新用户、老用户、企业用户的判定标准,常常出现抢到活动资格却无法下单、误以为注册新账号就属于新用户、续费之后价格暴涨、企业补贴不知道如何申领等各类问题。不同身份对应的免费试用、首购特价、续费同价、大额券包、专项扶持政策差异巨大,如果不理解底层规则,很容易错过优惠,甚至产生不必要的成本支出。本文系统梳理三类用户的官方判定标准,完整拆解每一类身份可以享受到的全套优惠权益,包含服务器特价实例、免费试用资源、优惠券包、迁云补贴、AI算力扶持,同时给出实操步骤、服务器初始化命令脚本,整理高频踩坑点,帮助个人开发者、站长、小微企业结合自身账号身份选择最合适的上云方案,最大化降低云
448 0
|
5月前
|
前端开发 JavaScript Serverless
阿里云宜搭对接使用完全指南:六大集成路径深度解析
本文系统性地阐述了阿里云宜搭低代码开发平台与外部系统对接的六大技术路径与实践方案。文章从宜搭的架构特性出发,深入讲解了连接器机制、远程API调用、数据源配置、服务回调、OpenAPI开放接口以及FaaS函数计算集成等核心对接方式。通过详细的配置步骤、丰富的代码示例(涵盖Java、Python、JavaScript、Node.js等语言)和真实业务场景的剖析,帮助开发者全面掌握宜搭的集成能力。文章还涵盖了鉴权配置、跨域处理、性能优化、安全管控等高级话题,并提供了常见问题的解决方案。无论是简单的数据查询同步,还是复杂的业务流程编排,读者都能从中找到适合的对接策略与实施方法。
|
3月前
|
人工智能 弹性计算 安全
从试点到规模化:2026企业级Agent解决方案落地路径全解析
2026年是企业级AI智能体规模化落地关键年。本文以瓴羊AgentOne为标杆,解析从PoC到生产的四大突破:长时任务、多Agent协同、弹性伸缩与全链路可观测,并提出“模型-技能-执行”三层解耦架构,强调场景优先、数据先行、安全内嵌、人机协同,助力企业真正实现AI增效。
|
6月前
|
应用服务中间件 文件存储 nginx
测试 NAS 容器服务恢复时的 Docker Compose 排查记录
节后恢复NAS测试环境,Jellyfin、PhotoPrism、Home Assistant容器页面异常。本文记录分层排查过程:从磁盘空间、镜像拉取、Compose状态,到挂载路径、端口连通性及Nginx反向代理配置,精准定位三处问题并修复。(239字)
|
12月前
|
人工智能 供应链 算法
跨境商家多平台运营的三大致命陷阱及破局方案(库存失控、合规失守、成本虚高)
多平台运营成跨境主流,却暗藏库存、合规、成本三大陷阱。营收增长背后,超七成商家因管理失当亏损。本文结合上市公司案例与智能工具应用,剖析致命痛点并提供可落地方案,揭示精细化运营才是破局关键。
736 0
|
9月前
|
数据采集 人工智能 自然语言处理
从 0 到 1 打造 AI Agent 攻坚团队:体系化培训流程与人才成长路径
本培训体系面向阿里云企业开发者,聚焦AI Agent工程化落地,涵盖统一技术认知、提示工程、协同工作流、闭环评估、沙盘实战及人才成长路径六大模块,打造可复用方法论与可持续进化的人才梯队。
735 3
|
10月前
|
SQL 运维 监控
上线前检查清单模板及工具指南:告别手忙脚乱,实现稳定发布
上线前检查清单是避免线上事故的关键。本文提供可落地的四阶段检查模板,涵盖代码、配置、部署与协作,并通过工具化、复盘机制让清单真正生效,帮助团队建立质量护城河,将严谨流程转化为开发习惯。
|
传感器 人工智能 边缘计算
AI赋能油田巡检——无人机视频监控系统的技术解析
无人机油田巡检系统融合无人机硬件与AI视频监控技术,实现全域覆盖、智能分析和高效管理。通过多旋翼/固定翼无人机搭载高分辨率摄像头及传感器,采集多维数据;结合YOLOv9等算法进行异常检测,准确率高达98%。系统支持5G实时传输、边缘计算及集中化管理平台,提供可视化监控与预测性维护。基于开源框架设计,灵活扩展且成本低,大幅提升油田巡检效率与安全性。
1497 0
|
人工智能 API 开发工具
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
3957 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
|
XML 前端开发 Java
SpringBoot整合Flowable【04】- 通过代码控制流程流转
本文介绍了如何使用Flowable的Java API控制流程流转,基于前文构建的绩效流程模型。首先,通过Flowable-UI导出模型文件并部署到Spring Boot项目中。接着,详细讲解了如何通过代码部署、启动和审批流程,涉及`RepositoryService`、`RuntimeService`和`TaskService`等核心服务类的使用。最后,通过实际操作演示了流程从部署到完成的全过程,并简要说明了相关数据库表的变化。本文帮助读者初步掌握Flowable在实际业务中的应用,后续将深入探讨更多高级功能。
2680 0
SpringBoot整合Flowable【04】-  通过代码控制流程流转