【问题标题】:Dockerfile FROM vs Docker-compose IMAGEDockerfile FROM vs Docker-compose IMAGE
【发布时间】:2019-11-21 16:19:12
【问题描述】:

我目前正在学习 Docker。在阅读了文档和几篇文章之后,我显然有更多的问题而不是答案。目前对我来说最有趣的一个是:两者有什么区别

FROM some:docker-image

在 Dockerfile 和

image: digitalocean.com/php 

在 docker-compose.yml 中

我明白他们应该抓取图像并从中创建一个容器。我不明白的是,如果我们同时指定两者会发生什么,例如:

version: '3'
services:
  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php

docker-compose.yml 和 Dockerfile 都在其中指定了图像。 当这些图像不同时会发生什么? docker-compose.yml 会永远赢吗?它会只使用这个“顶部”图像吗? 它们会以某种方式重叠吗? 还是我都搞错了?

我确实看到了this,但我仍然不确定我是否理解发生了什么。

【问题讨论】:

    标签: php docker docker-compose dockerfile docker-image


    【解决方案1】:

    区别在于 buildrun

    将图像视为应用,将容器视为运行应用的进程。运行应用程序不会更改应用程序。运行容器同样不会改变图像。图像是使用docker buildDockerfiles 构建的,并且是持久的。容器由docker rundocker-compose、kubernetes 或类似的镜像工具根据需要创建,并且是临时的。

    Dockerfiledocker build 命令用于构建新映像。 在Dockerfile 中,第一行通常使用FROM 指定基本映像,即FROM nginxDockerfile 中的后续RUN 行提供了docker build 将在shell 中执行的附加步骤,在FROM 映像的上下文中,以创建新映像。请注意,Dockerfile 没有指定新图像的名称。相反,新图像在-t some/name 选项中命名为docker build

    docker-compose.yml 文件指定一组图像作为组合服务的一部分一起下载和运行。例如,博客的docker-compose.yml 可以包含一个网络服务器图像、一个应用程序图像和一个数据库图像,并且不仅可以指定图像,还可以指定它们之间的通信方式。

    由于 docker builds 和 docker compose 是独立的操作,因此没有冲突或检测差异。 docker-compose.yml 控制要下载和运行的内容,您还可以构建任何您喜欢的内容。

    另外,正如@David Maze 在 cmets 中提到的那样:

    如果您同时使用这两个选项,那么 Docker Compose 将按照指定构建镜像,然后使用镜像对其进行标记:如果您将“标准”图像名称放在那里,这可能会造成混淆。

    我的猜测是,如果你这样做,你可能会在你自己的机器上得到一个图像,比如 nginx,它与 Dockerhub 图像不匹配。不要那样做。相反,为您构建的任何图像使用唯一名称。

    【讨论】:

    • 如果您使用use both options,那么 Docker Compose 将按照指定构建映像,然后使用 image: 名称对其进行标记;如果您将“标准”图像名称放在那里,这可能会造成混淆。
    • 伙计们,两个答案都非常感谢。我确实记得那部分文档,但是在我看到不同的配置之后,这有点令人困惑。因此,如果我同时使用两者,则来自 compose 的图像只会为图像命名。如果仅在 compose 中指定图像,例如 nginx,并且不使用任何 docker Dockerfike,它无论如何都会抓取 nginx 图像,这将替换 FROM ?
    • @Robert 不是FROM 的替代品,因为在没有 Dockerfile 的情况下,docker compose 中没有镜像构建步骤。 docker compose 将创建一些容器。图像不是容器。容器是从图像创建的。将图像视为应用程序,将容器视为运行应用程序的进程。这有帮助吗?
    • 一旦理解了这些概念,我强烈建议您通过实验和测试确认您阅读的任何内容。
    • @Paul 我想这只是我选词不当。我的意思是:当在 compose 文件中指定了图像(例如 nginx)并且没有为该服务指定 Dockerfile 时,compose 将尝试从远程存储库中获取准备好的图像。当 docker compose 中指定了 dockerfile 和 image 时,Dockerfile 将用于构建镜像,并且 docker composer 中的镜像标签会为其命名。但是就像你说的那样,我会彻底测试。我问这么多问题的原因是我不想随意假设这总是会发生的,我更了解这个过程。
    【解决方案2】:

    如果我们同时指定(镜像和 Dockerfile)会发生什么:

    如果图像不存在,docker-compose 会尝试拉取它,除非您还指定了构建,在这种情况下,它使用指定的选项构建它并使用指定的标签对其进行标记。 https://docs.docker.com/compose/compose-file/compose-file-v3/#image

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2021-09-15
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2018-12-04
    • 2017-11-26
    • 2019-10-25
    相关资源
    最近更新 更多