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?

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.


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.



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


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

3
Para ser claros, esto funciona para archivos, no para directorios.
GDorn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.