请帮我理解Docker Compose中'image'和'build'的区别。
image
的意思是docker compose
将基于该镜像运行一个容器。docker compose
首先将基于与构建相关联的路径中的Dockerfile构建一个镜像(然后基于该镜像运行一个容器)。PR 2458 最终合并,允许两者同时使用(如果存在image
的话,则使用其作为构建时的镜像名称)。
dockerfile:
作为build:
下的子语句,可用于指定Dockerfile的文件名/路径。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
build:需要Dockerfile路径作为参数,它将首先构建一个映像,然后使用该映像创建一个容器。
image:需要现有的映像名称作为参数,它将使用该映像启动容器。
示例:docker-compose.yaml
version: '3'
services:
service1:
build: .
ports:
- "5000:5000"
service2:
image: "redis:alpine"
service1 首先会基于当前路径下的 Dockerfile 构建镜像,然后基于该镜像运行容器。
service2 会从 Docker Hub 下载 "redis:alpine" 镜像,并在下载的镜像上运行容器。
官方文档深入介绍了build
和image
之间的区别,这可能会对您有所帮助。https://docs.docker.com/compose/compose-file/build/
简而言之,build
需要Dockerfile的路径,以便构建镜像,但image
则去存储库获取现有的镜像。两者都可以用于服务,但是
当服务定义同时包含图像属性和构建部分时,Compose实现无法保证拉取的镜像与从源代码构建相同的镜像严格等效。如果没有任何明确的用户指令,具有构建支持的Compose实现必须首先尝试拉取镜像,然后在未在注册表中找到镜像的情况下从源代码构建。Compose实现可以根据用户请求提供自定义此行为的选项。
docker-compose up
将会构建镜像,docker compose up
则会先拉取再构建镜像。我还没有找到一种"如果存在则拉取,否则构建"的方法。 - user1473249581
dockerfile:
作为build:
下的子语句,可用于指定 Dockerfile 的文件名/路径。 - https://docs.docker.com/compose/compose-file/#build - therobyouknowdockerfile:
语句可选,则docker-compose将在启动docker-compose的目录中查找名为Dockerfile
的文件(即与docker-compose.yml文件位于同一文件夹中)。如果在build:
语句之后直接指定了(相对)路径(这也意味着没有子语句),则docker-compose将在其中查找Dockerfile。指定目录的另一种方法是使用带有路径的context:
子语句(如您的示例所示)。 - therobyouknow