skip to Main Content

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?

2

Answers


  1. 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

    Login or Signup to reply.
  2. 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.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search