Docker에 볼륨을 추가하지만 하위 폴더는 제외


210

내 호스트에 Docker 컨테이너와 폴더가 있다고 가정합니다 /hostFolder. 나는 볼륨으로 도커 컨테이너에이 폴더를 추가 할 경우 지금, 그때 사용하여이 작업을 수행 할 수 있습니다 ADDDockerfile또는 볼륨으로 장착.

여태까지는 그런대로 잘됐다.

이제 /hostFolder하위 폴더가 포함되어 있습니다 /hostFolder/subFolder.

/hostFolderDocker 컨테이너 에 마운트하고 싶습니다 (읽기 쓰기 또는 읽기 전용이 중요하지 않은지, 둘 다 작동하는지 여부).하지만 포함 시키지 않으려 고합니다 /hostFolder/subFolder. 이것을 제외하고 Docker 컨테이너가 호스트에서 변경하지 않아도이 하위 폴더를 변경할 수 있기를 원합니다.

이게 가능해? 그렇다면 어떻게?


2
@AbhijitSarkar는 매우 건설적인 (어쨌든 도움이되지 않는) 의견이 아닙니다.
kano

1
@Kano 답변이 아니라 의견입니다.
Abhijit Sarkar

답변:


397

docker-compose 사용 node_modules를 로컬로 사용할 수 있지만 다음 구문의 다음 구문을 사용하여 docker 컨테이너에서 무시하십시오. docker-compose.yml

volumes:
   - './angularApp:/opt/app'
   - /opt/app/node_modules/

따라서 로컬 시스템 이 비어 있지 않더라도 모든 항목 ./angularApp이 매핑 된 /opt/app다음 /opt/app/node_modules/빈 디렉토리 인 다른 마운트 볼륨 을 만듭니다 ./angularApp/node_modules.


3
그것은 작동하지만 컨테이너 내에서 이러한 dirs를 제거 할 수 없습니다 예를 들어 : /opt/app/node_modules/같은 이름의 다른 디렉토리 로 바꿔야 합니다. 오류 발생 : '볼륨 바쁜'
스테판 Yudin

32
후행 슬래시를 잊지 마십시오! 예. / opt / app / node_modules가 작동하지 않습니다. ./angularApp/node_modules
Stingus

3
이 트릭은 저에게 효과적이지만 더 이상은 같지 않으며 자체 동일한 Compose 파일에도 적용되지 않습니다. 그것이 다른 사람들을 위해 일을 중단했는지 궁금합니다.
plinehan

8
감사! 당신은 내 하루를 구했다! 간단한 도커를 사용하는 경우 작곡가가 아닌 모양은 다음과 같습니다. -v $(pwd):/build/ -v /build/node_modules
Bogdan Mart

3
docs.docker.com/storage/volumes/… 문서를 찾았습니다 . If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
히로시

118

docker-compose이지만 영구적으로 하위 디렉토리를 무시하려면 다음을 수행하십시오 docker-compose.yml.

volumes:
  node_modules:
services:
  server:
    volumes:
      - .:/app
      - node_modules:/app/node_modules

현재 디렉토리를 공유 볼륨으로 마운트하지만 로컬 node_modules디렉토리 대신 영구 도커 볼륨을 마운트합니다 . 이것은 @kernix의 답변과 비슷하지만 실행 node_modules사이에 지속될 수 docker-compose up있으며 이는 바람직한 동작 일 것입니다.


20
명명 된 볼륨은 탁월한 접근 방식입니다. 팁 : 하이픈 볼륨 이름을 사용하지 않아야합니다. 당신은 인생의 작은 부분을 디버그 악몽 속에서 보내고, 당신이 다시 한 번 우스운 뉘앙스에 속았다는 것을 알게 될 것입니다.
dustintheweb

3
"Docker-compose down은 이러한 영구 볼륨을 종료시킵니다." Docker for Mac v 17.0.5 이상 (및 이전 버전)에서는 해당되지 않습니다. docker-compose down컨테이너를 제거하지만 볼륨은 다음과 같이 실행될 때까지 지속됩니다.docker system prune
BrDaHa

3
도커 컨테이너에서 이름 이 지정된 볼륨을 "무시"하는 이유 를 이해하려는 사람이 있다면 이 게시물이 유용 할 수 있습니다. node_modules:/app/node_modules
ira

3
내가 잘못하고 있는지 모르겠지만 컨테이너를 시작한 다음 HOST 컴퓨터에서 npm install을 실행하면 컨테이너 내부의 node_modules도 변경됩니다. 나는 왜 누군가가 그렇게하고 싶어하는지 상상할 수 없지만 여전히 깨끗한 분리를 찾고 있습니다.
Renra

3
@Renra는 똑같은 문제가 있었는데, 호스트 시스템은 이름이 지정된 볼륨을 가지고 있더라도 node_modules를 지속적으로 쓸 것입니다 ... 모든 종류의 비 호환성 문제가 발생했습니다. 그것을 해결에 포기하고 단지 전체의 repo 대신 내 src 폴더를 복사하여 주위 일
dancypants

19

파일을 제외하려면 다음을 사용하십시오.

volumes:
   - /hostFolder:/folder
   - /dev/null:/folder/fileToBeExcluded

6
내가 필요한 것에 대한 완벽한 솔루션 (symlink가 Windows 호스트에서 끊어지기 때문에 node_modules를 호스트에 매핑하지 않기 위해). / dev / null을 가리키는 것은 효과가 없었지만 빈 디렉토리를 만들어 그 디렉토리에 매핑하면 완벽하게 작동하고 내가 가진 문제를 해결했습니다.이 아이디어에 감사드립니다.
Liam Hammett

1
Docker for Mac 18.09.0 :에서는 작동하지 않습니다 Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] 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. 후행 슬래시를 추가해도 도움이되지 않았습니다.
Blaise

Docker 18.09.3의 Ubuntu 16.04에서 작동하지 않는다는 것을 확인할 수 있습니다.
Dirk

그것은 나를 위해 작동하지 않습니다. /dev/null컨테이너 파일을 장치 파일로 복사 하기 만하면됩니다.
Radon Rosborough

1
이것은 파일을 제외하는 경우에만 작동합니다! / dev / null은 파일이므로 대상이되어야합니다. 오류 메시지는 다음과 같이 명확합니다 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. 이것은 OP가 찾고있는 것이 아니지만 단일 파일을 제외해야했기 때문에 매우 유용했습니다.
Avius

13

우선, 사용 ADDDockerfile에 지시 것은 매우 (비아 중 볼륨을 사용하여 다른 -v행 인자 docker run또는 VOLUMEDockerfile의 명령). ADDCOPY명령은 단지 시간에 파일의 복사본을 docker build실행됩니다. 이 파일은 docker build명령 으로 새로운 이미지를 만들 때까지 업데이트되지 않습니다 . 반대로, 볼륨을 사용한다는 것은 본질적으로 "이 디렉토리는 컨테이너 이미지에 저장해서는 안되며 대신 호스트의 디렉토리를 사용하십시오"라는 의미입니다. 볼륨 내부의 파일이 변경 될 때마다 호스트와 컨테이너 모두 즉시 볼 수 있습니다.

볼륨을 사용하여 원하는 것을 얻을 수 있다고 생각하지 않습니다.이를 수행하려면 디렉토리 구조를 다시 생각해야합니다.

그러나 COPY(을 선호해야 함)을 사용하는 것은 매우 간단합니다 ADD. .dockerignore파일을 사용 하여 서브 디렉토리를 제외하거나 COPY모든 파일을 수행 RUN rm bla하여 서브 디렉토리를 제거 할 수 있습니다.

이미지에 추가 COPY하거나 ADD빌드 컨텍스트 내에 있어야합니다 (즉, 실행하는 디렉토리 내부 또는 아래) docker build.


1
매일 새로운 것을 배우십시오 :-) COPY와 ADD는 빌드 컨텍스트 (호스트 아님)에서 작동합니다. 하위 폴더를 마스킹하기 위해 볼륨을 사용할 수 있습니까? OP는 / hostFolder를 마운트하고 / hostFolder / subFolder를 연결 해제하려고합니다. 각각에 볼륨이 있지만 hostFolder 만 '마운트 된'(-v) 경우 하위 폴더 변경 사항을 컨테이너로 분리합니까?
Greg

확실하지 않습니다. 중첩 볼륨을 시도한 적이 없습니다. 나는 그것이 좋은 생각이라고 확신하지는 않지만 그것을 조사해야 할 것입니다.
Adrian Mouat

1
.dockerignore하위 디렉토리 (또는 디렉토리)를 제외하기 위해 파일에 넣을 내용의 어디에서나 예제를 찾을 수없는 것 같습니다 . 그것이 파일의 명시된 목적이라면, 그것은 매우 이상합니다.
Lukas Oberhuber

1
파일을 추가 한 후에도 여전히 일부 레이어에있게됩니다. 따라서 보안에 민감하거나 이미지 크기를 줄이면 (기본 레이어에 있기 때문에) 제거해도 도움이되지 않습니다. squash레이어 에는 옵션이 있습니다 . 하나는 github.com/goldmann/docker-squash 이고 다른 하나는 openshiftoc ex dockerbuild 프로젝트에서 사용 하고 있습니다.
akostadinov

6

이전 솔루션이 더 이상 작동하지 않는 것 같습니다 (적어도 나를 위해). 빈 폴더를 만들고 대상 폴더를 매핑하는 것이 도움이되었습니다.

volumes:
   - ./angularApp:/opt/app
   - .empty:/opt/app/node_modules/

docker-compose 1.25.0-rc3파일 구문 v3 과 함께 작동하지 않습니다 .
thisismydesign

6

docker 명령 줄을 사용하여 :

docker run \
    --mount type=bind,src=/hostFolder,dst=/containerFolder \
    --mount type=volume,dst=/containerFolder/subFolder \
    ...other-args...

-v옵션을 사용할 수도 있지만 ( Bogdan Mart의 신용 ), --mount더 명확하고 권장 됩니다.


6

node_modules 폴더가 여전히 로컬 시스템 및 다른 방법으로 덮어 쓸 수있는 문제가있는 사람들을 위해

volumes:
  node_modules:
services:
  server:
    volumes:
      - .:/app
      - node_modules:/app/node_modules/

이것은 /node_modules 뒤에 후행 이있는 해결책입니다.


0

머신의 볼륨에 포함 된 마운트 된 파일을 제외하려면 볼륨을 동일한 파일에 할당하여 파일을 덮어 써야합니다. 설정 파일에서 :

services:
  server:
    build : ./Dockerfile
    volumes:
      - .:/app

dockerfile의 예 :

# Image Location
FROM node:13.12.0-buster
VOLUME /app/you_overwrite_file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.