¿Cómo copiar múltiples archivos en una capa usando un Dockerfile?

245

Lo siguiente Dockerfilecontiene cuatro COPYcapas:

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

¿Cómo copiar estos archivos usando una capa en su lugar? Se intentó lo siguiente:

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

Respuestas:

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

o

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

También puede usar caracteres comodín en la especificación del archivo fuente. Ver los documentos para un poco más de detalle .

Los directorios son especiales! Si tú escribes

COPY dir1 dir2 ./

que realmente funciona como

COPY dir1/* dir2/* ./

Si desea copiar múltiples directorios (no sus contenidos) en un directorio de destino en un solo comando, deberá configurar el contexto de compilación para que sus directorios de origen estén bajo un padre común y luego COPYese padre.

Nathaniel Waisbrot
fuente
53
Tenga en cuenta que si las fuentes son directorios, esto copia el contenido del directorio , no los directorios en sí.
Claudiu
77
Tenga en cuenta también que el directorio de destino es el mismo. Si hace muchos archivos diferentes con diferentes destinos, puede considerar construir un sistema de archivos superpuestos (como un chroot), luego convertirlo en un tararchivo y agregarlo con ADD.
tu-Reinstate Monica-dor duh
44
@Claudiu ¿Cómo copiar las carpetas ellos mismos?
k0pernikus
55
@ k0pernikus puede decir COPIAR myDir1 ./MyDir1/
Manuel
@ manuel-manhart ¿Hay alguien que sepa si podemos parametrizar la lista de archivos usando un parámetro de construcción? github.com/moby/moby/issues/38532 ?
Marcello de Sales el
52
COPY <all> <the> <things> <last-arg-is-destination>

Pero aquí hay un extracto importante de los documentos:

Si tiene varios pasos de Dockerfile que usan diferentes archivos de su contexto, COPIELOS individualmente, en lugar de todos a la vez. Esto garantiza que la memoria caché de compilación de cada paso solo se invalide (obligando a que el paso se vuelva a ejecutar) si cambian los archivos específicamente requeridos.

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

swapsCAPS
fuente
¿Sabes si podemos parametrizar "todas las cosas"? ¿Usando parámetros de construcción? github.com/moby/moby/issues/38532 ???
Marcello de Sales el
@MarcellodeSales no está seguro de por qué necesitarías eso. ¿Por qué no crea una imagen base sin estos archivos y luego las imágenes secundarias tienen la instrucción de copia? Si necesitan definir la ruta de todos modos, no hay mucha diferencia. O simplemente puede dejarlo fuera de las imágenes por completo y montarlo en el contenedor; allí tiene los archivos .env para tener esto configurable.
Manuel Manhart
Además, siempre puede copiar sobre una ruta existente de todos modos, ya que el sistema de archivos está en capas, se superpondrá / sombreará el contenido preexistente.
Manuel Manhart
@ManuelManhart, estoy construyendo una imagen dinámica parametrizada con COPIA ONBUILD ... Como parte de una plataforma, estoy ocultando la complejidad de lo que hay que hacer en la imagen, por eso necesito que me proporcionen los valores. como un parámetro
Marcello de Sales el
@MarcellodeSales No creo que esto sea compatible ahora / todavía. Pero podría usar argumentos de compilación para encapsularlo, consulte stackoverflow.com/questions/43654656/…
Manuel Manhart el
7

sencillo

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

del doc

Si se especifican múltiples recursos, ya sea directamente o debido al uso de un comodín, entonces debe ser un directorio y debe terminar con una barra diagonal /.

Edwin Ikechukwu Okonkwo
fuente
6

Vale la pena mencionar que también puede crear un .dockerignorearchivo, para excluir los archivos que no desea copiar:

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

Antes de que la CLI de docker envíe el contexto al demonio de docker, busca un archivo llamado .dockerignore en el directorio raíz del contexto. Si este archivo existe, la CLI modifica el contexto para excluir archivos y directorios que coinciden con los patrones que contiene. Esto ayuda a evitar el envío innecesario de archivos y directorios grandes o confidenciales al demonio y, potencialmente, agregarlos a las imágenes mediante AGREGAR o COPIAR.

Aaron
fuente