【发布时间】:2018-10-18 05:10:43
【问题描述】:
docker-compose build 和 docker build 有什么区别?
假设在一个 dockerized 项目路径中有一个 docker-compose.yml 文件:
docker-compose build
和
docker build
【问题讨论】:
标签: docker docker-compose dockerfile
docker-compose build 和 docker build 有什么区别?
假设在一个 dockerized 项目路径中有一个 docker-compose.yml 文件:
docker-compose build
和
docker build
【问题讨论】:
标签: docker docker-compose dockerfile
docker-compose build 将在docker-compose.yml 文件中构建服务。
https://docs.docker.com/compose/reference/build/
docker build 将构建由 Dockerfile 定义的镜像。
【讨论】:
docker-compose 可以被认为是 docker CLI 的包装器(实际上它是 python 中的另一个实现 said in the comments),以便节省时间并避免 500 个字符长的行(并且同时启动多个容器时间)。它使用一个名为docker-compose.yml 的文件来检索参数。
您可以找到 docker-compose 文件格式 here 的参考。
所以基本上docker-compose build 会读取您的docker-compose.yml,查找包含build: 语句的所有服务并为每个服务运行docker build。
Each build: 可以指定 Dockerfile、上下文和参数以传递给 docker。
以docker-compose.yml 文件为例:
version: '3.2'
services:
database:
image: mariadb
restart: always
volumes:
- ./.data/sql:/var/lib/mysql
web:
build:
dockerfile: Dockerfile-alpine
context: ./web
ports:
- 8099:80
depends_on:
- database
调用docker-compose build 时,只有web 目标需要构建图像。 docker build 命令看起来像:
docker build -t web_myproject -f Dockerfile-alpine ./web
【讨论】:
web 来自容器名称。 myproject 是您所在文件夹的名称。如果您处理两个项目都包含 web 容器,这可以避免冲突。
docker-compose.yml,web来自服务名。
基本上,docker-compose 是使用 docker 的一种更好的方式,而不仅仅是一个 docker 命令。
如果这里的问题是,如果 docker-compose build 命令会构建一个包含多个图像的 zip 类的东西,否则这些图像会与通常的 Dockerfile 分开构建,那么这种想法是错误的。
Docker-compose build,将通过进入 docker-compose.yml 中的单个服务条目来构建单个图像。
使用 docker images, 命令,我们也可以看到所有单独的图像被保存。
真正的魔力在于 docker-compose up。
这将基本上创建一个相互连接的容器网络,它们可以使用类似于主机名的容器名称相互通信。
【讨论】:
添加到第一个答案...
可以在服务定义下给出镜像名称和容器名称。
例如对于以下 docker-compose 示例中名为 'web' 的服务,您可以显式指定图像名称和容器名称,以便 docker 不必使用默认值。
否则 docker 将使用的图像名称将是文件夹(目录)和服务名称的串联。例如myprojectdir_web
所以最好明确输入执行 docker build 命令时将生成的所需镜像名称。
例如 图片:mywebserviceImage container_name: my-webServiceImage-Container
示例 docker-compose.yml 文件:
version: '3.2'
services:
web:
build:
dockerfile: Dockerfile-alpine
context: ./web
ports:
- 8099:80
image: mywebserviceImage
container_name: my-webServiceImage-Container
depends_on:
- database
【讨论】:
build: 的值会强制您使用Dockerfile 的确切文件名。比如在build: ./web中。所以使用context:就不错了!
关于docker build 和docker-compose build 之间的区别的几句话。
两者都可以选择使用现有图像作为图层缓存来构建图像。
docker build,选项是--cache-from <image>
docker-composer,build 部分中有一个标签cache_from。不幸的是,到目前为止,在这个级别上,一个人制作的图像作为图层缓存与另一个人不兼容(Ids are not compatible)。
然而,docker-composev1.25.0 (2019-11-18) 引入了一个实验性功能COMPOSE_DOCKER_CLI_BUILD,以便docker-compose 使用本机 docker builder(因此,docker build 制作的图像可以用作docker-compose build 的层缓存)
【讨论】: