I used docker to build my Java application and I using the multi-stage building and I have some problems every time when I run the docker command for building the docker creates new intermediate image with tag and name none
and I need the possibility to called intermediate containers.
That is my dockerfile:
FROM jdk8_201-ubuntu16.04 as java_build RUN apt-get update && apt-get install -y dos2unix ARG MVN_USER ARG MVN_PASS ARG GIT_BRANCH ARG BUILD_ID ARG COMMIT_ID WORKDIR /tmp/app COPY pom.xml /maven-build/pom.xml COPY /.mvn/settings.xml /maven-build/settings.xml COPY mvnw ./mvnw COPY mvnw.cmd ./mvnw.cmd COPY /.mvn ./.mvn RUN chmod +x ./mvnw && ./mvnw -s /maven-build/settings.xml -B -f /maven-build/pom.xml dependency:resolve dependency:resolve-plugins dependency:go-offline COPY ./ ./ FROM ubuntu ...
and after each running docker build
command I had a many none
images:
REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 30e2325fcf15 18 hours ago 1.68GB <none> <none> 30e2325fcf16 18 hours ago 1.68GB <none> <none> 30e2325fcf14 18 hours ago 1.68GB <none> <none> 30e2325fcf18 18 hours ago 1.68GB <none> <none> 30e2325fcf13 18 hours ago 1.68GB
How can I replace none
name of intermediate images to my_image_name
?
Advertisement
Answer
you can use docker build -t image_name
to tag the image.But intermediate images will have <none>
as the image name.
<none>
images are formed as part of the multistage builds. If there are multiple FROM in your dockerfile then building image will create multiple images along with <none>
images which are intermediate images used by main image.
for example
dockerfile:
$ cat dockerfile FROM ubuntu:18.04 AS compile-image RUN apt-get update RUN apt-get install -y --no-install-recommends gcc build-essential WORKDIR /root COPY . hello.c RUN mkdir -p helloworld hello.c FROM ubuntu:18.04 AS runtime-image COPY --from=compile-image /root/helloworld . CMD ["./helloworld"]
In the above dockerfile I am using ubuntu:18.04 as intermediate image which is used again in the COPY command above.
HERE COPY --from=compile-image /root/helloworld .
So When I build an image using above dockerfile by command
$ sudo docker build -t sample_image .
The above command will create two images as below.
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE sample_image latest 32b62676d8b8 About a minute ago 64.2MB <none> <none> dfb370218e54 About a minute ago 282MB
<none>
is an intermediate image. which is again internally used in the dockerfile.
now the solution for your question would be creating two docker files and using them separately.
For example, the above dockerfile can be divided into two dockerfiles and can be used to create separate images without any intermediate image.
dockerfile 1:
$ sudo vi dockerfile $ sudo cat dockerfile FROM ubuntu:18.04 AS compile-image RUN apt-get update RUN apt-get install -y --no-install-recommends gcc build-essential WORKDIR /root COPY . hello.c RUN mkdir -p helloworld hello.c
and execute
$ sudo docker build -t compile_image .
by changing docker file again
docker file 2:
$ sudo vi dockerfile $ sudo cat dockerfile FROM ubuntu:18.04 COPY --from=compile_image /root/helloworld . CMD ["./helloworld"]
and execute: $ sudo docker build -t runtime_image .
the output will not have intermediate images. Hence no <none>
images.
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE compile_image latest b580efe23dad About a minute ago 282MB runtime_image latest 32b62676d8b8 3 minutes ago 64.2MB
FYI: In second docker file, I used previously build image compile_image in COPY command
COPY --from=compile_image /root/helloworld .
Here compile_image acts like an intermediate image.
If you observe previous images the memory occupied by <none>
and compile_image are same and sample_image and runtime_image are the same. The main purpose of using the multistage builds is to reduce the size of an image.