Você está tentando montar um diretório em um arquivo (ou vice-versa)?


97

Eu tenho um docker com versão 17.06.0-ce. Quando tento instalar o NGINX usando o docker com o 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

Mostra que

docker: Resposta de erro do daemon: erro de tempo de execução oci: container_linux.go: 262: iniciando processo de contêiner causado "process_linux.go: 339: inicialização de contêiner causado \" rootfs_linux.go: 57: montagem \\ "/ appdata / nginx / conf / nginx.conf \\ "a rootfs \\ "/ var / lib / janela de encaixe / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\" em \\" / var / lib / janela de encaixe / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 / etc / nginx / nginx.conf \\ "causou \\" não é um diretório \\ "\" ": Você está tentando montar um diretório em um arquivo (ou vice-versa)? Verifique se o caminho do host especificado existe e é do tipo esperado.

Caso não monte o nginx.confarquivo, está tudo bem. Então, como posso montar o arquivo de configuração?


Qual é a saída de ls -al .? Quero ver como é o seu pwd.
Tri Nguyen

1
No meu caso, mapeei acidentalmente um diretório do host para um arquivo no contêiner. Reiniciar o contêiner não funcionou mais. Tive que remover o contêiner ( docker rm …) e recriá-lo.
slhck de

Respostas:


27

Porque o docker irá reconhecer $PWD/conf/nginx.confcomo uma pasta e não como um arquivo. Verifique se o $PWD/conf/diretório contém nginx.confum diretório .

Teste com

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

Caso contrário, abra um problema do Docker .
Está funcionando bem para mim com a mesma configuração.


Como um usuário Linux de nível intermediário, estou curioso, qual é a razão do Linux reconhecer isso como uma pasta e não um arquivo?
J. Scott Elblein

Porque na verdade é uma pasta. Se o arquivo não existir, o docker criará uma pasta por causa do argumento de volume-v
Mathieu Lescaudron

ok, então o Linux só o reconhece como uma pasta se docker teve que criá-lo devido ao caminho não existente anteriormente; mas se nginx.confjá existisse anteriormente nesse caminho, o Linux o reconheceria como um arquivo, certo?
J. Scott Elblein

139

Isso não deve mais acontecer (desde a v2.2.0.0), veja aqui


Se você estiver usando o Docker para Windows , esse erro pode ocorrer se você tiver alterado sua senha recentemente.

Como consertar:

  1. Primeiro, certifique-se de excluir o volume do contêiner quebrado.
    docker rm -v <container_name>
    Atualização: As etapas abaixo podem funcionar sem a necessidade de excluir os volumes primeiro.
  2. Abra as configurações do Docker
  3. Vá para a guia "Drives compartilhados"
  4. Clique no link "Redefinir credenciais ..." na parte inferior da janela
  5. Compartilhe novamente as unidades que deseja usar com o Docker
  • Você deve ser solicitado a inserir seu nome de usuário / senha
  1. Clique em "Aplicar"
  2. Vá para a guia "Redefinir"
  3. Clique em "Reiniciar Docker"
  4. Recrie seus contêineres / volumes

O crédito vai para BaranOrnarli no GitHub pela solução.


2
Obrigado! Funciona para mim começando da segunda etapa e evitando a última.
Mateo Hermosilla

1
Consegui corrigir o problema começando na etapa 2 e também omitindo a última. Não precisei destruir os contêineres / volumes para montar novamente.
Christian Engel

Concordo com @MateoHermosilla, não precisa detetar o container, apenas "Reset Credentials"
sintetico82

Estou recebendo o mesmo erro ao tentar executar o proxy-deploy.sh ao instalar o sandbox-proxy (hadoop). Seguindo este sol. não consertou.
Vaibhav

2
Esse foi o problema para mim. A redefinição de senha ocorre em intervalos de alguns meses, então sempre me esqueço de redefinir as credenciais do drive compartilhado no Docker.
Anders Tornblad

44

TL; DR : Remova os volumes associados ao contêiner.

Encontre o nome do contêiner usando docker ps -ae remova-o usando:

docker rm -v <container_name>

Problema:

O erro que você está enfrentando pode ocorrer se você tentou executar o docker runcomando anteriormente enquanto o arquivo não estava presente no local onde deveria estar no diretório do host.

Nesse caso, o daemon do docker teria criado um diretório dentro do contêiner em seu lugar, que posteriormente falha no mapeamento para o arquivo apropriado quando os arquivos corretos são colocados no diretório do host e o comando docker é executado novamente.

Solução:

Remova os volumes que estão associados ao contêiner. Se você não estiver preocupado com outros volumes de contêiner, também pode usar:

docker volume rm $(docker volume ls -q)

O comando na questão original listou apenas os volumes do host como sendo usados. O docker volumecomando / interface é apenas para volumes anônimos e nomeados, que não fazem parte da pergunta original.
programadorq

@programmerq Olha o erro, diz que a montagem estava falhando quando tentou montar na /var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"minha dedução: Já tem uma pasta devido a uma execução anterior, então se você tentar mapear um arquivo para essa pasta, ele falhará.
Ayushya

Aqui, duas coisas podem ter dado errado, ou o host tem coisas erradas ou o volume já criado tem algo incorreto. Supondo que o host esteja correto, pensei que seria melhor eliminar os problemas com o volume existente.
Ayushya

1
Na verdade, essa é uma resposta válida para quando o contêiner já foi associado a um volume e o tipo desse volume está sendo alterado na próxima execução. Portanto, remover o volume pode ajudar!
Yan Foto

1
Isso foi útil. O problema no meu caso era que eu tinha contêineres antigos ainda definidos. Usar docker rm para zapá-los e depois fazer docker-compose funcionou corretamente.
Max Tardiveau

7

Resposta para pessoas que usam o Docker Toolbox

Houve pelo menos 3 respostas aqui abordando o problema, mas não explicando-o corretamente e não dando uma solução completa. Este é apenas um problema de montagem de pasta .

Descrição do problema:

O Docker Toolbox ignora o requisito do Hyper-V do Docker criando uma máquina virtual (no VirtualBox, que vem incluído). O Docker é instalado e executado dentro da VM. Para que o Docker funcione corretamente, ele precisa ter acesso ao da máquina host. O que aqui não acontece.

Depois de instalar o Docker Toolbox, ele criou o VirtualBox VM e apenas montou C:\Usersna máquina, como \c\Users\. Meu projeto estava em C:\projectslugar nenhum no volume montado. Quando estava enviando o caminho para a VM, ele não existia, pois C:\projectsnão está montado. Daí o erro acima.

Digamos que eu tivesse meu projeto contendo minha configuração ngnix em C:/projects/project_name/

Consertando-o:

  1. Vá para o VirtualBox, clique com o botão direito em Padrão (a VM do Docker)> Configurações> Pastas compartilhadas insira a descrição da imagem aqui

  2. Ao clicar no pequeno ícone com o sinal de mais no lado direito, adicione um novo compartilhamento. Usei as seguintes configurações:

insira a descrição da imagem aqui

  1. O código acima será mapeado C:\projectspara /projects( ROOT/projects) na VM, o que significa que agora você pode fazer referência a qualquer caminho em projetos como este: /projects/project_name- porque project_namede C:\projects\project_nameagora está montado.

Para usar caminhos relativos, considere nomear o caminho c/projectsnãoprojects

  1. Reinicie tudo e agora deve funcionar corretamente. Parei manualmente a máquina virtual no VirtualBox e reiniciei a Docker Toolbox CLI.

No meu arquivo docker, agora faço referência ao nginx.confseguinte:

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

Onde o nginx.conf realmente reside C:\projects\project_name\docker_config\nginx\nginx.conf


7

A explicação dada por @Ayushya foi a razão pela qual recebi esta mensagem de erro um tanto confusa e a limpeza necessária pode ser feita facilmente assim:

$ docker container prune
$ docker volume prune

6

Eu tive o mesmo problema. Eu estava usando o Docker Desktop com WSL no Windows 10 17.09.

Causa do problema:

O problema é que o Docker para Windows espera que você forneça seus caminhos de volume em um formato que corresponda a este:

/c/Users/username/app

MAS, em vez disso, o WSL usa o formato:

/mnt/c/Users/username/app

Isso é confuso porque ao verificar o arquivo no console eu vi, e para mim estava tudo correto. Eu não estava ciente das expectativas do Docker para Windows sobre os caminhos de volume .

Solução para o problema:

Liguei os pontos de montagem personalizados para corrigir as diferenças do Docker para Windows e WSL:

sudo mount --bind /mnt/c /c

Como sugerido neste guia incrível: Configurando o Docker para Windows e WSL para funcionar perfeitamente e tudo está funcionando perfeitamente agora.

Antes de começar a usar o WSL, eu estava usando Git Bash e também tinha esse problema.



4

Estou usando o Docker ToolBox para Windows. Por padrão C unidade é montada automaticamente, de modo a fim de montar os arquivos, certifique-se seus arquivos e pastas estão dentro C UNIDADE .

Exemplo: C:\Users\%USERNAME%\Desktop


1
minha pasta montada é C: \ x-suite \; Eu compartilhei meu drive C, mas ainda não resolvi meu problema
袁文涛

você está usando o Docker ToolBox?
Abhishek DK

minikube + virtualBox + docker ToolBox, localkube foi preterido, qual driver devo usar?
袁文涛 de

se você estiver montando a partir do Dockercompose, use $ {pwd} / <path>
Abhishek DK

1
se estiver fazendo no Dockerfile, use VOLUME / c / x-suite
Abhishek DK

3

Talvez alguém ache isso útil. Meu arquivo de composição teve o seguinte volume montado

./file:/dir/file

Como ./file não existia, ele foi montado no ABC (por padrão, como pasta).

No meu caso, tive um contêiner resultante de

docker commit ABC cool_image

Mais tarde, quando criei ./file e executei docker-compose up, tive o erro:

[...] Você está tentando montar um diretório em um arquivo (ou vice-versa)? Verifique se o caminho do host especificado existe e é do tipo esperado.

O contêiner trazido de cool_imagelembrou que /dir/fileera um diretório e entrou em conflito com o criado e montado recentemente ./file.

A solução foi:

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image

Obrigado, esse também era meu problema, pois tenho uma configuração bastante complexa do Docker!
rmcsharry de

1

No Windows 10, recebo esse erro sem alterar nada no meu docker-compose.ymlarquivo ou na configuração do Docker em geral.

No meu caso, estava usando uma VPN com uma política de firewall que bloqueia a porta 445.

Depois de se desconectar da VPN, o problema desaparece.

Portanto, eu recomendo verificar seu firewall e não usar um proxy ou VPN ao executar o Docker Desktop.

Verifique Docker para janelas - regras de firewall para unidades compartilhadas para obter mais detalhes.

Espero que isso ajude mais alguém.


1

Você poderia usar o caminho absoluto / completo em vez de $PWD/conf/nginx.conf? Então vai 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

se você escapar com aspas duplas: docker run -d --rm -v "$ PWD / nginx.conf: /etc/nginx/nginx.conf" nginx não deve fazer diferença, pois o shell irá traduzi-lo antes de transmiti-lo para docker run e, na verdade, não faz diferença, pelo menos para mim
Manumie

1

Tive o mesmo problema ao usar o Docker sobre WSL1 no Windows 10 com esta linha de comando:

echo $PWD
/mnt/d/nginx

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

Resolvi isso alterando o caminho do arquivo no sistema host para um caminho absoluto no estilo UNIX:

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

ou usando um caminho absoluto no estilo do Windows em /vez de \separadores de caminho:

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

Você notou alguma diferença de desempenho ao usar o caminho de estilo do Windows em relação ao caminho de estilo Unix?
J. Scott Elblein,

Eu não sei dizer. Estou apenas usando o Docker para Windows para teste / desenvolvimento e nunca monitorei o desempenho.
bwibo

0

Atualizar o Virtual Box para 6.0.10 corrigiu esse problema para o Docker Toolbox

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

Eu estava enfrentando este tipo de erro:


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

Depois de atualizar o VitualBox, todos os comandos funcionaram perfeitamente 🎉


0

Sofri o mesmo arranhão na cabeça porque não tinha o arquivo localmente, então criei uma pasta.

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/

0

desconhecido: você está tentando montar um diretório em um arquivo (ou vice-versa)? Verifique se o caminho do host especificado existe e é o tipo esperado

Eu tive um erro semelhante no niginx no ambiente Mac. O Docker não reconheceu o arquivo default.conf corretamente. Depois de alterar o caminho relativo para o caminho absoluto, o erro foi corrigido.

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

0

Para mim, isso não funcionou:

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

Mas isso funciona bem (obviamente movi meu arquivo de configuração para um novo diretório também:

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

0

Vou compartilhar meu caso aqui, pois isso pode economizar muito tempo para outra pessoa no futuro.

Eu tinha um docker-compose funcionando perfeitamente em meus macos, até começar a usar o docker-in-docker no Gitlab CI. Eu só recebi permissão para trabalhar como Mestre em um repositório, e o Gitlab CI é auto-hospedado e configurado por outra pessoa e nenhuma outra informação foi compartilhada, sobre como é configurado, etc.

O seguinte causou o problema:

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

Só quando percebi que isso pode estar rodando no Windows (horas coçando a cabeça), tentei renomear o wodpress.conf para default.conf e apenas definir os caminhos de acesso dir:

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

Isso resolveu o problema!


0

Eu tive esse problema no Windows 7 porque meu dockerfile estava em uma unidade diferente.

Aqui está o que fiz para resolver o problema:

  1. Abra o Gerenciador VirtualBox
  2. Selecione o recipiente "padrão" e edite as configurações.
  3. Selecione Pastas compartilhadas e clique no ícone para adicionar uma nova pasta compartilhada
  4. Caminho da pasta: x: \
  5. Nome da pasta: / x
  6. Verifique a montagem automática e torne permanente
  7. Reinicie a máquina virtual

Neste ponto, docker-compose updeve funcionar.


0

Recebi o mesmo erro no Windows10 após uma atualização do Docker: 2.3.0.2 (45183).

... causou \\\"not a directory\\\"\"":desconhecido: Você está tentando montar um diretório em um arquivo (ou vice-versa)? Verifique se o caminho do host especificado existe e é o tipo esperado

Eu estava usando caminhos absolutos como esse //C/workspace/nginx/nginx.confe tudo funcionou como um encanto.
A atualização quebrou meu docker-compose e tive que mudar os caminhos para /C/workspace/nginx/nginx.confcom um único /para a raiz.


0

Observe que essa situação também ocorrerá se você tentar montar um volume do host que não foi adicionado à seção Recursos> Compartilhamento de arquivo das Preferências do Docker.

insira a descrição da imagem aqui

Adicionar o caminho raiz como um recurso de compartilhamento de arquivos agora permitirá que o Docker acesse o recurso para montá-lo no contêiner. Observe que você pode precisar apagar o conteúdo do seu contêiner do Docker para tentar remontar o volume.

Por exemplo, se seu aplicativo estiver localizado em /mysites/myapp, você desejará adicionar /mysitescomo o local do recurso de compartilhamento de arquivos.


0

Eu tive o mesmo problema, docker-compose estava criando um diretório em vez de um arquivo e, em seguida, travando no meio do caminho.

O que eu fiz:

  1. Execute o contêiner sem nenhum mapeamento.

  2. Copie o .confarquivo para o local do host:

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

  3. Remova o recipiente ( docker-compose down).

  4. Coloque o mapeamento de volta.

  5. Monte novamente o recipiente.

O Docker Compose encontrará o .confarquivo e o mapeará , em vez de tentar criar um diretório .


0

No meu caso foi um problema com Docker para Windows e uso de partição criptografada pelo Bitlocker. Se você tiver arquivos de projeto em arquivos criptografados após reiniciar e desbloquear a unidade, o Dokcer não vê os arquivos de projeto corretamente.

Tudo que você precisa fazer é reiniciar o Docker


-2

Eu resolvi o problema da montagem. Estou usando um ambiente Win 7 e o mesmo problema aconteceu comigo.

Você está tentando montar um diretório em um arquivo?

O contêiner tem um diretório de sincronização padrão em C:\Users\, então movi meu projeto para C:\Users\e recriei o projeto. Agora funciona.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.