
저는 Docker를 처음 사용하며 이를 사용하여 내 코드에 대한 제어된 컴파일 환경을 확보하고 싶습니다.
필요한 모든 도구가 포함된 Docker 이미지가 이미 있습니다. 현재 내 문제는 다음과 같습니다.
- NFS 서버에서 마운트된 홈 폴더 내부의 호스트 시스템에 코드가 있습니다.
- r+w 권한을 사용하여 Docker 컨테이너 내에 이 폴더를 표시하고 싶습니다.
먼저 시도한 내용(소스 폴더를 볼륨으로 사용하여 컨테이너 실행)과 발생한 오류는 다음과 같습니다.
[mbrandalero@machine ~]$ docker run -it --cap-add sys_admin -v "/homes/mbrandalero/src:/usr/local/src/" mbrandalero/my-image bash
/usr/bin/docker-current: Error response from daemon: error while creating mount source path '/homes/mbrandalero/src': mkdir /homes/mbrandalero/src: permission denied.
(분명히 호스트 측에 디렉토리를 생성하려고 시도하고 있지만 이미 디렉토리가 있습니다)
흥미롭게도 전체 홈 폴더를 볼륨으로 사용하여 컨테이너를 실행하려고 하면 작동하지만 다른 오류가 발생합니다(폴더에 쓰기 권한이 없음).
[mbrandalero@machine ~]$ docker run -it --cap-add sys_admin -v "/homes/mbrandalero/:/usr/local/src/home" mbrandalero/my_image bash
root@46712ad936f2:/usr/local/src# cd home/
bash: cd: home/: Permission denied
root@46712ad936f2:/usr/local/src# ls -lah | grep "\(\.\|home\)"
total 4.0K
drwxr-xr-x 1 root root 18 May 20 14:50 .
drwxr-xr-x 1 root root 17 May 15 14:06 ..
drwxr-x--- 30 10031 10031 4.0K May 20 15:03 home
내가 제대로 하고 있는 걸까? 내가 무엇을 놓치고 있나요?
추가 정보:
- 운영체제: CentOS 리눅스 7.6
- 도커 버전: 1.13.1
업데이트 (1):
분명히 실행할 때 사용자 ID를 설정하면 docker run
문제가 해결되지만 이것이 올바른 방법입니까? 이런 방식으로 실행하면 고정된 문제가 발생하지만 이상해 보입니다(사용자 이름으로 "이름이 없습니다!"가 표시됩니다).
[mbrandalero@machine ~]$ docker run -it --cap-add sys_admin -v "/homes/mbrandalero/:/usr/local/src/home" --user $(id -u) mbrandalero/my_image bash
I have no name!@2efec822e572:/usr/local/src$ cd home/
I have no name!@2efec822e572:/usr/local/src/home$
답변1
업데이트에서 언급한 것처럼 파일의 UID는 바인드 마운트에 매핑되지 않습니다. 이것이 Linux가 바인드 마운트를 수행하는 방식입니다. 다른 UID로 컨테이너를 시작할 수 있지만 이로 인해 컨테이너 내부의 /etc/passwd가 다른 사용자 또는 사용자가 없는 사용자(귀하의 경우)에 매핑됩니다. 다양한 옵션이 있지만 제가 선호하는 것은 my수정 권한 스크립트. 이 작업은 루트로 실행해야 하지만 gosu
명령을 실행할 때 사용자에게 다시 드롭다운하는 데 사용할 수 있습니다 . 나는 이것에 대해 내 시간에 이야기했습니다.dockercon 프레젠테이션.
호스트 NFS 디렉터리에 대한 바인드 마운트 대신 NFS 서버에서 직접 볼륨 마운트를 수행할 수도 있습니다. 이를 수행하는 방법에 대한 몇 가지 예는 다음과 같습니다.
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=4,addr=nfs.example.com,rw \
--opt device=:/path/to/dir \
foo
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example.com\",volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example.com\",volume-opt=device=:/host/path \
foo
# inside a docker-compose file
...
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=nfs.example.com,rw
device: ":/path/to/dir"
...
답변2
컨테이너를 로 실행하는 경우 NFS 호스트가 모든 원격 루트 UID(즉, 루트 스쿼시)를 다시 매핑하기 때문에 메시지가 root
나타날 수 있습니다 .error while creating mount source path ... permission denied
https://en.wikipedia.org/wiki/Unix_security#Root_squash
root
이는 악의적인 행위자가 귀하의 공유를 자신의 사용자로 마운트한 다음 데이터로 나쁜 작업을 수행하는 것을 방지하는 보안 지향 기능입니다 . 따라서 NFS 마운트에는 일반적으로 root_squash
이러한 유형의 문제를 방지하기 위해 옵션이 기본적으로 설정되어 있습니다. 컨테이너를 로 실행해야 하는 경우 NFS 호스트 파일의 옵션을 root
사용하여 이를 재정의할 수 있습니다 .no_root_squash
/etc/exports
/srv/nfs/shared_folder <hostname>(rw,sync,no_subtree_check,no_root_squash)
http://nfs.sourceforge.net/nfs-howto/ar01s03.html
https://www.thegeekdiary.com/understanding-the-etc-exports-file/
답변3
이것은 나에게 효과적이었습니다. 호스트 nfs 경로를 컨테이너에 대한 볼륨으로 선언했습니다. 그리고 호스트 nfs 경로는 홈 디렉터리가 아닌 비홈 디렉터리 경로입니다.
내 호스트 nfs 마운트 지점:/mnt/abc
내 docker-compose.yml 파일 조각.
...
volumes:
- /mnt/abc/:/abc
...