docker-compose 重建一个服务的镜像并使用它

时间:2021-01-25 20:04:32

标签: docker docker-compose

我正在尝试让 docker-compose :

  • 重建某个服务的镜像(只更改了源代码,而不是 Dockerfile)
  • 使用新映像重新“启动”docker-compose 中的该服务

我发现我必须对该服务的 Dockerfile 执行 docker build,然后为要使用的新映像执行 docker-compose up <service-name>

有没有办法只使用 docker-compose 来做到这一点?

以下是我为获取要在 docker-compose 中使用的新图像而采取的漫长曲折路径。


让 docker-compose 使用新镜像的旅程

这是当前的 docker-compose 设置。

 Container          Repository          Tag       Image Id       Size
-----------------------------------------------------------------------
books-server   books-server            v06      c35c65375942   13.37 MB
hasura-proxy   hasura/graphql-engine   v1.3.2   a499c4b91ba4   48.34 MB
nginx-proxy    jwilder/nginx-proxy     latest   fcb5a96e19c1   160.6 MB
postgres       postgres                12       7b9cf7d827b4   314 MB

我对 books-server 进行了更改,底层源代码被编译为可执行文件,我希望重建该映像并在 docker-compose 中使用。

如果我发出:

> docker-compose up --detach --build books-server

结果:

books-server is up-to-date

试试:

> docker-compose build --no-cache books-server

结果:

books-server uses an image, skipping

试试:

> docker-compose up --build --no-deps --force-recreate -d books-server

结果:

Recreating books-server ... done

检查:

> docker-compose images

结果

 Container          Repository          Tag       Image Id       Size
-----------------------------------------------------------------------
books-server   books-server            v06      c35c65375942   13.37 MB
hasura-proxy   hasura/graphql-engine   v1.3.2   a499c4b91ba4   48.34 MB
nginx-proxy    jwilder/nginx-proxy     latest   fcb5a96e19c1   160.6 MB
postgres       postgres                12       7b9cf7d827b4   314 MB

books-server 的图片 id 仍然是 c35c65375942

试试:

> docker-compose restart books-server
Restarting books-server ... done

检查图片:

仍在使用图片 ID c35c65375942

> docker-compose images

 Container          Repository          Tag       Image Id       Size
-----------------------------------------------------------------------
books-server   books-server            v06      c35c65375942   13.37 MB
hasura-proxy   hasura/graphql-engine   v1.3.2   a499c4b91ba4   48.34 MB
nginx-proxy    jwilder/nginx-proxy     latest   fcb5a96e19c1   160.6 MB
postgres       postgres                12       7b9cf7d827b4   314 MB

试试:

我切换到 books-server 目录,使用相同的标签 (books-server:v06) 在其 Dockerfile 上执行 docker build

> cd ..\books-server\
> docker build -t books-server:v06 .

结果:

构建了一个新图像 55ea56a70aa9 并标记了

Sending build context to Docker daemon  73.43MB
Step 1/21 : FROM google/dart-runtime-base AS dart-runtime
...<snip>...
Removing intermediate container bff4c43f6bf0
 ---> 55ea56a70aa9
Successfully built 55ea56a70aa9
Successfully tagged books-server:v06

我检查docker images

并看到标签已从图像 c35c65375942 中删除并提供给 55ea56a70aa9

> docker images

REPOSITORY                        TAG                 IMAGE ID            CREATED              SIZE
<none>                            <none>              d50d6ccf14a1        About a minute ago   798MB
books-server                      v06                 55ea56a70aa9        About a minute ago   13.4MB
<none>                            <none>              c35c65375942        31 minutes ago       13.4MB

我检查docker-compose images

 Container          Repository          Tag       Image Id       Size
-----------------------------------------------------------------------
books-server   <none>                  <none>   c35c65375942   13.37 MB
hasura-proxy   hasura/graphql-engine   v1.3.2   a499c4b91ba4   48.34 MB
nginx-proxy    jwilder/nginx-proxy     latest   fcb5a96e19c1   160.6 MB
postgres       postgres                12       7b9cf7d827b4   314 MB

books-server 仍在使用旧图像,现在匿名运行,因为图像标签已被重新分配到 55ea56a70aa9

我尝试在 docker-compose 中重启服务:

> docker-compose restart books-server
Restarting books-server ... done

我检查了 docker-compose 图像,发现旧图像 c35c65375942 仍在使用。

 Container          Repository          Tag       Image Id       Size
-----------------------------------------------------------------------
books-server   <none>                  <none>   c35c65375942   13.37 MB
hasura-proxy   hasura/graphql-engine   v1.3.2   a499c4b91ba4   48.34 MB
nginx-proxy    jwilder/nginx-proxy     latest   fcb5a96e19c1   160.6 MB
postgres       postgres                12       7b9cf7d827b4   314 MB

我重新启动 docker-compose 并最终看到正在使用的新映像 (55ea56a70aa9):

> docker-compose up -d books-server
Recreating books-server ... done
> docker-compose images
 Container          Repository          Tag       Image Id       Size
-----------------------------------------------------------------------
books-server   books-server            v06      55ea56a70aa9   13.37 MB
hasura-proxy   hasura/graphql-engine   v1.3.2   a499c4b91ba4   48.34 MB
nginx-proxy    jwilder/nginx-proxy     latest   fcb5a96e19c1   160.6 MB
postgres       postgres                12       7b9cf7d827b4   314 MB

总结

是否有 docker-compose 命令可以重建服务映像并重新启动该服务,还是必须使用 docker build Dockerfiledocker-compose up <service> 来完成?

感谢您的见解。

1 个答案:

答案 0 :(得分:2)

多亏了 timsmelik 评论,我意识到我没有在 docker-compose.yml 的 build: 服务中使用 books-server 指令,只有一个标记的图像名称,docker-compose 不容易产生新版本时替换/使用。

删除 image: 指令并将其替换为相对的 build: 目标, 一个简单的 docker-compose up --build -d books-server 正在重建服务并在 docker-compose 项目中使用它。

  books-server:
    # ↓ new build directive
    build: ../books-server
    # ↓ old image directive, removed
    # image: books-server:v06
    container_name: books-server
    <other settings>...