浅谈docker的上下文和工作目录

 更新时间:2025年09月30日 10:31:34   作者:小董亮出你的8块腹肌吧!  
在编写Dockerfile时我们总会接触到COPY上下文和工作目录,有时候这些位置搞不清楚,本文就来介绍一下docker的上下文和工作目录,感兴趣的可以了解一下

写在前面

在编写Dockerfile时我们总会接触到COPY上下文和工作目录,有时候这些位置搞不清楚,总是让我们陷入困境,本文就一起来看下这2个路径

1:COPY上下文

Dockerfile文件的COPY指令,拷贝的源文件就是基于上下文目录来查找的,到底什么是上下文路径,我们需要先来看下,而要解释清楚什么是上下文路径,必须先看下当执行docker build时的执行流程,该流程如下:

1:将当前所在的目录打包为.tar包并发送到docker daemon
2:docker daemon将tar包解压到一个临时目录,比如docker daemon的/var/lib/tmp目录

这里tar压缩文件的最终解压目录就是我们上下文了,比如我们有如下的目录:

dongyunqi@dongyunqi-virtual-machine:~$ tree helloworld-app/
helloworld-app/
├── docker
│   ├── hello.txt
│   └── html
│       └── index.html
└── Dockerfile

2 directories, 3 files

Dockerfile如下:

dongyunqi@dongyunqi-virtual-machine:~$ cat helloworld-app/Dockerfile 
FROM busybox
COPY hello.txt .
COPY html/index.html .

然后我们在helloworld目录执行docker build,如下:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t hello-app:2.0 helloworld-app/
Sending build context to Docker daemon   5.12kB # tar包成功到docker daemon,后面就是docker daemon的工作了
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : COPY hello.txt .
COPY failed: stat /var/lib/docker/tmp/docker-builder375982663/hello.txt: no such file or directory

COPY failed: stat /var/lib/docker/tmp/docker-builder375982663/hello.txt: no such file or directory我们可以得到如下的信息:

1:docker客户端打包生成的tar包名字叫做`docker-builder375982663.tar`。
2:docker daemon解压tar包的目录是/var/lib/docker/tmp
3:这里的上下文目录是/var/lib/docker/tmp/docker-builder375982663
4:在上下文目录里无法找到文件hello.txt

其中4找不到文件的原因是,因为文件在/var/lib/docker/tmp/docker-builder375982663/docker/hello.txt,因此我们只需要修改Dockerfiie将COPY hello.txt .修改为COPY docker/hello.txt .,如下:

dongyunqi@dongyunqi-virtual-machine:~$ cat helloworld-app/Dockerfile
FROM busybox
COPY docker/hello.txt . # 修改这一行
COPY html/index.html .

运行:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t hello-app:2.0 helloworld-app/
Sending build context to Docker daemon  6.144kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : COPY docker/hello.txt .
 ---> 83989744c05c
Step 3/3 : COPY html/index.html .
COPY failed: file not found in build context or excluded by .dockerignore: stat html/index.html: file does not exist

此时找不到html/index.html,同样的问题,修改为docker/html/index.html,如下:

dongyunqi@dongyunqi-virtual-machine:~$ cat helloworld-app/Dockerfile
FROM busybox
COPY docker/hello.txt .
COPY docker/html/index.html .

运行:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t hello-app:2.0 helloworld-app/
Sending build context to Docker daemon  7.168kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : COPY docker/hello.txt .
 ---> Using cache
 ---> 83989744c05c
Step 3/3 : COPY docker/html/index.html .
 ---> Using cache
 ---> 10fa588c5565
Successfully built 10fa588c5565
Successfully tagged hello-app:2.0

到这里上下文我们已经清楚了,

2:工作目录

工作目录默认就是根目录,如下的Dockerfile验证:

dongyunqi@dongyunqi-virtual-machine:~$ cat howPwd.txt 
FROM busybox
RUN pwd

运行:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t hello-app:2.0 -f howPwd.txt helloworld-app/
Sending build context to Docker daemon  8.751kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : WORKDIR / # 这里docker daemon也输出了当前的工作目录
 ---> Running in c1d493dc5ff6
Removing intermediate container c1d493dc5ff6
 ---> 4d065957678b
Step 3/3 : RUN pwd
 ---> Running in 7fc8f9b6b35a
/  # 这里我们输出了当前工作目录是根目录
Removing intermediate container 7fc8f9b6b35a
 ---> 578d72f80d16
Successfully built 578d72f80d16
Successfully tagged hello-app:2.0

当然可以通过WORKDIR来修改工作目录,如下:

dongyunqi@dongyunqi-virtual-machine:~$ cat howPwd.txt 
FROM busybox
WORKDIR /var
RUN pwd

运行:

dongyunqi@dongyunqi-virtual-machine:~$ docker build -t hello-app:2.0 -f howPwd.txt helloworld-app/
Sending build context to Docker daemon  8.751kB
Step 1/3 : FROM busybox
 ---> 827365c7baf1
Step 2/3 : WORKDIR /var # 这里docker daemon也输出了当前的工作目录是/var
 ---> Using cache
 ---> 89da7feb392e
Step 3/3 : RUN pwd
 ---> /var # 这里我们输出了当前工作目录是/var
Successfully built 7975c01019bd
Successfully tagged hello-app:2.0

写在后面

到此这篇关于docker的上下文和工作目录的文章就介绍到这了,更多相关docker的上下文和工作目录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • docker-compose启动redis多机集群的实现(6台服务器3主3从)

    docker-compose启动redis多机集群的实现(6台服务器3主3从)

    本文主要介绍了docker-compose启动redis多机集群的实现(6台服务器3主3从),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Docker Overlay2磁盘空间占用过大清理的方法实现

    Docker Overlay2磁盘空间占用过大清理的方法实现

    随着业务量的不断增大,容器的不断启动,往往会出现磁盘空间不足,本文主要介绍了Docker Overlay2磁盘空间占用过大清理的方法实现,感兴趣的可以了解一下
    2022-03-03
  • 浅谈Docker数据持久化

    浅谈Docker数据持久化

    这篇文章主要介绍了浅谈Docker数据持久化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Docker安装node-red、导入节点、部署查看的步骤详解

    Docker安装node-red、导入节点、部署查看的步骤详解

    Node-RED设计使用的场景是IoT,但是作为一个流编排引擎,显然它能做的事情更多,比如使用容器化的方式进行构建、打包、部署等操作也是可行的,这篇文章继续介绍Docker安装node-red、导入节点、部署查看的相关知识,感兴趣的朋友一起看看吧
    2022-01-01
  • Docker从默认网络到自定义网络实现方式

    Docker从默认网络到自定义网络实现方式

    本文介绍了Docker默认网络机制的局限性,特别是IP地址动态变动导致的问题,通过创建自定义网络,可以有效解决这一问题,实现容器间通过容器名进行通信,文章详细讲解了如何创建和管理自定义网络,包括创建自定义网络、将容器加入网络、验证容器名通信等功能
    2025-12-12
  • Docker 删除镜像的实现

    Docker 删除镜像的实现

    本文主要介绍了Docker 删除镜像的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Docker核心命令与实践指南示例详解

    Docker核心命令与实践指南示例详解

    本文系统整理Docker的核心概念与常用命令,涵盖镜像管理、容器操作、数据存储、网络配置、Compose 编排以及 Dockerfile 构建等内容,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • k8s部署docker容器的实现

    k8s部署docker容器的实现

    这篇文章主要介绍了k8s部署docker容器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 两小时入门Docker教程实践

    两小时入门Docker教程实践

    这篇文章主要介绍了两小时入门Docker教程实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Docker镜像多架构构建介绍

    Docker镜像多架构构建介绍

    这篇文章主要介绍了Docker镜像多架构构建介绍,文章围绕主题展开详细的介绍,具有一点定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09

最新评论