Docker构建何时使用图像而不是构建

时间:2017-02-10 23:06:37

标签: docker docker-compose environment

Docker Compose documentation,其example use case非常适合您分析不同工作环境(开发,制作等)的各种可能性。

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

然而,对于我来说,使用图像而不是构建时,我并不是很清楚。

这是唯一可用的唯一image: example/my_web_app:latest示例:&/ p>

  

另一个常见用例是运行adhoc或管理任务   针对Compose应用中的一项或多项服务。这个例子   演示了如何运行数据库备份。

其他示例案例使用build: .

据我所知,在第一次打开容器时,使用图像覆盖建筑物可以提供更好的性能,因为图像已经准备好了。但是,我可以预见到这样做有很多问题:

  • [开发]开发人员可能会更改Dockerfile配置(并且他们需要在推送任何更改之前以某种方式对其进行测试)。
  • [开发]源代码文件会发生变化(但我想你可以通过共享卷来轻松解决这个问题)。
  • [制作]你可能并不总是想要:latest版本(或者你呢?)。
  • [any]通过使用图片(以及:latest标签),您无法控制正在触摸的文件版本。但是,每当您出现docker-compose up时,它都会更新到最新的工作版本。

以前的一些观点可能并不完全正确。随意拆除它们。

2 个答案:

答案 0 :(得分:10)

通常,您希望在以下情况中使用build .

  • 发展
  • 自动化测试

这通常在您开发或测试并且代码未生成就绪时完成。例如测试失败,代码无法编译,代码错误等等。

通常,您只能在准备发布部署时创建映像。此时,您将创建图像,通过其标签对其进行版本化并将其推送到您的个人DTR或Docker Hub。

使用docker compose中的版本时,您不必绑定:latest,您可以指定任何版本,以确保在任何给定环境中运行正确的版本。例如,在生产中,您可能希望创建一个名为docker-production.yaml的撰写文件,其配置如下:

web:
  image: "example/my_web_app:${TAG}"
  links:
    - db
    - cache
db:
  image: postgres:9.5.2
cache:
  image: redis:3.0.7

其中${TAG}是在运行时替换的环境变量,例如docker-compose up -d -f docker-production.yaml。您可以阅读有关变量替换的更多信息here

撰写的强大之处在于,您可以使用由构建系统自动启动的可变替换创建构建文件,而不再将您限制为:latest甚至是硬编码版本。

注意:

  1. 团队如何运行他们的构建,发布,部署差异很大 弄清楚什么对他们及其产品最有效,如上所述 对于所有情况,build .场景可能都不准确,但是 准确地说我的公司如何使用撰写。
  2. 这假定docker-compose context中的build .而不是docker build上下文。

答案 1 :(得分:7)

正如@ GHETTO.CHiLD所说,这取决于您的需求和您的工作流程。实际上我们不执行手动构建。我将解释我们如何管理这个以及为什么。它非常适合我们的流程,但不适合其他情况。

  • 我们不会手动构建图片。 CI执行此操作(在我们的情况下为GitLab CI
  • 我们有两种类型的图片,开发/测试制作
  • 有一个docker-compose.yml用于开发,可以简化环境管理。他们只运行docker-compose up并从注册表中提取图像并将其安装在容器内。

    version: "2"
    
    services:
      web:
        build: 
          context: ../../
          dockerfile: dockerfiles/dev/Dockerfile
        image: registry.my.domain/my_image:dev
        volumes:
          - ../../:/opt/app
        working_dir: /opt/app
    
  • 如果他们对Dockerfile进行了更改(例如,他们需要一个新库),他们可以在他们的机器中构建映像(docker-compose build),但不会对注册表推送映像。

  • 当他们开心时,他们会推送新代码(包括Dockerfile),CI会构建新的dev图像并运行测试。
  • CI每次都在同一主机中构建映像,因此可以利用缓存。如果Dockerfile没有更改,则构建只需不到一秒钟。
  • 创建新标记时,CI会使用$TAG作为图像标记构建生产图像。
  • 对于制作,我们使用orchestrator,而不是撰写YAML。我们不希望存储可能位于项目存储库中docker-compose.yml的敏感数据。为了升级,我们只是从注册表中提取新标签(我们可以自动执行此操作,但我还没有信心在没有人工测试的情况下部署到生产中:D)。

当然,您每次都可以构建图像进行开发,但有些项目可能需要很长时间才能构建。例如,Python3 + pandas可能需要25分钟才能构建,因此如果你不得不经常在项目之间切换,那就太令人沮丧了。另一方面,拉图像只需不到一分钟。

我们使用这种方法,因为GitLab为我们提供了CI,注册表和跑步者来构建图像和运行测试。没有它你就可以做到,但你需要自己集成所有组件。流程并不完美,它有一些缺点,但在我们的场景中很小。