I'm a newbie to docker, sorry if my question is too basic. I saw dockerfile like this:
FROM diamol/maven AS builder
WORKDIR /usr/src/iotd
COPY pom.xml .
RUN mvn -B dependency:go-offline
COPY . .
RUN mvn package
FROM diamol/openjdk
WORKDIR /app
COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"]
I'm confused about COPY . .
instruction, what does the first period and second period COPY . .
mean?
Also, if I want to copy all files of the current working directory from my host machine into the image, then how can I modify COPY . .
so that the first period means currenty directory of my machine?
CodePudding user response:
From my perspective, one of the best ways to know all the details for COPY
and WORKDIR
docker commands is to go through following official documentation.
You can either search for COPY
and WORKDIR
keywords on the home page at below first link or please refer to last two links and find all the details including examples.
https://docs.docker.com/engine/reference/builder/
https://docs.docker.com/engine/reference/builder/#copy
https://docs.docker.com/engine/reference/builder/#workdir
CodePudding user response:
In the Dockerfile COPY
directive, the last argument is the path inside the container, relative to the current WORKDIR
. All of the preceding arguments are paths inside the build context, the host directory passed as an argument to docker build
.
I want to copy all files of the current working directory from my host machine into the image, then how can I modify
COPY . .
...?
You probably don't need to. So long as you docker build .
naming the current directory .
as the last argument, that's exactly what COPY . .
does. That instruction means to copy .
– the entirety of the build context, from the original host system – to .
– the current directory, inside the image.
WORKDIR /usr/src/iotd # `COPY anything .` will put it here inside the image
COPY pom.xml . # Copy a single file into that WORKDIR
COPY . . # Copy the entire build context into the WORKDIR
I've mentioned "build context" a couple of times. That is the directory argument to docker build
docker build \
-t myname/some-image: tag \
. # <--- the build context directory
or that you specify in a docker-compose.yml
file
version: '3.8'
services:
one:
build: ./one # <-- this directory
two:
build:
context: ./two # <-- this directory
except that the files mentioned in a .dockerignore
file are removed first.
In the question title you also ask
does dockerfile's instruction execute in order?
They do. The newer BuildKit backend has some capability to execute build stages not necessarily in the order they're written, but it ensures that you get the same results as if all of the COPY
and RUN
instructions from a previous stage had run before a COPY --from=...
in a later stage happens.