업데이트 2016-03-02 : Docker 1.9.0부터 Docker는 데이터 전용 컨테이너 를 대체하는 볼륨의 이름을 지정했습니다 . 아래의 답변과 링크 된 블로그 게시물은 여전히 docker 내부의 데이터에 대해 생각하는 방법 에서 가치가 있지만 명명 된 볼륨을 사용하여 데이터 컨테이너가 아닌 아래에 설명 된 패턴을 구현하는 것을 고려하십시오.
이 문제를 해결하는 정식 방법은 데이터 전용 컨테이너를 사용하는 것 입니다. 이 방법을 사용하면 볼륨 데이터에 대한 모든 액세스는 데이터 컨테이너를 사용 -volumes-from
하는 컨테이너를 통해 이루어 지므로 호스트 uid / gid는 중요하지 않습니다.
예를 들어, 설명서에 제공된 사용 사례 중 하나는 데이터 볼륨을 백업하는 것입니다. 이를 위해 다른 컨테이너가를 통해 백업을 수행하는 데 사용되고 볼륨을 마운트하기 위해 tar
사용 -volumes-from
됩니다. 따라서 grok의 핵심 포인트는 적절한 권한으로 호스트의 데이터에 액세스하는 방법을 생각하는 대신 다른 컨테이너를 통해 필요한 모든 것을 수행하는 방법 (백업, 탐색 등)에 대해 생각하는 것입니다. . 컨테이너 자체는 일관된 uid / gid를 사용해야하지만 호스트의 어떤 것에도 매핑 할 필요가 없으므로 이식성이 유지됩니다.
이것은 나에게도 비교적 새로운 것이지만 특정 유스 케이스가 있으면 자유롭게 의견을 말하고 답변을 확장하려고 노력할 것입니다.
업데이트 : 주석에서 주어진 유스 케이스에 대해 some/graphite
흑연을 실행하기위한 이미지 some/graphitedata
와 데이터 컨테이너로 이미지 가있을 수 있습니다. 따라서 포트 등을 무시하면 Dockerfile
이미지 some/graphitedata
는 다음과 같습니다.
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
데이터 컨테이너를 빌드하고 작성하십시오.
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
some/graphite
Dockerfile도 같은 UID / GID를 얻을한다, 따라서는 다음과 같이 보일 수 있습니다 :
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
그리고 그것은 다음과 같이 실행될 것입니다 :
docker run --volumes-from=graphitedata some/graphite
이제 흑연 컨테이너 및 관련 데이터 전용 컨테이너에 올바른 사용자 / 그룹이 제공됩니다 ( some/graphite
데이터 컨테이너 의 컨테이너를 재사용 하여 엔트리 포지션 / cmd를 실행할 때 재정의하지만 별도의 이미지 IMO가 더 선명합니다).
이제 데이터 폴더에서 무언가를 편집하고 싶다고합시다. 따라서 볼륨을 호스트에 마운트하여 호스트에서 편집하는 대신 해당 작업을 수행 할 새 컨테이너를 만듭니다. 그것을 호출 할 수 some/graphitetools
있습니다. some/graphite
이미지 와 같이 적절한 사용자 / 그룹을 만들 수도 있습니다 .
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
당신은 상속하여 DRY를 만들 수 some/graphite
또는 some/graphitedata
Dockerfile에, 또는 대신에 새로운 이미지를 만들어 단지 기존의 하나를 사용 재 (엔트리 포인트 / cmd를 필요에 따라 무시).
이제 다음을 실행하면됩니다.
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
다음 vi /data/graphite/whatever.txt
. 이는 모든 컨테이너에 uid / gid가 일치하는 동일한 흑연 사용자가 있으므로 완벽하게 작동합니다.
/data/graphite
호스트에서 마운트 하지 않으므로 호스트 uid / gid가 graphite
and graphitetools
컨테이너 내부에 정의 된 uid / gid에 어떻게 매핑되는지는 신경 쓰지 않습니다 . 이러한 컨테이너는 이제 모든 호스트에 배포 할 수 있으며 계속 완벽하게 작동합니다.
이것에 대한 좋은 점 graphitetools
은 모든 종류의 유용한 유틸리티와 스크립트를 가질 수 있다는 것입니다. 이제 이식 가능한 방식으로 배포 할 수 있습니다.
업데이트 2 :이 답변을 작성한 후이 접근법에 대한 보다 완벽한 블로그 게시물 을 작성하기로 결정했습니다 . 도움이 되길 바랍니다.
업데이트 3 :이 답변을 수정하고 더 구체적인 내용을 추가했습니다. 이전에는 소유권과 파마에 대한 잘못된 가정이 일부있었습니다. 소유권은 일반적으로 볼륨이 생성 될 때이므로 볼륨이 생성 될 때 즉 데이터 컨테이너에 할당됩니다. 이 블로그를 참조하십시오 . 이것은 필수 사항은 아닙니다. 데이터 컨테이너를 "참조 / 핸들"로 사용하고 진입 점에서 chown을 통해 다른 컨테이너의 소유권 / 펌을 설정하면 gosu로 끝나고 올바른 사용자로 명령을 실행할 수 있습니다. 이 방법에 관심이있는 사람은 의견을 말하고이 방법을 사용하여 샘플에 대한 링크를 제공 할 수 있습니다.