Docker: COPY failed: file not found in build context (Dockerfile)

Viewed 60258

I'd like to instruct Docker to COPY my certificates from the local /etc/ folder on my Ubuntu machine.

I get the error:

COPY failed: file not found in build context or excluded by .dockerignore: stat etc/.auth_keys/fullchain.pem: file does not exist

I have not excluded in .dockerignore

How can I do it?

Dockerfile:

FROM nginx:1.21.3-alpine

RUN rm /etc/nginx/conf.d/default.conf
RUN mkdir /etc/nginx/ssl
COPY nginx.conf /etc/nginx/conf.d
COPY ./etc/.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY ./etc/.auth_keys/privkey.pem /etc/nginx/ssl/

WORKDIR /usr/src/app

I have also tried without the dot --> same error

COPY /etc/.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY /etc/.auth_keys/privkey.pem /etc/nginx/ssl/

By placing the folder .auth_keys next to the Dockerfile --> works, but not desireable

COPY /.auth_keys/fullchain.pem /etc/nginx/ssl/
COPY /.auth_keys/privkey.pem /etc/nginx/ssl/
3 Answers

The docker context is the directory the Dockerfile is located in. If you want to build an image that is one of the restrictions you have to face.

In this documentation you can see how contexts can be switched, but to keep it simple just consider the same directory to be the context. Note; this also doesn't work with symbolic links.

So your observation was correct and you need to place the files you need to copy in the same directory.

Alternatively, if you don't need to copy them but still have them available at runtime you could opt for a mount. I can imagine this not working in your case because you likely need the files at startup of the container.

@JustLudo's answer is correct, in this case. However, for those who have the correct files in the build directory and still seeing this issue; remove any trailing comments.

Coming from a C and javascript background, one may be forgiven for assuming that trailing comments are ignored (e.g. COPY my_file /etc/important/ # very important!), but they are not! The error message won't point this out, as of my version of docker (20.10.11).

For example, the above erroneous line will give an error:

COPY failed: file not found in build context or excluded by .dockerignore: stat etc/important/: file does not exist

... i.e. no mention that it is the trailing # important! that is tripping things up.

It's also important to note that, as mentioned into the docs:

If you use STDIN or specify a URL pointing to a plain text file, the system places the contents into a file called Dockerfile, and any -f, --file option is ignored. In this scenario, there is no context.

That is, if you're running build like this:

docker build -t dh/myimage - < Dockerfile_test

Any COPY or ADD, having no context, will throw the error mentioned or another similar:

failed to compute cache key: "xyz" not found: not found

If you face this error and you're piping your Dockerfile, then I advise to use -f to target a custom Dockerfile.

docker build -t dh/myimage -f Dockerfile_test .

(. set the context to the current directory)


Here is a test you can do yourself :

  1. In an empty directory, create a Dockerfile_test file, with this content
FROM nginx:1.21.3-alpine
COPY test_file /my_test_file
  1. Then create a dummy file:
touch test_file
  1. Run build piping the test Dockerfile, see how it fails because it has no context:
docker build -t dh/myimage - < Dockerfile_test
[..]
failed to compute cache key: "/test_file" not found: not found
[..]
  1. Now run build with -f, see how the same Dockerfile works because it has context:
docker build -t dh/myimage -f Dockerfile_test .
[..]
 => [2/2] COPY test_file /my_test_file
 => exporting to image
[..]
Related