Home > OS >  does dockerfile's instruction execute in order?
does dockerfile's instruction execute in order?

Time:03-10

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.

  • Related