Docker: agregar un archivo desde un directorio padre

186

En mi Dockerfiletengo:

ADD ../../myapp.war /opt/tomcat7/webapps/

Ese archivo existe ya que ls ../../myapp.warme devuelve el archivo correcto, pero cuando ejecuto sudo docker build -t myapp .tengo:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

¿Alguien sabe por qué y cómo hacerlo correctamente?

Anthony O.
fuente
2
Algunas soluciones superuser.com/questions/842642~~V~~plural~~3rd
Günter Zöchbauer

Respuestas:

225

Puede compilar el Dockerfile desde el directorio principal:

docker build -t <some tag> -f <dir/dir/Dockerfile> .
Boedy
fuente
3
¡Gracias! Esto funciona bien en un cuadro local, pero Docker Hub no puede construir la imagen ya que intenta hacerlo desde su mismo directorio (tbh, justo lo que uno esperaría normalmente). ¿Hay alguna manera de hacer el mismo truco en Docker Hub?
Marcel Hernández
No que yo sepa. Puede insertar la imagen en el registro en lugar de utilizar la compilación automatizada.
Boedy
2
@ eduncan911 No creo que esto esté en desuso en el momento en que escribo mi comentario. ¿Podrían haber cambiado de opinión desde entonces? Si me equivoco, ¿puede vincular a la documentación donde dice que está en desuso? ¡Gracias!
omninonsense
66
-f no parece estar en desuso por los documentos -> Especifique un Dockerfile (-f) : docs.docker.com/engine/reference/commandline/build/…
Ray
66
@ eduncan911 ¿puedes eliminar tu comentario ya que aparentemente no está en desuso? Inicialmente salté esta respuesta debido a tu comentario.
Chris Anderson
103

Desafortunadamente, (por razones prácticas y de seguridad, supongo), si desea agregar / copiar contenido local, debe ubicarse bajo la misma ruta raíz que Dockerfile.

De la documentación :

La ruta <src> debe estar dentro del contexto de la compilación; no puede AGREGAR ../algo / algo, porque el primer paso de una compilación de docker es enviar el directorio de contexto (y subdirectorios) al demonio de docker.

EDITAR: ahora hay una opción ( -f) para establecer la ruta de su Dockerfile; puede usarse para lograr lo que desea, vea la respuesta de @Boedy a continuación.

mbarthelemy
fuente
22
¿Hay una solución "limpia" para esto? Prefiero no reestructurar todo mi directorio de proyectos solo para acomodar esto.
ben_frankly
Como dijo @ Günter, aquí hay una solución alternativa superuser.com/a/842690/136024 ... ¿está realmente "limpio"? Bueno, al menos es una "solución" :)
Anthony O.
2
Ver mejor respuesta de @Boedy stackoverflow.com/a/34300129/2950621
nmgeek
103

Con docker-compose, puede configurar la carpeta de contexto:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile
Nikita Kuznetsov
fuente
9

Agregar algunos fragmentos de código para admitir la respuesta aceptada.

Estructura de directorios :

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Entrada del archivo Docker:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Comando utilizado para construir la imagen acoplable

docker build -t test:latest -f setup/docker/Dockerfile .
Binita Bharati
fuente
Gran enfoque. ¿Es posible compartir el código install_x.shtambién?
Ariful Haque
4

La solución para quienes usan Composer es usar un volumen que apunte a la carpeta principal:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

Pero estoy bastante seguro de que se puede hacer jugando con volúmenes en Dockerfile .

wikier
fuente
3
No puede Nota: El directorio del host es, por su naturaleza, dependiente del host. Por este motivo, no puede montar un directorio de host desde Dockerfile porque las imágenes compiladas deben ser portátiles. Un directorio de host no estaría disponible en todos los hosts potenciales. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk
4

Como -fcausó otro problema, desarrollé otra solución.

  • Crear una imagen base en la carpeta principal
  • Se agregaron los archivos requeridos.
  • Usó esta imagen como imagen base para el proyecto que está en una carpeta descendiente.

La -fbandera no resolvió mi problema porque mi onbuildimagen busca un archivo en una carpeta y tuvo que llamar así:

-f foo/bar/Dockerfile foo/bar

en vez de

-f foo/bar/Dockerfile .

También tenga en cuenta que esta es la única solución para algunos casos como -fmarca

guneysus
fuente