ADD를 사용하여 압축 파일을 컨테이너에 로컬로 복사하려고 합니다.
RUN mkdir /root/foo
ADD foo.zip /root/foo/
UNZIP -o /root/foo/foo.zip
그런 다음 컨테이너를 빌드 및 실행하고 bash를 입력합니다.
sudo docker run -it -p 8080:8080 tomcat bash
/root/foo/ 디렉터리로 이동하면 찾을 수 없습니다. 컨테이너에 디렉터리를 만들고 foo.zip의 내용을 보려면 어떻게 해야 합니까?
답변1
호스트 디렉터리를 데이터 볼륨으로 마운트
-v 플래그를 사용하여 볼륨을 생성하는 것 외에도 Docker 데몬 호스트의 디렉터리를 컨테이너에 탑재할 수도 있습니다.
$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
이 명령은 호스트 디렉터리 /src/webapp를 /opt/webapp에 있는 컨테이너에 설치합니다. /opt/webapp 경로가 컨테이너 이미지 내에 이미 존재하는 경우 /src/webapp을 마운트하면 기존 콘텐츠를 덮어쓰지만 삭제하지는 않습니다. 설치가 제거되면 콘텐츠에 다시 액세스할 수 있습니다. 이는 mount 명령의 예상 동작과 일치합니다.
컨테이너 디렉터리는 항상 /src/docs와 같은 절대 경로여야 합니다. 호스트 디렉터리는 절대 경로 또는 이름 값일 수 있습니다. 호스트 디렉터리의 절대 경로를 제공하면 Docker는 사용자가 지정한 경로에 바인드 설치합니다. 이름을 제공하면 Docker는 해당 이름을 사용하여 명명된 볼륨을 생성합니다.
이름 값은 영숫자로 시작해야 하며 그 뒤에 a-z0-9, _(밑줄), . (마침표) 또는 -(하이픈)입니다. 절대 경로는 /(슬래시)로 시작합니다.
예를 들어 /foo 또는 foo를 호스트 디렉터리 값으로 지정할 수 있습니다. /foo 값을 제공하면 Docker는 바인드 마운트를 생성합니다. foo 사양을 제공하면 Docker는 명명된 볼륨을 생성합니다.
Mac 또는 Windows에서 Docker Machine을 사용하는 경우 Docker 데몬은 OS X 또는 Windows 파일 시스템에 대한 액세스가 제한됩니다. Docker Machine은 /Users(OS X) 또는 C:\Users(Windows) 디렉터리를 자동으로 공유하려고 시도합니다. 따라서 다음 명령을 사용하여 OS X에 파일이나 디렉터리를 마운트할 수 있습니다.
docker run -v /Users/<path>:/<container path> ...
Windows에서는 다음 명령을 사용하여 디렉터리를 마운트합니다.
docker run -v /c/Users/<path>:/<container path> ...`
다른 모든 경로는 가상 머신의 파일 시스템에서 나옵니다. 예를 들어 VirtualBox를 사용하여 다른 폴더를 공유하는 경우 추가 작업을 수행해야 합니다. VirtualBox의 경우 호스트 폴더를 VirtualBox의 공유 폴더로 사용해야 합니다. 그런 다음 Docker -v 플래그를 사용하여 설치할 수 있습니다.
호스트 디렉터리를 마운트하는 것은 테스트에 유용합니다. 예를 들어 컨테이너 내부에 소스 코드를 설치할 수 있습니다. 그런 다음 소스 코드를 변경하고 실시간으로 애플리케이션에 미치는 영향을 확인하세요. 호스트의 디렉터리는 절대 경로로 지정되어야 하며, 디렉터리가 없으면 Docker가 자동으로 해당 디렉터리를 생성합니다. 호스트 경로 자동 생성은 더 이상 사용되지 않습니다.
Docker 볼륨은 기본적으로 읽기-쓰기 모드로 마운트되지만 읽기 전용으로 마운트되도록 설정할 수도 있습니다.
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
여기서는 동일한 /src/webapp 디렉토리를 마운트했지만 마운트가 읽기 전용이어야 함을 지정하기 위해 ro 옵션을 추가했습니다.
마운트 기능의 제한으로 인해 호스트 소스 디렉터리 내의 하위 디렉터리를 이동하면 컨테이너에서 호스트 파일 시스템으로의 액세스가 제공될 수 있습니다. 이를 위해서는 악의적인 사용자가 호스트와 해당 설치 디렉터리에 액세스할 수 있어야 합니다.
Note: The host directory is, by its nature, host-dependent. For this reason, you can’t mount a host directory from Dockerfile because built images should be portable. A host directory wouldn’t be available on all potential hosts.