博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker-Context
阅读量:5785 次
发布时间:2019-06-18

本文共 4971 字,大约阅读时间需要 16 分钟。

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

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

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

    [qidai@qidai-pc cc]$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              881bd08c0b08        9 days ago          109MBubuntu              latest              47b19964fb50        5 weeks ago         88.1MBcentos              latest              1e1148e4cc2c        3 months ago        202MB[qidai@qidai-pc cc]$ tree ..└── file0 directories, 1 file[qidai@qidai-pc cc]$ docker build -t x:x -f file .Sending build context to Docker daemon  2.048kBStep 1/2 : FROM nginx ---> 881bd08c0b08Step 2/2 : RUN touch succ / ---> Running in a57757a928f2Removing intermediate container a57757a928f2 ---> 8ce68f7c4572Successfully built 8ce68f7c4572Successfully 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    └── file1 directory, 1 file[qidai@qidai-pc test]$ docker build -t s:s -f cc/file .Sending build context to Docker daemon   2.56kBStep 1/2 : FROM nginx ---> 881bd08c0b08Step 2/2 : RUN touch succ / ---> Running in ef1fa8e3bb07Removing intermediate container ef1fa8e3bb07 ---> 416623a1c3f7Successfully built 416623a1c3f7Successfully 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.56kBError 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    └── file1 directory, 1 file[qidai@qidai-pc test]$ docker build -t s:s -f cc/file .Sending build context to Docker daemon   2.56kBStep 1/2 : FROM nginx ---> 881bd08c0b08Step 2/2 : RUN touch succ / ---> Running in ef1fa8e3bb07Removing intermediate container ef1fa8e3bb07 ---> 416623a1c3f7Successfully built 416623a1c3f7Successfully tagged s:s
    • 更改构建路径

      [qidai@qidai-pc test]$ docker build -t s:s -f cc/file ccSending build context to Docker daemon  2.048kBStep 1/2 : FROM nginx ---> 881bd08c0b08Step 2/2 : RUN touch succ / ---> Using cache ---> 416623a1c3f7Successfully built 416623a1c3f7Successfully tagged s:s[qidai@qidai-pc test]$ docker build -t s:s -f cc/  ccSending build context to Docker daemon  2.048kBError 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.56kBStep 1/1 : FROM nginx ---> 881bd08c0b08Successfully built 881bd08c0b08Successfully 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/testSending build context to Docker daemon   2.56kBStep 1/1 : FROM nginx ---> 881bd08c0b08Successfully built 881bd08c0b08Successfully tagged s:s
  9. 知道了路径问题后,我们再来看一下Dockerfile中的文件问题,拿COPY指令来说

    • 构建文件内容如下

      FROM nginxCOPY cc/file /file.bak
    • 构建过程

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

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

markdown_img_paste_20190315141029959

转载地址:http://kntyx.baihongyu.com/

你可能感兴趣的文章
python udp编程实例
查看>>
TortoiseSVN中图标的含义
查看>>
Tasks and Back stack 详解
查看>>
关于EXPORT_SYMBOL的作用浅析
查看>>
成功的背后!(给所有IT人)
查看>>
在SpringMVC利用MockMvc进行单元测试
查看>>
Nagios监控生产环境redis群集服务战
查看>>
Angular - -ngKeydown/ngKeypress/ngKeyup 键盘事件和鼠标事件
查看>>
Android BlueDroid(一):BlueDroid概述
查看>>
Java利用httpasyncclient进行异步HTTP请求
查看>>
宿舍局域网的应用
查看>>
html代码究竟什么用途
查看>>
Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)
查看>>
Python version 2.7 required, which was not foun...
查看>>
context:annotation-config vs component-scan
查看>>
exgcd、二元一次不定方程学习笔记
查看>>
经典sql
查看>>
CSS3边框会动的信封
查看>>
JavaWeb实例设计思路(订单管理系统)
查看>>
source insight中的快捷键总结
查看>>