如果图像存在,docker会编译跳过构建吗?

时间:2017-04-11 19:29:21

标签: docker docker-compose

是否可以以这样的方式运行docker-compose up,只有在图像不存在于存储库中时才会构建它?

我正在研究将在两个不同环境中运行的测试场景:笔记本电脑本地测试,以及作为测试自动化一部分的服务器。我的docker-compose文件看起来像这样:

services:
  my-service1:
    build: "./local-repo1"
    image: "image1"
  my-service2:
    build: "./local-repo2"
    image: "image2"
  ...

如果我在local-repo目录存在的本地运行它运行正常。如果我尝试在服务器上运行它,而不是从docker存储库中提取它,它会抱怨它无法找到构建路径。如果我取出build属性,它在服务器上运行正常,但除非我事先构建图像,否则它不会在本地运行。

如果图像不存在,有没有办法让它只尝试构建?如果不是,我可以尝试一些解决方法,但我更喜欢只使用一个处理每个案例的docker-compose文件。

2 个答案:

答案 0 :(得分:9)

您可以使用docker-compose pull来获取图片。然后,如果它们已经存在,Compose将不再尝试再次构建它们。

要确保避免重建,可以使用--no-build

docker-compose pull
docker-compose up -d --no-build

您真正的问题是您正在指定构建上下文,但之后尝试使用docker-compose而不存在该构建上下文。

当docker-compose运行时,即使它没有计划进行构建,它也会验证构建上下文是否至少存在。如果它没有,那么它将失败。

要满足此要求,您需要做的就是为任何缺少的构建上下文创建一个空目录。这应该让docker-compose足够快乐地运行。

mkdir -p local-repo1 local-repo2

答案 1 :(得分:1)

我正在使用docker-compose v2.1

当我们运行docker时,它会检查映像是否存在。如果不存在,那么它将仅构建该图像,否则将跳过该部分

docker-compose

version: '2.1'

services:
  devimage:
    image: nodedockertest
    build: .
    environment:
      NODE_ENV: development
    ports:
      - 8000:8000

enter image description here