Please help me understand the difference between 'image' and 'build' within docker compose
Asked
Active
Viewed 1.8k times
2 Answers
50
imagemeansdocker composewill run a container based on that image- build means
docker composewill first build an image based on the Dockerfile found in the path associated with build (and then run a container based on that image).
PR 2458 was eventually merged to allow both (and use image as the image name when building, if it exists).
therobyouknow mentions in the comments:
dockerfile:as a sub-statement beneathbuild:can be used to specify the filename/path of the Dockerfile.
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
-
4`dockerfile:` as a sub-statement beneath `build:` can be used to specify the filename/path of the Dockerfile - https://docs.docker.com/compose/compose-file/#build – therobyouknow Jun 15 '18 at 13:25
-
1@therobyouknow Thank you. I have included your comment in the answer for more visibility. – VonC Jun 15 '18 at 17:38
-
1+1 thanks @VonC. I should also say that I believe that if the `dockerfile:` statement optionally isn't present, then docker-compose will look for the file named `Dockerfile` in the directory that docker-compose was launched from (i.e. the same folder within where the docker-compose.yml file resides). If there is a (relative) path specified directly after the `build:` statement (which also means no sub-statements), then docker-compose will look in there for the Dockerfile. The other way to specify a directory is by using the `context:` sub-statement with the path (as your example shows). – therobyouknow Jun 15 '18 at 23:01
-
These options for specifying the Dockerfile are explained in the documentation, here: https://docs.docker.com/compose/compose-file/#build (thank you for reading my comments and feeding back.) +1 upvoted your answer and the original question. – therobyouknow Jun 15 '18 at 23:02
-
What happens if we use both image and build? is there a priority between them or always the second one gets used? – Amin Bashiri Jul 25 '21 at 05:37
-
@AminBashiri You could not use it within the same `service:`. But you can use them both in the same `services:` Dockerfile, with `depends_on` to make sure the build is done first. https://github.com/compose-spec/compose-spec/blob/master/spec.md#depends_on – VonC Jul 25 '21 at 11:55
-
what I have seen is using `docker-compose -f a.yml -f b.yml` and for a particular service, it uses build in one file and image in the other. – Amin Bashiri Jul 26 '21 at 11:23
-
@AminBashiri OK. I didn't know it could work for the same service. – VonC Jul 26 '21 at 11:55
5
build: expects dockerfile path as an argument, it will build an image first and then use the image to create a container.
image: expects existing image name as argument , it will launch container using this image.
Example:docker-compose.yaml
version: '3'
services:
service1:
build: .
ports:
- "5000:5000"
service2:
image: "redis:alpine"
service1 will build an image first based on Dockerfile of current path and run container based on this image.
service2 will download "redis:alpine" image from docker hub and run container on downloaded image.
Shahid Hussain
- 1,207
- 16
- 21