Jak skopiować wiele plików na jednej warstwie przy użyciu Dockerfile?

246

Poniższy Dockerfilezawiera cztery COPYwarstwy:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Jak skopiować te pliki za pomocą jednej warstwy? Próbowano:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
kazhuravlev
źródło

Odpowiedzi:

427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

lub

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Możesz także użyć symboli wieloznacznych w specyfikacji pliku źródłowego. Zobacz dokumentację, aby uzyskać więcej szczegółów .

Katalogi są wyjątkowe! Jeśli napiszesz

COPY dir1 dir2 ./

to tak naprawdę działa

COPY dir1/* dir2/* ./

Jeśli chcesz skopiować wiele katalogów (a nie ich zawartość) do katalogu docelowego w jednym poleceniu, musisz skonfigurować kontekst kompilacji, aby katalogi źródłowe znajdowały się pod wspólnym rodzicem, a następnie z COPYtym rodzicem.

Nathaniel Waisbrot
źródło
53
Zauważ, że jeśli źródłami są katalogi, kopiuje to zawartość katalogu , a nie same katalogi.
Claudiu,
7
Zauważ też, że katalog docelowy jest taki sam. Jeśli wykonujesz wiele różnych plików z różnymi miejscami docelowymi, możesz rozważyć utworzenie systemu plików nakładki (takiego jak chroot), a następnie przekształcenie go w tararchiwum i dodanie go za pomocą ADD.
Tu-Reinstate Monica-dor duh
4
@Claudiu Jak skopiować same foldery?
k0pernikus
5
@ k0pernikus możesz powiedzieć KOPIUJ myDir1 ./MyDir1/
Manuel Manhart
@ manuel-manhart Czy jest ktoś, kto wie, czy możemy sparametryzować listę plików za pomocą parametru kompilacji? github.com/moby/moby/issues/38532 ?
Marcello de Sales,
52
COPY <all> <the> <things> <last-arg-is-destination>

Ale oto ważny fragment dokumentacji:

Jeśli masz wiele kroków Dockerfile, które używają innych plików z twojego kontekstu, KOPIUJ je pojedynczo, a nie wszystkie naraz. Zapewnia to, że pamięć podręczna kompilacji każdego kroku jest unieważniana (wymuszając ponowne uruchomienie kroku), jeśli zmienią się specjalnie wymagane pliki.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

swapsCAPS
źródło
wiesz, czy możemy sparametryzować „wszystkie rzeczy” ??? Używasz parametrów kompilacji? github.com/moby/moby/issues/38532 ???
Marcello de Sales,
@MarcellodeSales nie jest pewien, dlaczego jest to potrzebne. Dlaczego nie utworzysz obrazu podstawowego bez tych plików, a następnie w obrazach podrzędnych znajduje się instrukcja kopiowania - jeśli i tak muszą zdefiniować ścieżkę, nie robi to dużej różnicy. Lub możesz po prostu całkowicie pominąć obraz (y) i zamontować go w kontenerze - tam masz pliki .env, które można skonfigurować.
Manuel Manhart
Ponadto zawsze możesz kopiować istniejącą ścieżkę, ponieważ system plików jest warstwowy, nakłada się na niego / cień poprzedniej zawartości.
Manuel Manhart
@ManuelManhart, buduję dynamiczny sparametryzowany obraz za pomocą ONBUILD COPY ... W ramach platformy ukrywam złożoność tego, co należy zrobić na obrazie, dlatego potrzebuję podać wartości jako parametr.
Marcello de Sales
@MarcellodeSales Nie sądzę, że jest to obsługiwane teraz / jeszcze. Ale możesz użyć argumentów kompilacji, aby ją
zamknąć
7

prosty

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

z dokumentu

Jeśli podano wiele zasobów, bezpośrednio lub ze względu na użycie znaku wieloznacznego, musi to być katalog i musi kończyć się ukośnikiem /.

Edwin Ikechukwu Okonkwo
źródło
6

Warto wspomnieć, że możesz także utworzyć .dockerignoreplik, aby wykluczyć pliki, których nie chcesz kopiować:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Zanim CLI dokera wyśle ​​kontekst do demona dokera, szuka pliku o nazwie .dockerignore w katalogu głównym kontekstu. Jeśli ten plik istnieje, interfejs CLI modyfikuje kontekst, aby wykluczyć pliki i katalogi pasujące do zawartych w nim wzorców. Pomaga to uniknąć niepotrzebnego wysyłania dużych lub wrażliwych plików i katalogów do demona i potencjalnie dodając je do obrazów za pomocą ADD lub COPY.

Aaron
źródło