Docker compose with Dockerfile 创建多张图像而不是一张
Docker compose with Dockerfile creates multiple images instead of one
我在同一个文件夹中有一个 docker-compose.yml 和 Dockerfile。当 运行 docker compose build 这应该会产生一个图像和一个容器,但不知何故我只剩下两个图像和两个容器。然而,我桌面上的相同 docker-compose.yml 和 Dockerfile 会生成一个图像。这里发生了什么?
docker-compose.yml
version: '3.3'
services:
nginx-proxy:
build: .
restart: always
ports:
- '80:80'
- '443:443'
volumes:
- /etc/nginx/certs/domain.nl.crt:/etc/letsencrypt/live/domain.nl/cert.pem:ro
- /etc/nginx/certs/domain.nl.key:/etc/letsencrypt/live/domain.nl/privkey.pem:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
Docker 文件:
FROM nginxproxy/nginx-proxy
EXPOSE 80
EXPOSE 443
docker compose build
的输出在服务器和我的桌面上看起来完全不同。
运行 docker compose build
Linux 服务器:
Sending build context to Docker daemon 404B
Step 1/3 : FROM nginxproxy/nginx-proxy
latest: Pulling from nginxproxy/nginx-proxy
f7a1c6dad281: Pull complete
4d3e1d15534c: Pull complete
9ebb164bd1d8: Pull complete
59baa8b00c3c: Pull complete
a41ae70ab6b4: Pull complete
e3908122b958: Pull complete
3016ffcb703f: Pull complete
d0b58d19b229: Pull complete
e75e1b46ae51: Pull complete
a1b8f07fa83d: Pull complete
b1ff9eda0cc4: Pull complete
d334f8d44841: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:5e0be3b1bb035301c5bb4edbe0dee5bc0f133d26866e3165f1912acb126e15d4
Status: Downloaded newer image for nginxproxy/nginx-proxy:latest
---> 65d9e0769695
Step 2/3 : EXPOSE 80
---> Running in 4bdc00f75332
---> 0ca795ce85fb
Step 3/3 : EXPOSE 443
---> Running in 3530eba2d3cf
---> 9440ccab1790
Successfully built 9440ccab1790
Successfully tagged nginx-proxy_nginx-proxy:latest
结果:
docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 0ca795ce85fb 46 minutes ago 156MB
nginx-proxy_nginx-proxy latest 9440ccab1790 46 minutes ago 156MB
nginxproxy/nginx-proxy latest 65d9e0769695 4 days ago 156MB
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3530eba2d3cf 0ca795ce85fb "/app/docker-entrypo…" 25 seconds ago Created affectionate_vaughan
4bdc00f75332 65d9e0769695 "/app/docker-entrypo…" 25 seconds ago Created fervent_varahamihira
运行 docker compose build
桌面:
[+] Building 2.4s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 31B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/nginxproxy/nginx-proxy:latest 2.1s
=> CACHED [1/1] FROM docker.io/nginxproxy/nginx-proxy@sha256:5e0be3b1bb035301c5bb4edbe0dee5bc0f133d26866e3165f1912acb126e15d4 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:f66ed6ec69a319ce3a15b1f1948720bdd8174d13299513cc162a812616874793 0.0s
=> => naming to docker.io/library/nginx-proxy_nginx-proxy
结果:
docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-proxy_nginx-proxy latest f66ed6ec69a3 4 days ago 156MB
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
您正在查看两种不同的构建工具。经典的 docker 构建使用一个容器执行每个步骤,该容器被提交到悬空图像中。对于其中一些更改,容器甚至还没有 运行,它是刚刚创建的。这些在容器和图像列表中可见。删除它们可能会删除您的构建缓存,这将强制重建整个图像,虽然它们会报告所有层的大小,但这些层与最终创建的图像共享,因此删除悬空图像通常不会节省太多 space(某些 json 元数据可能只有几 kb)。正因为如此,人们会把它们留在身边。
另一个构建使用的是 buildkit,它 运行 直接在 containerd 和 运行c 上,因此您在 docker 容器和映像列表中看不到构建工件.这是首选构建器,默认情况下在 docker.
的较新版本上启用
我在同一个文件夹中有一个 docker-compose.yml 和 Dockerfile。当 运行 docker compose build 这应该会产生一个图像和一个容器,但不知何故我只剩下两个图像和两个容器。然而,我桌面上的相同 docker-compose.yml 和 Dockerfile 会生成一个图像。这里发生了什么?
docker-compose.yml
version: '3.3'
services:
nginx-proxy:
build: .
restart: always
ports:
- '80:80'
- '443:443'
volumes:
- /etc/nginx/certs/domain.nl.crt:/etc/letsencrypt/live/domain.nl/cert.pem:ro
- /etc/nginx/certs/domain.nl.key:/etc/letsencrypt/live/domain.nl/privkey.pem:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
Docker 文件:
FROM nginxproxy/nginx-proxy
EXPOSE 80
EXPOSE 443
docker compose build
的输出在服务器和我的桌面上看起来完全不同。
运行 docker compose build
Linux 服务器:
Sending build context to Docker daemon 404B
Step 1/3 : FROM nginxproxy/nginx-proxy
latest: Pulling from nginxproxy/nginx-proxy
f7a1c6dad281: Pull complete
4d3e1d15534c: Pull complete
9ebb164bd1d8: Pull complete
59baa8b00c3c: Pull complete
a41ae70ab6b4: Pull complete
e3908122b958: Pull complete
3016ffcb703f: Pull complete
d0b58d19b229: Pull complete
e75e1b46ae51: Pull complete
a1b8f07fa83d: Pull complete
b1ff9eda0cc4: Pull complete
d334f8d44841: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:5e0be3b1bb035301c5bb4edbe0dee5bc0f133d26866e3165f1912acb126e15d4
Status: Downloaded newer image for nginxproxy/nginx-proxy:latest
---> 65d9e0769695
Step 2/3 : EXPOSE 80
---> Running in 4bdc00f75332
---> 0ca795ce85fb
Step 3/3 : EXPOSE 443
---> Running in 3530eba2d3cf
---> 9440ccab1790
Successfully built 9440ccab1790
Successfully tagged nginx-proxy_nginx-proxy:latest
结果:
docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 0ca795ce85fb 46 minutes ago 156MB
nginx-proxy_nginx-proxy latest 9440ccab1790 46 minutes ago 156MB
nginxproxy/nginx-proxy latest 65d9e0769695 4 days ago 156MB
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3530eba2d3cf 0ca795ce85fb "/app/docker-entrypo…" 25 seconds ago Created affectionate_vaughan
4bdc00f75332 65d9e0769695 "/app/docker-entrypo…" 25 seconds ago Created fervent_varahamihira
运行 docker compose build
桌面:
[+] Building 2.4s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 31B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/nginxproxy/nginx-proxy:latest 2.1s
=> CACHED [1/1] FROM docker.io/nginxproxy/nginx-proxy@sha256:5e0be3b1bb035301c5bb4edbe0dee5bc0f133d26866e3165f1912acb126e15d4 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:f66ed6ec69a319ce3a15b1f1948720bdd8174d13299513cc162a812616874793 0.0s
=> => naming to docker.io/library/nginx-proxy_nginx-proxy
结果:
docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-proxy_nginx-proxy latest f66ed6ec69a3 4 days ago 156MB
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
您正在查看两种不同的构建工具。经典的 docker 构建使用一个容器执行每个步骤,该容器被提交到悬空图像中。对于其中一些更改,容器甚至还没有 运行,它是刚刚创建的。这些在容器和图像列表中可见。删除它们可能会删除您的构建缓存,这将强制重建整个图像,虽然它们会报告所有层的大小,但这些层与最终创建的图像共享,因此删除悬空图像通常不会节省太多 space(某些 json 元数据可能只有几 kb)。正因为如此,人们会把它们留在身边。
另一个构建使用的是 buildkit,它 运行 直接在 containerd 和 运行c 上,因此您在 docker 容器和映像列表中看不到构建工件.这是首选构建器,默认情况下在 docker.
的较新版本上启用