We have a solution-wide folder that contains shared settings that each project needs.
I’m trying to copy the contents of that folder to the /app folder but it’s not working
This is part of my dockerfile configuration:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.12 AS build
### this is where I'm trying to copy the contents of Shared Settings to /app
WORKDIR '/src/Shared Settings'
COPY '/src/Shared Settings' /app
### this is part of the rest of the docker file, which works fine
WORKDIR /src
COPY . .
WORKDIR /src/OurProject.Server
RUN dotnet restore OurProject.Server.csproj
RUN dotnet build OurProject.Server.csproj -c Release -o /app
What do I need to change to get the contents of Shared Settings copied to the /app folder in my docker container?
3
Answers
The Dockerfile documentation for the
COPY
directive notes that it has two forms, a space-separated form and a JSON-array form, and it notesSo applying that to your specific path, you would get
This is broadly true in a Dockerfile in general: the only quoting in native Dockerfile syntax is to write things in a JSON array. Wrapping a
WORKDIR
or aCOPY
command in single quotes isn’t documented as having an effect. A string-formRUN
orCMD
is an apparent exception to this, but only because these commands are run via a shell and there the shell’s quoting rules apply.The
COPY '/src/Shared Settings' /app
command would fail because it is meant for copying from the build context (folder containing your Dockerfile). However, the path'/src/Shared Settings'
suggests that you are building from the root directory of your host. If that src directory is not at the root/
, but instead exists within a different folder (e.g./path/to/your/folder_containing_src_and_Dockerfile/src
) you should change the instruction in your Dockerfile to:This removes the leading
/
that causes confusion in the path for your command.EDIT: if you are building from the src directory, just use the following instruction in your Dockerfile:
The
COPY
instruction is tightly linked to the context you will build this image in.This is actually pointed in the documentation:
Source: https://docs.docker.com/engine/reference/commandline/build/#extended-description
This said, although one will usually do:
You have to understand that, this last dot
.
, that you surely have seen Docker complain about, when you’ve forgotten providing it, in some occasion, is the actual context in which this build will happen.You are not forced to have
.
— so the current directory — as your context though.So, what you will have to aim at is to provide the right context, which will be a folder that would be a common ancestor between
/src/Shared Settings
and the folder your Dockerfile resides.You could end up with a big downside, with the folder
Shared Settings
being only insrc
, because the only common ancestor you will find might force you to use/
as your context, making you an humongous context and so a really heavy build.To come around this, you can use a .dockerignore file, though, to ignore all unrelated folders but the one you are want to make use of; namely
/src/Shared Settings
and the folder containing your Dockerfile.Also, as you change your context, mind that you will have to adapt the line
That will now read:
Here is an example that you will have to adapt based on your actual folders hierarchy.
Here the folders hierarchy:
In the Dockerfile:
Here is how the file .dockerignore does exclude the folder unrelated from the context:
And, now I can either go in the folder src/docker and build with:
Or go in the folder / and build with
The only important thing is that both the folder containing the Dockerfile and the folder shared_settings should be part of my context.