docker COPY с подстановкой файлов

Внутри файла докеров я хочу указать операцию копирования для файлов, которые определяются путем подстановки, и я хочу, чтобы он также копировался с путем. Итак, что-то вроде этого:

COPY ./src/**/project.json /app/**/

Учитывая, что у меня есть следующая структура:

./src/bar/project.json
./src/foo/project.json

Пункт назначения должен выглядеть так:

/app/bar/project.json
/app/foo/project.json

но, видимо, это не работает, и я действительно не хочу указывать все операции COPY отдельно, если у меня есть шанс. есть идеи как это сделать?

Обратите внимание, что я не могу в основном игнорировать другие файлы через .dockerignore как было предложено, так как я собираюсь скопировать другие файлы из той же папки после нарушение операции установки пакета. Итак, dockerfile похож на этот:

FROM microsoft/aspnet:1.0.0-rc1-update1

COPY ./src/**/project.json /app/**/
WORKDIR /app/ModernShopping.Auth
RUN ["dnu", "restore"]
ADD ./src /app

EXPOSE 44300
ENTRYPOINT ["dnx", "web"]

person tugberk    schedule 27.02.2016    source источник
comment
похоже, что этого еще нет: github.com/docker/docker/issues/15858   -  person tugberk    schedule 27.02.2016
comment
Здесь есть такая же проблема, надеюсь, они скоро ее добавят: github.com/docker /docker/issues/15771#issuecomment-225786238   -  person Joel Harkes    schedule 30.03.2017
comment
Почему вы не делаете трехстороннюю копию? Сначала скопируйте все в какую-нибудь временную папку с помощью COPY. Затем вы делаете RUN yourcopycommand only-my-proj-files-from-temp, затем RUN dnu restore, а потом еще RUN yourcopycommand the-remaining-files-from-temp. Последнее — очистка временной папки.   -  person blacklabelops    schedule 20.08.2017
comment
Отвечает ли это на ваш вопрос? Docker COPY с подстановочными знаками папок   -  person Michael Freidgeim    schedule 29.11.2020


Ответы (3)


Для любой нестандартной операции сборки я предпочитаю заключать команду docker build в сценарий (с именем 'build').
Здесь я бы

  • создайте подпапку tmp (рядом с Dockerfile, чтобы сохранить ее в контексте docker build)
  • сделать оболочку cp с подстановкой: cp ./src/**/project.json tmp
  • позвонить docker build, с Dockerfile включая COPY tmp/ /app/
  • удаление tmp.

Таким образом, я предварительно настраиваю то, что мне нужно от хоста, прежде чем создавать образ из контекста хоста.

person VonC    schedule 27.02.2016
comment
Для тех, кто все еще читает это, если вы создаете приложение NodeJS, gulp отлично подходит для этого. - person Jrop; 09.10.2018

Обходной путь

Dockerfile:

COPY src/ /app/

.dockerignore:

**
!**/project.json
person Alexander Zeitler    schedule 27.02.2016
comment
Минус в том, что я буду копировать все остальное после очередной операции (dnu restore). Итак, .dockerignore будет проблемой. - person tugberk; 27.02.2016
comment
Классный обходной путь для того, что я просил. Я должен был сделать вопрос более ясным, обновить его сейчас. - person tugberk; 27.02.2016

Немного поздно, но с многоэтапным построением вы можете получить такое поведение. Здесь я делаю это для большой сборки maven

FROM maven:3.6-slim as staging

WORKDIR /src/
COPY . .
RUN mkdir /poms/ \
    && find ./ -type d -exec mkdir -p '/poms/{}' \; \
    && find ./ -name pom.xml -exec cp -r '{}' '/poms/{}' \;

FROM maven:3.6-slim as builder

WORKDIR /src/

COPY --from=staging /poms/* ./
RUN mvn dependency:go-offline

Немного халтура, но учитывая, что это многоэтапность, первый этап просто выбрасывается, а копия - дешевая операция.

person ignorance    schedule 08.03.2020