¿Está intentando montar un directorio en un archivo (o viceversa)?

92

Tengo una ventana acoplable con versión 17.06.0-ce. Cuando intento instalar NGINX usando la ventana acoplable con el comando:

docker run -p 80:80 -p 8080:8080 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx:latest

Muestra que

docker: Respuesta de error de daemon: oci runtime error: container_linux.go: 262: el proceso de inicio del contenedor provocó "process_linux.go: 339: el inicio del contenedor provocó \" rootfs_linux.go: 57: montaje \\ "/ appdata / nginx / conf / nginx. \\ "causado \\" no es un directorio \\ "\" ": ¿Estás intentando montar un directorio en un archivo (o viceversa)? Compruebe si la ruta de host especificada existe y es del tipo esperado.

Si no monta el nginx.confarchivo, todo está bien. Entonces, ¿cómo puedo montar el archivo de configuración?

Steven Luo
fuente
¿Cuál es la salida de ls -al .? Quiero ver cómo se ve tu pwd.
Tri Nguyen
1
En mi caso, había asignado accidentalmente un directorio desde el host a un archivo en el contenedor. Reiniciar el contenedor ya no funcionó. Tuve que eliminar el contenedor ( docker rm …) y luego volver a crearlo.
slhck

Respuestas:

26

Porque Docker reconocerá $PWD/conf/nginx.confcomo una carpeta y no como un archivo. Compruebe si el $PWD/conf/directorio contiene nginx.confcomo directorio .

Prueba con

> cat $PWD/conf/nginx.conf 
cat: nginx.conf/: Is a directory

De lo contrario, abra un problema de Docker .
Funciona bien para mí con la misma configuración.

Mathieu Lescaudron
fuente
Como usuario de Linux de nivel intermedio, tengo curiosidad, ¿cuál es la razón para que Linux reconozca eso como una carpeta y no como un archivo?
J. Scott Elblein
Porque en realidad es una carpeta. Si el archivo no existe, la ventana acoplable crea una carpeta debido al argumento de volumen-v
Mathieu Lescaudron
ok, entonces Linux solo lo reconoce como una carpeta si Docker tuvo que crearlo debido a que la ruta no existía previamente; pero si nginx.confya existiera previamente en esa ruta, Linux lo reconocería como un archivo, ¿verdad?
J. Scott Elblein
137

Esto ya no debería suceder (desde v2.2.0.0), vea aquí


Si está utilizando Docker para Windows , este error puede ocurrir si ha cambiado recientemente su contraseña.

Como arreglar:

  1. Primero asegúrese de eliminar el volumen del contenedor roto
    docker rm -v <container_name>
    Actualización: Los pasos a continuación pueden funcionar sin necesidad de eliminar volúmenes primero.
  2. Abrir configuración de Docker
  3. Vaya a la pestaña "Unidades compartidas"
  4. Haga clic en el enlace "Restablecer credenciales ..." en la parte inferior de la ventana.
  5. Vuelva a compartir las unidades que desea usar con Docker
  • Se le debe pedir que ingrese su nombre de usuario / contraseña
  1. Haga clic en "Aplicar"
  2. Ve a la pestaña "Restablecer"
  3. Haga clic en "Reiniciar Docker".
  4. Vuelva a crear sus contenedores / volúmenes

El crédito va a BaranOrnarli en GitHub por la solución.

Jesse Webb
fuente
2
¡Gracias! A mí me funciona a partir del segundo paso y evitando el último.
Mateo Hermosilla
1
Pude solucionar el problema comenzando en el paso 2 y también omitiendo el último. No tuve que destruir los contenedores / volúmenes para montar nuevamente.
Christian Engel
Estoy de acuerdo con @MateoHermosilla, no es necesario que detecte el contenedor, solo "Reset Credentials"
sintetico82
Recibo el mismo error cuando intento ejecutar proxy-deploy.sh mientras instalo sandbox-proxy (hadoop). Siguiendo este soln. no lo arregló.
Vaibhav
2
Este fue el problema para mí. El restablecimiento de la contraseña se realiza cada pocos meses, por lo que sigo olvidándome de restablecer las credenciales de Shared Drive en Docker.
Anders Tornblad
41

TL; DR : Elimina los volúmenes asociados con el contenedor.

Busque el nombre del contenedor usando y docker ps -aluego elimine ese contenedor usando:

docker rm -v <container_name>

Problema:

El error al que se enfrenta puede ocurrir si anteriormente intentó ejecutar el docker runcomando mientras el archivo no estaba presente en la ubicación donde debería haber estado en el directorio de host.

En este caso, el demonio de la ventana acoplable habría creado un directorio dentro del contenedor en su lugar, que luego no se puede asignar al archivo correcto cuando se colocan los archivos correctos en el directorio del host y se ejecuta nuevamente el comando de la ventana acoplable.

Solución:

Elimine los volúmenes asociados con el contenedor. Si no le preocupan otros volúmenes de contenedores, también puede utilizar:

docker volume rm $(docker volume ls -q)
Ayushya
fuente
El comando de la pregunta original solo enumeraba los volúmenes de host como en uso. El docker volumecomando / interfaz es solo para volúmenes anónimos y con nombre, que no forman parte de la pregunta original.
programmerq
@programmerq Mire el error, dice que el montaje estaba fallando cuando intentó montar en /var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"Mi deducción: ya tiene una carpeta debido a una ejecución anterior, por lo que si intenta asignar un archivo a esa carpeta, fallará.
Ayushya
Aquí dos cosas pueden haber salido mal, o el host tiene cosas incorrectas o el volumen ya creado tiene algo incorrecto. Suponiendo que el host sea correcto, pensé que sería mejor solucionar los problemas con el volumen existente.
Ayushya
1
En realidad, esta es una respuesta válida para cuando el contenedor ya se ha asociado con un volumen y el tipo de ese volumen se cambia en la próxima ejecución. ¡Así que eliminar el volumen podría ayudar!
Yan Foto
1
Esto fue útil. El problema en mi caso fue, de hecho, que todavía tenía los contenedores viejos definidos. Usar docker rm para eliminarlos y luego hacer un docker-compose funcionó correctamente.
Max Tardiveau
7

Respuesta para personas que usan Docker Toolbox

Ha habido al menos 3 respuestas aquí que tocan el problema, pero no lo explican correctamente y no dan una solución completa. Este es solo un problema de montaje de carpeta .

Descripción del problema:

Docker Toolbox evita el requisito de Hyper-V de Docker al crear una máquina virtual (en VirtualBox, que viene incluida). Docker está instalado y se ejecuta dentro de la VM. Para que Docker funcione correctamente, debe tener acceso al desde la máquina host. Que aquí no es así.

Después de instalar Docker Toolbox, creó la VM VirtualBox y solo se montó C:\Usersen la máquina, como \c\Users\. Mi proyecto estaba C:\projectstan en ninguna parte en el volumen montado. Cuando estaba enviando la ruta a la VM, no existiría, ya C:\projectsque no está montada. De ahí el error anterior.

Digamos que tenía mi proyecto que contenía mi configuración ngnix en C:/projects/project_name/

Arreglando lo:

  1. Vaya a VirtualBox, haga clic derecho en Predeterminado (la VM de Docker)> Configuración> Carpetas compartidas ingrese la descripción de la imagen aquí

  2. Al hacer clic en el icono pequeño con el signo más en el lado derecho, agregue un nuevo recurso compartido. Usé la siguiente configuración:

ingrese la descripción de la imagen aquí

  1. Lo anterior se asignará C:\projectsa /projects( ROOT/projects) en la VM, lo que significa que ahora puede hacer referencia a cualquier ruta en proyectos como este: /projects/project_name- porque project_namedesde C:\projects\project_nameahora está montado.

Para usar rutas relativas, considere nombrar la ruta c/projectsnoprojects

  1. Reinicie todo y ahora debería funcionar correctamente. Detuve manualmente la máquina virtual en VirtualBox y reinicié la CLI de Docker Toolbox.

En mi archivo de docker, ahora hago referencia nginx.confa esto:

volumes:
    - /projects/project_name/docker_config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf

Donde nginx.conf realmente reside en C:\projects\project_name\docker_config\nginx\nginx.conf

viorel
fuente
7

La explicación dada por @Ayushya fue la razón por la que recibí este mensaje de error un tanto confuso y la limpieza necesaria se puede hacer fácilmente de esta manera:

$ docker container prune
$ docker volume prune
Andy Brown
fuente
6

Yo tuve el mismo problema. Estaba usando Docker Desktop con WSL en Windows 10 17.09.

Causa del problema:

El problema es que Docker para Windows espera que proporcione sus rutas de volumen en un formato que coincida con este:

/c/Users/username/app

PERO, WSL en su lugar usa el formato:

/mnt/c/Users/username/app

Esto es confuso porque al revisar el archivo en la consola lo vi, y para mí todo estaba correcto. No conocía las expectativas de Docker para Windows sobre las rutas de volumen .

Solución al problema:

Uní los puntos de montaje personalizados para corregir las diferencias de Docker para Windows y WSL:

sudo mount --bind /mnt/c /c

Como se sugiere en esta increíble guía: Configurar Docker para Windows y WSL para que funcionen sin problemas y todo funciona perfectamente ahora.

Antes de comenzar a usar WSL, estaba usando Git Bash y también tenía este problema.

webcu
fuente
1
Más detalles aquí: github.com/10up/wp-local-docker/issues/…
nbeuchat
4

Estoy usando Docker ToolBox para Windows. De manera predeterminada, C Drive se monta automáticamente, por lo que para montar los archivos, asegúrese de que sus archivos y carpetas estén dentro de C DRIVE .

Ejemplo: C:\Users\%USERNAME%\Desktop

Abhishek DK
fuente
1
mi carpeta montada es C: \ x-suite \; Compartí mi unidad C, pero todavía no he resuelto mi problema
袁文涛
¿está utilizando Docker ToolBox?
Abhishek DK
minikube + virtualBox + docker ToolBox, localkube estaba en desuso, ¿qué controlador debo usar?
袁文涛
si está montando desde Dockercompose, use $ {pwd} / <path>
Abhishek DK
1
si lo está haciendo en Dockerfile, use VOLUME / c / x-suite
Abhishek DK
2

Quizás alguien encuentre esto útil. Mi archivo de redacción tenía el siguiente volumen montado

./file:/dir/file

Como ./file no existía, se montó en ABC (por defecto como carpeta).

En mi caso tuve un contenedor resultado de

docker commit ABC cool_image

Cuando más tarde creé ./file y lo ejecuté docker-compose up, tuve el error:

[...] ¿Estás intentando montar un directorio en un archivo (o viceversa)? Compruebe si la ruta de host especificada existe y es del tipo esperado.

El contenedor traído desde cool_imagerecordó que /dir/fileera un directorio y entró en conflicto con el creado y montado recientemente../file .

La solucion fue:

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image
Yuriy Pozniak
fuente
Gracias, este también fue mi problema ya que tengo una configuración de Docker bastante compleja.
rmcsharry
1

En Windows 10, obtengo este error sin cambiar nada en mi docker-compose.ymlarchivo o configuración de Docker en general.

En mi caso, estaba usando una VPN con una política de firewall que bloquea el puerto 445.

Después de desconectarse de la VPN, el problema desaparece.

Por lo tanto, recomiendo verificar su firewall y no usar un proxy o VPN cuando ejecute Docker Desktop.

Consulte Docker para Windows: reglas de firewall para unidades compartidas para obtener más detalles.

Espero que esto ayude a alguien más.

Mohammed Réda OUASSINI
fuente
1

¿Podría utilizar la ruta absoluta / completa en lugar de $PWD/conf/nginx.conf? Entonces funcionará.

EX:docker run --name nginx-container5 --rm  -v /home/sree/html/nginx.conf:/etc/nginx/nginx.conf -d -p 90:80 nginx
b9ead15988a93bf8593c013b6c27294d38a2a40f4ac75b1c1ee362de4723765b

root@sree-VirtualBox:/home/sree/html# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b9ead15988a9        nginx               "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:90->80/tcp   nginx-container5
e2b195a691a4        nginx               "/bin/bash"              16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp   test-nginx
Srikanth Muppalaneni
fuente
si lo escapas con comillas dobles: docker run -d --rm -v "$ PWD / nginx.conf: /etc/nginx/nginx.conf" nginx no debería hacer ninguna diferencia ya que el shell lo traducirá antes de pasarlo a Docker Run y, en realidad, no hace una diferencia, al menos para mí
Manumie
1

Experimenté el mismo problema al usar Docker sobre WSL1 en Windows 10 con esta línea de comando:

echo $PWD
/mnt/d/nginx

docker run --name nginx -d \
  -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

Lo resolví cambiando la ruta del archivo en el sistema host a una ruta absoluta de estilo UNIX:

docker run --name nginx -d \
  -v /d/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

o usando una ruta absoluta de estilo Windows con en /lugar de \como separadores de ruta:

docker run --name nginx -d \
  -v D:/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx
bwibo
fuente
¿Notó alguna diferencia de rendimiento al usar la ruta de estilo de Windows frente a la ruta de estilo de Unix?
J. Scott Elblein
No puedo decirlo. Solo estoy usando Docker para Windows para pruebas / desarrollo y nunca superviso el rendimiento.
bwibo
0

La actualización de Virtual Box a 6.0.10 solucionó este problema para Docker Toolbox

https://github.com/docker/toolbox/issues/844

Estaba experimentando este tipo de error:


mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ touch resolv.conf

mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv.conf ubuntu /bin/bash
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/c/Users/mlepisto/G/Projects/resolv.conf\\\" to rootfs \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged\\\" at \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged/etc/resolv.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

# mounting to some other file name inside the container did work just fine
mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects/
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv2.conf ubuntu /bin/bash
root@a5020b4d6cc2:/# exit
exit

Después de actualizar VitualBox, todos los comandos funcionaron bien 🎉

Mikael Lepistö
fuente
0

Tuve el mismo rasguño en la cabeza porque no tenía el archivo localmente, así que lo creó como una carpeta.

mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile
mimas@Anttis-MBP:~/random/dockerize/tube$ docker run --rm -v $(pwd)/logs.txt:/usr/app/logs.txt devopsdockeruh/first_volume_exercise
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/Users/mimas/random/dockerize/tube/logs.txt\\\" to rootfs \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged\\\" at \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged/usr/app/logs.txt\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile  logs.txt/
t0rjantai
fuente
0

desconocido: ¿Estás intentando montar un directorio en un archivo (o viceversa)? Compruebe si la ruta de host especificada existe y es del tipo esperado

Tuve un error similar en niginx en el entorno Mac. Docker no reconoció correctamente el archivo default.conf. Una vez que se cambió la ruta relativa a la ruta absoluta, se solucionó el error.

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
simpleDrinker
fuente
0

Para mí, esto no funcionó:

volumes:
  - ./:/var/www/html
  - ./nginx.conf:/etc/nginx/conf.d/site.conf

Pero esto funciona bien (obviamente también moví mi archivo de configuración dentro de un nuevo directorio:

volumes:
  - ./:/var/www/html
  - ./nginx/nginx.conf:/etc/nginx/conf.d/site.conf
Jon Winstanley
fuente
0

Compartiré mi caso aquí, ya que esto puede ahorrarle mucho tiempo a otra persona en el futuro.

Tenía un docker-compose que funcionaba perfectamente en mi macos, hasta que comencé a usar docker-in-docker en Gitlab CI. Solo me dieron permisos para trabajar como maestro en un repositorio, y Gitlab CI es autohospedado y configurado por otra persona y no se compartió ninguna otra información sobre cómo está configurado, etc.

Lo siguiente causó el problema:

volumes:
  - ./.docker/nginx/wordpress/wordpress.conf:/etc/nginx/conf.d/default.conf

Solo cuando noté que esto podría estar ejecutándose en Windows (horas rascándome la cabeza), intenté cambiar el nombre de wodpress.conf a default.conf y simplemente establecí los nombres de ruta de directorio:

volumes:
  - ./.docker/nginx/wordpress:/etc/nginx/conf.d

¡Esto resolvió el problema!

punkbit
fuente
0

Tuve este problema en Windows 7 porque mi archivo docker estaba en una unidad diferente.

Esto es lo que hice para solucionar el problema:

  1. Abrir VirtualBox Manager
  2. Seleccione el contenedor "predeterminado" y edite la configuración.
  3. Seleccione Carpetas compartidas y haga clic en el icono para agregar una nueva carpeta compartida
  4. Ruta de la carpeta: x: \
  5. Nombre de carpeta: / x
  6. Compruebe el montaje automático y haga permanente
  7. Reinicie la máquina virtual

En este punto, docker-compose updebería funcionar.

Pbarney
fuente
0

Recibí el mismo error en Windows10 después de una actualización de Docker: 2.3.0.2 (45183).

... causado \\\"not a directory\\\"\"":desconocido: ¿Estás intentando montar un directorio en un archivo (o viceversa)? Compruebe si la ruta de host especificada existe y es del tipo esperado

Estaba usando caminos absolutos como este //C/workspace/nginx/nginx.confy todo funcionó a la perfección.
La actualización rompió mi docker-compose, y tuve que cambiar las rutas a /C/workspace/nginx/nginx.confuna única /para la raíz.

ymoreau
fuente
0

Tenga en cuenta que esta situación también ocurrirá si intenta montar un volumen desde el host que no se ha agregado a la sección Recursos> Compartir archivos de las Preferencias de Docker.

ingrese la descripción de la imagen aquí

Agregar la ruta raíz como un recurso para compartir archivos ahora permitirá a Docker acceder al recurso para montarlo en el contenedor. Tenga en cuenta que es posible que deba borrar el contenido de su contenedor Docker para intentar volver a montar el volumen.

Por ejemplo, si su aplicación se encuentra en /mysites/myapp, querrá agregar /mysitescomo ubicación de recursos para compartir archivos.

Mark Shust en M.academy
fuente
0

Tuve el mismo problema, docker-compose estaba creando un directorio en lugar de un archivo, luego fallaba a mitad de camino.

Lo que hice:

  1. Ejecute el contenedor sin ningún mapeo.

  2. Copie el .confarchivo en la ubicación del host:

    docker cp containername:/etc/nginx/nginx.conf ./nginx.conf

  3. Retire el recipiente ( docker-compose down).

  4. Vuelva a colocar el mapa.

  5. Vuelva a montar el contenedor.

Componer ventana acoplable se encuentra el .confarchivo y asignar , en lugar de tratar de crear un directorio .

Chtiwi Malek
fuente
-2

He resuelto el problema de la montura. Estoy usando un entorno Win 7 y me sucedió el mismo problema.

¿Estás intentando montar un directorio en un archivo?

El contenedor tiene un directorio de sincronización predeterminado en C:\Users\, por lo que moví mi proyecto y C:\Users\luego lo recreé. Ahora funciona.

dan mu
fuente