이미지에 사용자를 추가하고 컨테이너를 루트로 실행하고 엔트리 포인트를 사용하여 개발자 안의 볼륨 마운트와 일치하도록 컨테이너 내부의 uid/gid를 조정할 수 있습니다. 그런 다음 컨테이너 사용자로 전환하여 앱을 실행하십시오.
이를 구현하기 위해, 나는 다음과 같은 라인이 포함 된 엔트리 포인트 쉘 스크립트 사용했습니다 : opt_u
컨테이너 내부의 사용자 이름입니다 $1
볼륨이 마운트 경로, 즉 스크립트에서
OLD_UID=`getent passwd "${opt_u}" | cut -f3 -d:`
NEW_UID=`ls -nd "$1" | cut -f3 -d' '`
if [ "$OLD_UID" != "$NEW_UID" ]; then
usermod -u "$NEW_UID" "$opt_u"
if [ -n "$opt_r" ]; then
find/-mount -uid "$OLD_UID" -exec chown "$opt_u" {} \;
fi
fi
OLD_GID=`getent group "${opt_g}" | cut -f3 -d:`
NEW_GID=`ls -nd "$1" | cut -f4 -d' '`
if [ "$OLD_GID" != "$NEW_GID" ]; then
groupmod -g "$NEW_GID" "$opt_g"
if [ -n "$opt_r" ]; then
find/-mount -gid "$OLD_GID" -exec chgrp "$opt_g" {} \;
fi
fi
을 opt_g
입니다 그룹 이름 및 opt_r
은 컨테이너 내부의 파일 시스템을 재귀 적으로 조정하는 플래그입니다.
사용자
$RUN_AS
및 간부로 전환
exec gosu "${RUN_AS}" "[email protected]"
그 사용자로 엔트리 포인트에 전달 된 명령, 그리고 PID를 1로 고수는 데 사용됩니다 : 내 엔트리 포인트의 매우 끝에
, 나는 킥오프
su
이 pid 1로 실행되는 것을 피하십시오.
도커 소켓의 GID와 일치하도록 컨테이너 내부의 앱으로 Jenkins와 비슷한 예를 게시했습니다.다음 단계를 통해 repo를 찾을 수 있습니다. https://github.com/bmitch3020/jenkins-docker
이것은 개발자 시스템에 이미지를 이식 할 수있는 중요한 단점이 있으며, 동일한 명령으로 실행할 수 있습니다. 권한이 파일 시스템에 무엇이든 외부에서 컨테이너로 매핑되면 컨테이너 내부에서 명령을 실행하는 사용자의 uid/gid가됩니다. docker run
명령에 대한 개발자 시스템에서 로컬 uid/gid를 조회하거나 고유 한 uid/gid 항목을 사용하여 각 개발자 워크 스테이션에서 이미지를 빌드 할 필요가 없습니다. 이 구현의 유일한 단점은 사용자/그룹 및 파일 시스템 소유권을 수정하기 위해 액세스 할 때 엔트리 포인트를 루트 권한으로 실행해야하므로 docker exec
이 루트로 컨테이너에 입력한다는 것입니다.
'docker run -u username' –
@TJBiddle 'docker : 데몬의 오류 응답 : linux spec user : 사용자를 찾을 수 없습니다. PASSED_USERNAME : passwd 파일에 일치하는 항목이 없습니다.'와 같은 오류가 발생했습니다. 내 질문의 네 번째 단락에서 내가 말한 것. –