2017-12-05 6 views
0

git 저장소에서 일부 개발 작업을 수행하기 위해 도커 컨테이너를 사용합니다.호스트 사용자와 동일한 소유자를 갖는 도커 컨테이너에서 파일을 생성하는 방법

내가 사용하는 컨테이너는 각 프로젝트별로 만들어 졌으므로 각 참여자는 작업을 완료하기 위해 docker CLI 만 필요합니다.

가 나쁜 쪽 루트로 실행 컨테이너, 이렇게 생성 된 파일은

는 내가 거기 외설 때문에 종료하기 전에 용기의 소유자를 변경할 수 없습니다 .. 루트 한 번 용기 중지를 소유, 그것은 나쁜된다/etc/passwd 파일에서 필수 사용자를 지정하십시오.

도커 이미지를 컴파일하기 전에 컨테이너에 사용자를 생성 하겠지만 컨테이너는 보편적이지 않을 것입니다 (모든 내 개발자 팀).

그 가장 좋은 방법은 무엇입니까?

+0

'docker run -u username' –

+0

@TJBiddle 'docker : 데몬의 오류 응답 : linux spec user : 사용자를 찾을 수 없습니다. PASSED_USERNAME : passwd 파일에 일치하는 항목이 없습니다.'와 같은 오류가 발생했습니다. 내 질문의 네 번째 단락에서 내가 말한 것. –

답변

0

해결 방법은 이전 이미지 (devtools에 미리 설치되어 있지만 사용자는 만들지 않았지만 루트를 기반으로 함)를 기반으로 저장소에 새로운 dockerfile을 만드는 것입니다. 그런 다음

FROM <ABSTRACT_FORMER_IMAGE> 
ARG username=developer 
RUN useradd -r -u 1001 -g $username $username 
USER $username 

작업을 시작하기 전에, 팀의 각 개발자는 새로운 프로젝트 + 특정 개발자가 자신의 기본 이미지를 구축하기 위해 dockerfile를 사용해야하십시오 같은 dockerfile에서

다음과 같이 쓰기 컨테이너에 사용자 이름을 전달합니다.

$ docker build --build-arg username=$USER Dockerfile 

더 나은 사례가 있습니까?

0

docker privileges을 완전히 이해하려면이 링크를 읽고, 사용자를 위해 --user 명령을 사용하여 도커를 실행하는 것이 좋습니다.

+0

깊이 읽어 줄 링크에 감사드립니다. 하지만'--user' CLI 인수를 사용하면'docker : 데몬의 오류 응답 : 리눅스 스펙 사용자 : PASSED_USERNAME 사용자를 찾을 수 없습니다 : passwd 파일에 일치하는 항목이 없습니다. '와 같은 오류를 반환합니다. 내 질문의 네 번째 단락. –

+0

이전에 사용했던 명령을 나에게 알려주실 수 있습니까? – Viswesn

0

이미지에 사용자를 추가하고 컨테이너를 루트로 실행하고 엔트리 포인트를 사용하여 개발자 안의 볼륨 마운트와 일치하도록 컨테이너 내부의 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이 루트로 컨테이너에 입력한다는 것입니다.

관련 문제