디렉토리를 파일에 마운트하려고합니까 (또는 그 반대로)?


92

버전이있는도 커가 있습니다 17.06.0-ce. 도커를 명령과 함께 사용하여 NGINX를 설치하려고 할 때 :

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

그것은 보여줍니다

docker : 데몬의 오류 응답 : oci 런타임 오류 : container_linux.go : 262 : 컨테이너 프로세스 시작으로 인해 "process_linux.go : 339 : 컨테이너 초기화로 인해 \"rootfs_linux.go : 57 : 마운트 \\ "/ appdata / nginx / conf / 발생 nginx.conf \\ "를 rootfs \\"/ var / lib / docker / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\ "로 \\"/ var / lib / docker / aufs / mnt / dcea06947385aedfax574 / ngfada06947385aedfac114593b18fc8betc. \\ "이 (가) \\"디렉토리가 아닙니다. \\ "\" "발생 : 파일에 디렉토리를 마운트하려고합니까 (또는 그 반대)? 지정된 호스트 경로가 존재하고 예상 유형인지 확인하십시오.

nginx.conf파일을 마운트하지 않으면 모든 것이 정상입니다. 그렇다면 구성 파일을 어떻게 마운트 할 수 있습니까?


의 출력은 ls -al .무엇입니까? 암호가 어떻게 생겼는지보고 싶어요.
Tri Nguyen

1
제 경우에는 실수로 호스트의 디렉토리를 컨테이너의 파일에 매핑했습니다. 컨테이너를 다시 시작해도 더 이상 작동하지 않았습니다. 컨테이너 ( docker rm …) 를 제거한 다음 다시 만들어야했습니다.
slhck

답변:


26

Docker는 파일이 아닌 폴더$PWD/conf/nginx.conf 로 인식하기 때문 입니다. 있는지 확인 디렉토리에 포함 된 A와 디렉토리 .$PWD/conf/nginx.conf

테스트

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

그렇지 않으면 Docker 문제를 엽니 다 .
동일한 구성으로 잘 작동합니다.


중급 Linux 사용자로서 Linux가 파일이 아닌 폴더로 인식하는 이유는 무엇입니까?
J. Scott Elblein

실제로 폴더이기 때문입니다. 파일이 존재하지 않으면 docker가 볼륨 인수로 인해 폴더를 생성합니다-v
Mathieu Lescaudron

좋습니다. 따라서 Linux는 이전에 존재하지 않는 경로로 인해 docker가 생성해야하는 경우에만 폴더로 인식합니다. 하지만 nginx.conf이미 그 경로에 이미 존재했다면 리눅스는 그것을 파일로 인식 할 것입니다. 그렇죠?
J. Scott Elblein

137

더 이상 발생하지 않습니다 (v2.2.0.0 이후). 여기를 참조 하세요.


Windows 용 Docker를 사용하는 경우 경우 최근에 비밀번호를 변경 한 경우이 오류가 발생할 수 있습니다.

어떻게 고치는 지:

  1. 먼저 손상된 컨테이너의 볼륨
    docker rm -v <container_name>
    업데이트를 삭제해야합니다. 아래 단계는 먼저 볼륨을 삭제할 필요없이 작동 할 수 있습니다.
  2. Docker 설정 열기
  3. "공유 드라이브"탭으로 이동
  4. 창 하단의 "Reset Credentials ..."링크를 클릭하십시오.
  5. Docker와 함께 사용하려는 드라이브를 다시 공유하십시오.
  • 사용자 이름 / 비밀번호를 입력하라는 메시지가 표시됩니다.
  1. "적용"을 클릭하십시오.
  2. "재설정"탭으로 이동
  3. "Docker 다시 시작"을 클릭하십시오.
  4. 컨테이너 / 볼륨 다시 만들기

솔루션에 대한 크레딧은 GitHub의 BaranOrnarli로 이동합니다.


2
감사! 두 번째 단계부터 시작하여 마지막 단계를 피하는 것이 좋습니다.
Mateo Hermosilla

1
2 단계부터 시작하여 마지막 문제도 생략하여 문제를 해결할 수있었습니다. 다시 마운트하기 위해 컨테이너 / 볼륨을 파괴 할 필요가 없었습니다.
Christian Engel

나는 그것이 컨테이너 전용 "재설정 자격 증명"DETE 할 필요가 나던, @MateoHermosilla에 동의
sintetico82

sandbox-proxy (hadoop)를 설치하는 동안 proxy-deploy.sh를 실행하려고 할 때 동일한 오류가 발생합니다. 이 해결책을 따르십시오. 그것을 고치지 않았다.
Vaibhav

2
이것이 저에게 문제였습니다. 비밀번호 재설정은 몇 개월마다 이루어 지므로 Docker에서 공유 드라이브 자격 증명을 재설정하는 것을 잊었습니다.
Anders Tornblad 2019

41

TL; DR : 컨테이너와 관련된 볼륨을 제거합니다.

docker ps -a다음을 사용하여 컨테이너 이름을 찾은 다음 다음을 사용하여 해당 컨테이너를 제거합니다.

docker rm -v <container_name>

문제:

이전 docker run파일을 실행하는 동안 명령 실행을 시도한 경우 직면 한 오류가 발생할 수 있습니다. 이 호스트 디렉토리에 있어야하는 위치에 이없는 .

이 경우 docker 데몬은 그 자리에 컨테이너 내부 에 디렉토리를 만들었을 것 입니다. 나중에 올바른 파일을 호스트 디렉토리에 넣고 docker 명령이 다시 실행되면 적절한 파일에 매핑하지 못합니다.

해결책:

컨테이너와 연관된 볼륨을 제거하십시오. 다른 컨테이너 볼륨에 대해 걱정하지 않는 경우 다음을 사용할 수도 있습니다.

docker volume rm $(docker volume ls -q)

원래 질문의 명령은 사용중인 호스트 볼륨 만 나열했습니다. docker volume명령 / 인터페이스는 원래의 질문의 일부가 아닌 익명라는 이름의 볼륨입니다.
programmerq

@programmerq 오류를보세요. /var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"내 추론 에서 마운트하려고 할 때 마운트가 실패했다고 말합니다 . 이전 실행으로 인해 이미 폴더가 있으므로 해당 폴더에 파일을 매핑하려고하면 실패합니다.
Ayushya

여기서 두 가지가 잘못되었을 수 있습니다. 호스트에 잘못된 것이 있거나 이미 생성 된 볼륨에 잘못된 것이 있습니다. 호스트가 정확하다고 가정하면 기존 볼륨의 문제를 해결하는 것이 더 나을 것이라고 생각했습니다.
Ayushya

1
이것은 컨테이너가 이미 볼륨과 연결되어 있고 해당 볼륨의 유형이 다음 실행에서 변경되는 경우에 대한 유효한 대답입니다. 따라서 볼륨을 제거하면 도움이 될 수 있습니다!
Yan Foto

1
이것은 도움이되었습니다. 제 경우의 문제는 실제로 오래된 컨테이너가 정의되어 있다는 것입니다. docker rm을 사용하여 zap을 사용한 다음 docker-compose up이 제대로 작동했습니다.
Max Tardiveau 2018

7

Docker Toolbox를 사용하는 사람들을위한 답변

여기에 문제에 대한 답변이 3 개 이상 있지만 제대로 설명하지 않고 완전한 솔루션을 제공하지 않았습니다. 이것은 단지 폴더 마운트 문제 입니다.

문제에 대한 설명 :

Docker Toolbox는 가상 머신을 생성하여 Docker의 Hyper-V 요구 사항을 우회합니다 (번들 제공되는 VirtualBox에서). Docker는 VM 내부에 설치되고 실행됩니다. Docker가 제대로 작동하려면 호스트 컴퓨터에서에 액세스 할 수 있어야합니다. 여기에는 없습니다.

내가 도커 도구 상자를 설치 한 후에는 버추얼 VM을 생성에만 장착 C:\Users으로, 기계에 \c\Users\. 내 프로젝트는 C:\projects마운트 된 볼륨의 어디에도 없었습니다. VM에 경로를 보낼 때 C:\projects마운트 되지 않았으므로 존재 하지 않습니다. 따라서 위의 오류입니다.

내 ngnix 구성이 포함 된 프로젝트가 있다고 가정 해 보겠습니다. C:/projects/project_name/

수정 :

  1. VirtualBox로 이동하여 기본값 (Docker의 VM)> 설정> 공유 폴더를 마우스 오른쪽 버튼으로 클릭합니다. 여기에 이미지 설명 입력

  2. 오른쪽에 더하기가있는 작은 아이콘을 클릭하고 새 공유를 추가합니다. 다음 설정을 사용했습니다.

여기에 이미지 설명 입력

  1. 위는 매핑됩니다 C:\projects/projects( ROOT/projects지금은이 같은 프로젝트에 어떤 경로를 참조 할 수 있음을 의미하는 VM에) : /projects/project_name- 때문에project_name 에서 C:\projects\project_name마운트되었습니다.

상대 경로를 사용하려면 경로 이름 지정을 고려하십시오. c/projects 없습니다projects

  1. 모든 것을 다시 시작하면 이제 제대로 작동합니다. VirtualBox에서 가상 머신을 수동으로 중지하고 Docker Toolbox CLI를 다시 시작했습니다.

내 도커 파일에서 이제 nginx.conf 과 같이 .

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

nginx.conf가 실제로있는 곳 C:\projects\project_name\docker_config\nginx\nginx.conf


7

@Ayushya가 제공 한 설명은이 다소 혼란스러운 오류 메시지를 표시 한 이유였으며 필요한 관리 작업은 다음과 같이 쉽게 수행 할 수 있습니다.

$ docker container prune
$ docker volume prune

6

나는 같은 문제가 있었다. Windows 10 17.09에서 WSL과 함께 Docker Desktop을 사용하고있었습니다.

문제의 원인 :

문제는 Windows 용 Docker가 다음과 일치하는 형식으로 볼륨 경로를 제공 할 것으로 예상한다는 것입니다.

/c/Users/username/app

그러나 WSL은 대신 다음 형식을 사용합니다.

/mnt/c/Users/username/app

콘솔에서 파일을 확인할 때 내가 그것을 보았고 모든 것이 정확했기 때문에 이것은 혼란 스럽습니다. 볼륨 경로 에 대한 Windows 용 Docker의 기대치를 알지 못했습니다 .

문제 해결 방법 :

Windows 용 Docker 및 WSL 차이점을 수정하기 위해 사용자 지정 탑재 지점을 바인딩했습니다.

sudo mount --bind /mnt/c /c

이 놀라운 가이드에서 제안한 것처럼 Windows 및 WSL 용 Docker 가 완벽하게 작동 하도록 설정하면 이제 모든 것이 완벽하게 작동합니다.

WSL을 사용하기 전에 Git Bash를 사용하고 있었는데이 문제도있었습니다.


1
자세한 내용은 여기를 참조하세요 : github.com/10up/wp-local-docker/issues/…
nbeuchat jul.

4

Windows 용 Docker ToolBox를 사용하고 있습니다. 기본적으로 C 드라이브 는 자동으로 마운트되므로 파일을 마운트하려면 파일과 폴더가 C DRIVE 안에 있는지 확인하십시오 .

예: C:\Users\%USERNAME%\Desktop


1
내 마운트 된 폴더는 C : \ x-suite \입니다. C 드라이브를 공유했지만 여전히 내 문제를 해결하지 못했습니다.
袁文涛

Docker ToolBox를 사용하고 있습니까?
Abhishek DK

minikube + virtualBox + docker ToolBox, localkube는 더 이상 사용되지 않습니다. 어떤 드라이버를 사용해야합니까?
袁文涛

당신이 Dockercompose에서 설치하는 경우, 다음 <경로> $ {PWD} / 사용
Abhishek DK

1
당신이 Dockerfile에서 일을하는 경우, 다음 VOLUME / C / X-제품군 사용
Abhishek DK

2

누군가가 유용하다고 생각할 수도 있습니다. 내 작성 파일에 다음 볼륨이 마운트되었습니다.

./file:/dir/file

./file이 존재하지 않기 때문에 ABC에 마운트되었습니다 (기본적으로 폴더).

제 경우에는 컨테이너가

docker commit ABC cool_image

나중에 ./file을 만들고 실행했을 때 docker-compose up오류가 발생했습니다.

[...] 디렉토리를 파일에 마운트하려고합니까 (또는 그 반대로)? 지정된 호스트 경로가 존재하고 예상 유형인지 확인하십시오.

cool_image기억 /dir/file된 디렉토리 에서 가져온 컨테이너는 최근 생성 및 마운트 된 것과 충돌합니다../file .

해결책은 다음과 같습니다.

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

고맙습니다. Docker 설정이 상당히 복잡하기 때문에 이것은 제 문제였습니다!
rmcsharry

1

Windows 10에서는 docker-compose.yml일반적으로 파일 또는 Docker 구성을 변경하지 않고이 오류가 발생 합니다.

제 경우에는 포트 445를 차단하는 방화벽 정책과 함께 VPN을 사용하고있었습니다.

VPN 연결을 끊으면 문제가 사라집니다.

따라서 Docker Desktop을 실행할 때 방화벽을 확인하고 프록시 또는 VPN을 사용하지 않는 것이 좋습니다.

Windows 용 Docker 확인 -공유 드라이브에 대한 방화벽 규칙자세한 내용 대한 하세요.

다른 사람에게 도움이되기를 바랍니다.


1

대신 절대 / 완전 경로를 사용해 주 $PWD/conf/nginx.conf시겠습니까? 그러면 작동합니다.

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

큰 따옴표로 이스케이프하면 : docker run -d --rm -v "$ PWD / nginx.conf : /etc/nginx/nginx.conf"nginx 쉘이 전달하기 전에 번역하므로 차이가 없습니다. 도커를 실행하고 실제로 적어도 저에게는 차이가 없습니다
Manumie

1

이 명령 줄에서 Windows 10에서 WSL1을 통해 Docker를 사용하여 동일한 문제가 발생했습니다.

echo $PWD
/mnt/d/nginx

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

호스트 시스템의 파일 경로를 UNIX 스타일 절대 경로로 변경하여 해결했습니다.

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

또는 경로 구분 기호 /대신 Windows 스타일 절대 경로 사용 \:

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

Windows 스타일 경로와 Unix 스타일 경로를 사용할 때 성능 차이를 발견 했습니까?
J. Scott Elblein

말할 수 없습니다. 테스트 / 개발을 위해 Windows 용 Docker를 사용하고 있으며 성능을 모니터링하지 않습니다.
bwibo

0

Virtual Box를 6.0.10으로 업데이트하면 Docker Toolbox에 대한이 문제가 해결되었습니다.

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

이런 종류의 오류가 발생했습니다.


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

VitualBox를 업데이트 한 후 모든 명령이 제대로 작동했습니다 🎉


0

파일이 로컬에 없어서 폴더로 생성했기 때문에 동일한 헤드 스크래치를 가졌습니다.

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

알 수 없음 : 디렉토리를 파일에 마운트하려고합니까 (또는 그 반대로)? 지정된 호스트 경로가 존재하고 예상 유형인지 확인하십시오.

Mac 환경의 niginx에서 비슷한 오류가 발생했습니다. Docker가 default.conf 파일을 올바르게 인식하지 못했습니다. 상대 경로를 절대 경로로 변경하면 오류가 수정되었습니다.

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

0

나를 위해 이것은 작동하지 않았습니다.

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

그러나 이것은 잘 작동합니다 (분명히 내 구성 파일을 새 디렉토리로 이동했습니다.

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

0

앞으로 다른 사람을 위해 많은 시간을 절약 할 수 있으므로 여기서 제 사례를 공유하겠습니다.

나는 Gitlab CI에서 docker-in-docker를 사용하기 시작할 때까지 내 macos에서 완벽하게 작동하는 docker-compose를 가졌습니다. 저장소에서 마스터로 작업 할 수있는 권한 만 부여되었으며 Gitlab CI는 자체 호스팅되고 다른 사람이 설정했으며 설정 방법 등에 대한 다른 정보는 공유되지 않았습니다.

다음으로 인해 문제가 발생했습니다.

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

이것이 창에서 실행될 수 있다는 것을 알았을 때만 (머리를 긁적 거리는 시간), wodpress.conf의 이름을 default.conf로 바꾸고 dir 경로 이름을 설정했습니다.

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

이것은 문제를 해결했습니다!


0

내 dockerfile이 다른 드라이브에 있었기 때문에 Windows 7 에서이 문제가 발생했습니다.

문제를 해결하기 위해 수행 한 작업은 다음과 같습니다.

  1. VirtualBox Manager 열기
  2. "기본"컨테이너를 선택하고 설정을 편집합니다.
  3. 공유 폴더를 선택하고 아이콘을 클릭하여 새 공유 폴더를 추가합니다.
  4. 폴더 경로 : x : \
  5. 폴더 이름 : / x
  6. 자동 마운트 확인 및 영구화
  7. 가상 머신 다시 시작

이 시점에서 docker-compose up작동합니다.


0

Docker : 2.3.0.2 (45183) 업데이트 후 Windows10에서 동일한 오류가 발생했습니다.

... \\\"not a directory\\\"\"":알 수없는 원인 : 디렉토리를 파일에 마운트하려고합니까 (또는 그 반대로)? 지정된 호스트 경로가 존재하고 예상 유형인지 확인하십시오.

나는 이와 같은 절대 경로를 사용 //C/workspace/nginx/nginx.conf하고 있었고 모든 것이 매력처럼 작동했습니다.
업데이트로 인해 내 도커 작성이 깨졌고 루트에 대한 경로를 /C/workspace/nginx/nginx.conf단일 로 변경해야했습니다 /.


0

Docker 기본 설정의 리소스> 파일 공유 섹션에 추가되지 않은 호스트에서 볼륨을 마운트하려는 경우에도이 상황이 발생합니다.

여기에 이미지 설명 입력

루트 경로를 파일 공유 리소스로 추가하면 이제 Docker가 리소스에 액세스하여 컨테이너에 마운트 할 수 있습니다. 볼륨을 다시 마운트하려면 Docker 컨테이너의 내용을 지워야 할 수 있습니다.

예를 들어 응용 프로그램이에있는 경우 파일 공유 리소스 위치 /mysites/myapp로 추가 /mysites할 수 있습니다.


0

나는 같은 문제가 있었고, docker-compose는 파일 대신 디렉토리를 만든 다음 중간에 충돌했습니다.

제가 한:

  1. 매핑없이 컨테이너를 실행합니다.

  2. .conf파일을 호스트 위치에 복사하십시오 .

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

  3. 용기 ( docker-compose down)를 제거합니다 .

  4. 다시 매핑하십시오.

  5. 컨테이너를 다시 장착하십시오.

Docker Compose는 디렉토리 생성 을 시도하는 대신 .conf파일 을 찾아 매핑 합니다 .


-2

마운트 문제를 해결했습니다. Win 7 환경을 사용하고 있는데 동일한 문제가 발생했습니다.

파일에 디렉토리를 마운트하려고합니까?

컨테이너에는에 기본 동기화 디렉터리가 C:\Users\있으므로 프로젝트를로 이동 C:\Users\한 다음 프로젝트를 다시 생성했습니다. 이제 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.