Docker sigue el enlace simbólico fuera del contexto

88

Otra pregunta más sobre el enlace simbólico de Docker. Tengo un montón de archivos que quiero copiar en todas mis compilaciones de Docker. Mi estructura de directorio es:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

En el ejemplo anterior, quiero que el archivo.txt se copie cuando construya la ventana acoplable dentro de dir1. Pero no quiero mantener varias copias de file.txt. Según este enlace, a partir de la versión 0.10 de Docker, la compilación de Docker debe

Siga los enlaces simbólicos dentro de la raíz del contenedor para obtener instrucciones de compilación de ADD.

Pero no obtengo ese archivo o directorio cuando construyo con cualquiera de estas líneas en mi Dockerfile:

ADD symlink /path/dirname o ADD symlink/file.txt /path/file.txt

La opción de montaje NO lo resolverá por mí (plataforma cruzada ...). Lo intenté tar -czh . | docker build -tsin éxito.

¿Hay alguna manera de hacer que Docker siga el enlace simbólico y copie common_files / file.txt en el contenedor construido?

Ravi
fuente

Respuestas:

68

Eso no es posible y no se implementará. Por favor, eche un vistazo a la discusión sobre el número de github n. ° 1676 :

No permitimos esto porque no es repetible. Un enlace simbólico en su máquina no es lo mismo que mi máquina y el mismo Dockerfile produciría dos resultados diferentes. Además, tener enlaces simbólicos a / etc / paasswd causaría problemas porque vincularía los archivos del host y no los archivos locales.

0x7d7b
fuente
Gracias. Sí, noté ese enlace antes, pero pensé que era para una versión mucho más antigua de Docker (0.6.1). El registro de cambios de 0.10 menciona que esto es posible github.com/docker/docker/blob/master/…
Ravi
Además, si "parent_dir" está verificado en cualquier computadora y si el enlace simbólico tiene una ruta relativa a "common_files", será repetible.
Ravi
2
Su cita Follow symlinks inside container's root for ADD build instructions.significa que dentro del contenedor se siguen los enlaces simbólicos. No en el directorio de contexto de compilación. En ADD file.txt /dir/file.txtel directorio dirpodría haber un enlace simbólico. Los argumentos que cité en mi respuesta aún son válidos y los enlaces simbólicos aún no se siguen en la última versión. Puede tener problemas (con respecto a la repetibilidad) cuando almacena enlaces simbólicos en sistemas de control de revisión como git . Por lo tanto, consulte esta pregunta .
0x7d7b
1
Veo su punto con respecto a los enlaces simbólicos en git. Pero los enlaces simbólicos no tienen que entrar en git. Un simple script de configuración puede preparar el entorno local creando enlaces simbólicos. Para mí, el costo de mantener 'n' copias de un archivo compartido parece demasiado alto desde la perspectiva del mantenimiento. Tal vez tenga que servirlo con apache. Gracias.
Ravi
18
que pena, mientras veo el punto no sigo la lógica y me muerde. Git maneja los enlaces simbólicos a la perfección, y también espero que las compilaciones funcionen en todas las máquinas y entornos donde se revisa el repositorio de origen ...?!
Gregor
9

Una posibilidad es ejecutar la compilación en el directorio principal, con:

$ docker build [tags...] -f dir1/Dockerfile .

(O de manera equivalente, en el directorio secundario)

$ docker build  [tags...] -f Dockerfile ..

El Dockerfile deberá configurarse para copiar / agregar con las rutas adecuadas. Dependiendo de su configuración, es posible que desee que un elemento .dockerignoreprincipal omita cosas que no desea que se pongan en contexto.

Shaunc
fuente
4

Si alguien todavía tiene este problema, encontré una solución muy buena en superuser.com:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

Básicamente, sugiere usar tar para eliminar la referencia de los enlaces simbólicos y alimentar el resultado en la compilación de Docker:

$ tar -czh . | docker build -
jdabrowski
fuente
¿Cómo hacer que funcione con docker-compose?
vitalets
2

en lugar de usar simlinks, es posible resolver el problema administrativamente simplemente moviendo archivos de sites_available a sites_enabled en lugar de copiar o hacer simlinks

por lo que la configuración de su sitio estará en una copia solo en la carpeta site_available si se detuvo o algo o en sites_enabled si se debe usar

Ilya Kolesnikov
fuente
1

Sé que rompe la portabilidad de la compilación de la ventana acoplable, pero puede usar enlaces duros en lugar de simbólicos:

ln /some/file ./hardlink
Eugenio
fuente
3
Para ser claros, esto funciona para archivos, no para directorios.
GDorn