Внутри моих файлов Dockerfiles я хотел бы скопировать файл в свое изображение, если он существует, файл requirements.txt для pip кажется хорошим кандидатом, но как этого добиться?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
или
if test -e requirements.txt; then
COPY requiements.txt /destination;
fi
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
docker
dockerfile
Дерренд
источник
источник
Ответы:
В настоящее время это не поддерживается (поскольку я подозреваю, что это приведет к невоспроизводимому изображению, поскольку тот же Dockerfile будет копировать файл или нет, в зависимости от его существования).
Это все еще запрашивается в выпуске 13045 с использованием подстановочных знаков: «
COPY foo/* bar/" not work if no file in foo
» (май 2015 г.).В настоящее время (июль 2015 г.) он не будет реализован в Docker, но другой инструмент сборки, такой как bocker, может это поддерживать.
источник
dev
среда работает с сервером разработки webpack, а эквивалентнаяprod
среда работает со/dist
статической папкой? Так обстоит дело в большинстве конфигураций внешнего интерфейса сегодня, и, очевидно,dev
иprod
не может быть таким же здесь. Итак, как с этим бороться?Вот простой способ:
Убедитесь, что
foo
существует, посколькуCOPY
нужен хотя бы один действительный источник.Если
file-which-may-exist
присутствует, он также будет скопирован.ПРИМЕЧАНИЕ. Следует позаботиться о том, чтобы подстановочный знак не захватил другие файлы, которые вы не собираетесь копировать. Чтобы быть более осторожным, вы можете использовать
file-which-may-exist?
вместо (?
соответствует только одному символу).Или, что еще лучше, используйте такой класс символов, чтобы обеспечить сопоставление только одного файла:
источник
COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/
RUN mv /tmp/docker/docker /usr/bin/docker
RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true
(где общая библиотека - это неизвестная сущность.)Как указано в этом комментарии , ответ Santhosh Hirekerur по-прежнему копирует файл, чтобы заархивировать истинную условную копию, вы можете использовать этот метод.
В
ONBUILD
инструкции гарантирует , что файл только копируются , если «ветвь» выбираетсяBUILD_ENV
. Установите эту переменную с помощью небольшого скрипта перед вызовомdocker build
источник
Обойти решение
У меня было требование скопировать FOLDER на сервер на основе переменных ENV. Я взял пустой образ сервера. создал необходимую структуру папок развертывания в локальной папке. затем добавьте строку ниже в DockerFile, скопируйте папку в контейнер. В последней строке добавлена точка входа для выполнения init file.sh перед запуском сервера докером.
Затем создайте файл custom-init.sh локально с помощью скрипта, как показано ниже
В файле docker-compose под строками.
среда: - BUILD_EVN = ТЕСТ
Эти изменения копируют папку в контейнер во время сборки докера. когда мы выполняем docker-compose up, он копирует или развертывает фактическую необходимую папку на сервере перед запуском сервера.
источник
Скопируйте все файлы в одноразовый каталог, вручную выберите тот, который вам нужен, а остальные выбросьте.
Вы можете добиться чего-то похожего, используя этапы сборки, которые основаны на том же решении, используя
cp
для условного копирования. Используя этап сборки, ваше окончательное изображение не будет включать весь контент из исходногоCOPY
.источник
cache
и, в зависимости от того, что это за кеш, выбираю, что делать в файлах сценария!Пробовали другие идеи, но ни одна не соответствовала нашим требованиям. Идея состоит в том, чтобы создать базовый образ nginx для дочерних статических веб-приложений. По соображениям безопасности, оптимизации и стандартизации базовый образ должен иметь возможность выполнять
RUN
команды в каталогах, добавленных дочерними образами. Базовое изображение не определяет, какие каталоги добавляются дочерними изображениями. Предполагается, что дочерние изображения будутCOPY
где-то под ресурсамиCOMMON_DEST_ROOT
.Этот подход является взломом, но идея состоит в том, что базовый образ будет поддерживать
COPY
инструкции для каталогов от 1 до N, добавленных дочерним изображением.ARG PLACEHOLDER_FILE
иENV UNPROVIDED_DEST
используются для удовлетворения<src>
и<dest>
требования к любойCOPY
инструкции не требуется.У этого решения есть очевидные недостатки, такие как фиктивное
PLACEHOLDER_FILE
и жестко запрограммированное количество поддерживаемых инструкций COPY. Также нет способа избавиться от переменных ENV, которые используются в инструкции COPY.источник