首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么docker build在中间容器中运行一个命令,然后该命令被移除,从而导致该命令被忽略?

Docker是一种轻量级的容器化技术,通过使用Docker可以将应用程序及其依赖项打包成一个独立的容器,实现跨平台、快速部署和可移植性。在使用Docker构建镜像时,可以通过Dockerfile文件定义构建过程,其中的每个指令都会在一个中间容器中执行。

当使用Dockerfile中的RUN指令运行一个命令时,Docker会创建一个临时的中间容器,并在该容器中执行该命令。执行完毕后,Docker会将中间容器的状态保存为一个新的镜像层,并将该层作为下一步构建的基础。然而,由于Docker的设计理念是构建不可变的镜像,因此中间容器在执行完命令后会被自动移除,只保留命令的结果。

这种设计有以下几个优势:

  1. 减小镜像大小:中间容器被移除后,不会保留任何多余的文件或状态,从而减小了最终镜像的大小。
  2. 提高构建速度:由于中间容器的移除,构建过程中不会产生额外的镜像层,从而加快了构建速度。
  3. 避免构建过程中的干扰:中间容器的移除可以确保每个构建步骤都在一个干净的环境中执行,避免了前一步骤对后续步骤的影响。

然而,这也意味着在构建过程中运行的命令不会对最终镜像产生持久化的影响。如果需要在最终镜像中保留某个命令的效果,可以通过其他方式实现,例如在Dockerfile中使用COPY指令将命令的结果复制到最终镜像中。

总结起来,Docker在构建过程中使用中间容器执行命令并移除中间容器的设计,旨在减小镜像大小、提高构建速度和避免构建过程中的干扰。这种设计使得Docker成为一种高效、可靠的容器化解决方案。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云容器服务(Tencent Kubernetes Engine,TKE):提供高度可扩展的容器管理服务,支持快速部署、自动伸缩和高可用性。详情请参考:https://cloud.tencent.com/product/tke
  • 腾讯云云服务器(CVM):提供弹性计算能力,可快速创建和管理云服务器实例,适用于各种应用场景。详情请参考:https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(Cloud Object Storage,COS):提供安全、稳定、低成本的对象存储服务,适用于海量数据存储和访问。详情请参考:https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Docker 应用实践-镜像篇

镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。 首先,需要先从镜像仓库服务拉取镜像。...常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务; 然后,拉取操作会将镜像下载到本地 Docker 主机,可以使用镜像启动一个或者多个容器。...如果运行容器修改了现有的一个已存在的文件,那该文件将会从可写层下的只读层复制到可写层,该文件的只读版本仍然存在,只是已经可写层该文件的副本所隐藏。...镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构, 镜像分层结构特点/注意事项: 基础镜像层共享的,一般基础镜像层都是根据构建镜像的环境来生成的...# 语法 $ docker rmi [OPTIONS] IMAGE [IMAGE...] OPTIONS 说明: -f:强制删除; –no-prune:不移除镜像的过程镜像,默认移除

54710
  • Docker 学习手册

    容器:Container,容器和镜像的区别就是镜像的外面多了一层可读写的 layer。但容器未必是要在运行状态的。 基本命令有哪些?...前者可以 block,后者强制。 rm 和 rmi: 前者移除容器的可读写层,只能针对非运行状态的容器。 后者可以移除镜像的只读层,但只能移除最顶层镜像,用 -f 可以移除中间层。...CMD 就一条,就算写了多条,前面的 CMD 都会被忽略,而且 docker run 的启动命令后加上命令,Dockerfile 里的这一句会被忽略。...ARG[=]:设置环境变量名,可以 docker run 命令通过 --build-arg 来传进去。...EXPOSE: 运行容器时,暴露出来的端口,但其实 EXPOSE 只是一个容器端口的声明,真正映射出去的,是在运行 docker 的时候 -p : 开的。

    1.9K40

    【云原生 | Docker篇】轻松学会生存技巧 -- 命令(二)

    / 命令 作用 attach 绑定到运行容器的标准输入,输出,以及错误流(这样似乎也能进入容器内容,但是一定小心,他们操作的就是控制台,控制台的退出命令会生效,比如redis,nginx..) build...push 给registry推送一个image或者repository rename 重命名一个容器 restart 重启一个或者多个容器 rm 移除一个或者多个容器 rmi 移除一个或者多个镜像 run...,需要知道之前的启动命令docker ps --no-trunc),然后再用下面启动。...是根据一个Dockerfile构建出镜像 commit 是正在运行容器提交成一个镜像 容器的状态 Created(新建)、Up(运行)、Pause(暂停)、Exited(退出) docker...但是不考虑Docker守护进程启动时就已经停止了的容器 2、docker exec 在运行容器执行命令 语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG

    635131

    Docker Compose 命令详解

    restart 重启项目中的服务 rm 删除所有停止状态的服务容器 run 指定服务上运行一个命令 scale 设置指定服务运行容器个数 stop 停止处于运行状态的容器 start 启动stop...服务容器一旦构建后,将会带上一个标记名,例如对于web项目中的一个db容器,可能是web_db。 可以随时项目目录下运行docker-compose build 来重新构建服务。...如果用户不希望容器停止并重新创建,可以使用 docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。...选项: -f:不要求确认移除; -s:删除前停止项目中的所有容器; -v:删除任何附加到容器的匿名卷; run 指定服务上运行一个命令 格式为: [root@centos01 ~]# docker-compose...默认情况下,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已经在运行

    4.6K20

    Docker 总结 ubuntu

    DEST_PATH存在并且是一个文件 目标源文件的内容覆盖 DEST_PATH存在并且是一个目录 使用来自的基本名称将文件复制到此目录 SRC_PATH SRC_PATH指定目录 DEST_PATH...不存在 DEST_PATH创建为一个目录,并且源目录的内容被复制到这个目录 DEST_PATH存在并且是一个文件 错误情况:无法将目录复制到文件 DEST_PATH存在并且是一个目录 SRC_PATH...通过 [docker commit] 命令来提交一个基于当前容器状态的新镜像 使用 [docker export] 命令来将容器导出到系统文件并压缩成 tar,之后可以根据 tar 文件使用 docker...# 移除数据卷 数据卷 是设计用来持久化数据的,它的生命周期独立于容器Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。...如果需要在删除容器的同时移除数据卷。可以删除容器的时候使用 docker rm -v 这个命令

    2.2K30

    docker-compose

    服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。 可随时项目目录下运行 docker-compose build 来重新构建服务。...down 此命令将会停止 up 命令所启动的容器,并移除网络 exec 进入指定的容器。 images 列出 Compose 文件包含的镜像。...指定服务上执行一个命令。...默认情况下,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已经在运行命令类似启动容器运行指定的命令,相关卷、链接等等都将会按照配置自动创建。...如果用户不希望容器停止并重新创建,可以使用 docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。

    3K43

    Docker重学系列之Dockerfile

    使用 Dockerfile 构建镜像时最好是将 Dockerfile 放置一个新建的空目录下。然后将构建镜像所需要的文件添加到目录。...指定一个容器启动时要运行命令 ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及其参数 ---- FROM 命令 基于哪个镜像进行构建新的镜像,构建时会自动从docker hub拉取...这就是对 Dockerfile 构建分层存储的概念不了解所导致的错误。 之前说过每一个 RUN 都是启动一个容器、执行命令然后提交存储层文件变更。...下面解释一下什么是匿名卷 具名挂载和匿名挂载 ---- CMD 命令容器启动命令 首先思考一个问题,为什么我们下载一个tomcat镜像后,通过docker run 命令就可以直接运行一个tomcat...服务容器的ip,这里我们改为容器名 使用容器名连接的前提时,两个容器运行在同一个自定义网桥里面才可以 将两个容器放入一个自定义网络 创建自定义网络 docker network create

    1.9K30

    深入理解docker容器与镜像

    下面这张图片展示了一个运行容器(灰色区域为容器 运行的进程 )。图片一个容器的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。...图片一个容器的元数据好像是分成了很多文件,但或多或少能够/var/lib/docker/containers/目录下找到,就是一个可读层的id。...docker stop 图片docker stop命令会向 运行容器 发送一个SIGTERM的信号,然后停止所有的进程。...docker rm 图片删除一个或多个容器docker rm命令移除构成容器的可读写层。注意,这个命令只能对非运行容器执行。...循环中的每一步都会生成一个新的层,因此许多新的层会被创建。docker exec 图片docker exec 命令会在运行容器执行一个新进程。

    96920

    Docker学习笔记(2)

    1.docker build 用于使用Dockerfile文件创建镜像,是一个比较常用和重要的命令,关于Dockerfile文件如何定制化,后续会写一篇文专门讲。...images -a images 3.docker rmi docker rmi命令用于删除镜像,删除镜像时,如果已有基于镜像启动的容器存在,则无法直接删除,需要先用rm命令删除容器。...这两个子命令都提供 -f 选项,可强制删除存在容器的镜像或启动容器docker rmi [OPTIONS] IMAGE [IMAGE...]...-f:强制删除 --no-prune:不移除镜像的过程镜像,默认移除 示例 删除ubuntu:16.04镜像: [root@localhost ~]# docker rmi ubuntu:16.04...days ago109MB load 6.docker commit docker commit命令可以将一个容器固化为一个新的镜像。

    46720

    Docker入门(八):三剑客之Docker Composes使用

    可以随时项目目录下运行 docker-compose build 来重新构建服务。...--services: 打印服务名,一行一个验证和查看compose文件配置。3. down作用:此命令将会停止 up 命令所启动的容器,并移除网络。...默认情况下,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已经在运行。选项:-d后台运行,输出容器名。--name NAME 为容器指定一个名字。...链接的服务都将会被自动启动,除非已经处于运行状态。可以说,大部分时候都可以直接通过命令来启动一个项目。...如果用户不希望容器停止并重新创建,可以使用 docker-compose up --no-recreate 。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。

    51730

    Docker Compose 安装及使用教程

    项目 (project):由一组关联的应用容器组成的一个完整业务单元, docker-compose.yml 文件定义。...服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。 可以随时项目目录下运行 docker-compose build 来重新构建服务。...down 此命令将会停止 up 命令所启动的容器,并移除网络 exec 进入指定的容器。 help 获得一个命令的帮助。 images 列出 Compose 文件包含的镜像。...默认情况下,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已经在运行命令类似启动容器运行指定的命令,相关卷、链接等等都将会按照配置自动创建。...如果用户不希望容器停止并重新创建,可以使用 docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。

    2.9K10

    Docker学习——Docker 三剑客(七) 顶

    服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是web_db。 可以随时项目目录下运行 docker-compose build 来重新构建服务。...down 此命令将会停止 up 命令所启动的容器,并移除网络 exec 进入指定的容器。 help 获得一个命令的帮助。 images 列出 Compose 文件包含的镜像。...指定服务上执行一个命令。...默认情况下,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已经在运行命令类似启动容器运行指定的命令,相关卷、链接等等都将会按照配置自动创建。...如果用户不希望容器停止并重新创建,可以使用 docker-compose up --norecreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。

    1.1K10

    Docker是什么?

    文件系统分离,每一个进程容器完全分离的root权限的文件系统下 资源分离,系统资源(像CPU、内存)能指定的 分配给每一个进程容器,使用cgroups 网络分离,使用一个虚拟的接口和IP...,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile定义的下一步操作,RUN定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处...RUN和CMD都是执行命令,他们的差异在于RUN定义的命令会在执行docker build命令创建镜像时执行,而CMD定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用...ls -a /etc命令,当使用docker run -l启动时容器运行ls -a -l命令,-l参数会覆盖CMD指令定义的/etc参数。...指令中断并导致整个build失败,当所有的ONBUILD定义的指令成功完成后,会按正常顺序继续执行build

    2.1K60
    领券