Conditional COPY/ADD in Dockerfile?
Here is a simple workaround:
COPY foo file-which-may-exist* /target
Make sure foo
exists, since COPY
needs at least one valid source.
If file-which-may-exist
is present, it will also be copied.
NOTE:
You should take care to ensure that your wildcard doesn't pick up other files which you don't intend to copy. To be more careful, you could use file-which-may-exist?
instead (?
matches just a single character).
Or even better, use a character class like this to ensure that only one file can be matched:
COPY foo file-which-may-exis[t] /target
As stated by this comment, Santhosh Hirekerur's answer still copies the file, to archive a true conditional copy, you can use this method.
ARG BUILD_ENV=copy
FROM alpine as build_copy
ONBUILD COPY file /file
FROM alpine as build_no_copy
ONBUILD RUN echo "I don't copy"
FROM build_${BUILD_ENV}
# other stuff
The ONBUILD
instructions ensures that the file is only copied if the "branch" is selected by the BUILD_ENV
. Set this var using a little script before calling docker build
This isn't currently supported (as I suspect it would lead to a non-reproducible image, since the same Dockerfile would copy or not the file, depending on its existence).
This is still requested, in issue 13045, using wildcards: "COPY foo/* bar/" not work if no file in foo
" (May 2015).
It won't be implemented for now (July 2015) in Docker, but another build tool like bocker could support this.
2021:
COPY source/. /source/
works for me (i.e. copies directory when empty or not, as in "Copy directory into docker build no matter if empty or not - fails on "COPY failed: no source files were specified
"")
2022
Here is my suggestion:
# syntax=docker/dockerfile:1.2 RUN --mount=type=bind,source=jars,target=/build/jars \ find /build/jars -type f -name '*.jar' -maxdepth 1 -print0 \ | xargs -0 --no-run-if-empty --replace=source cp --force source >"${INSTALL_PATH}/modules/"
That works around:
COPY jars/*.jar "${INSTALL_PATH}/modules/"
But copies no
*.jar
if none is found, without throwing an error.