2016-09-08 5 views
1

나는 docker-compose newbie 질문을 가지고 있습니다. Docker 이미지를 생성하고 내부 Artifactory 저장소로 푸는 기존 Jenkins 빌드가 있습니다. Maven/Docker와 두 개의 Docker 파일을 사용하여 구동됩니다. 하나는 응용 프로그램 용이고 다른 하나는 볼륨/데이터 컨테이너 용입니다.Dockerfiles와 docker-compose.yml 사이의 숫자 사용자 아이디 동기화 중입니까?

앱 :

FROM centos 
RUN useradd -u 6666 -ms /bin/bash foouser 
COPY src/main/resources/home/foouser/.bashrc /home/foouser/ 
RUN chown -R foouser:foouser /home/foouser 
USER foouser 
COPY src/main/resources/opt/myapp/bin/startup.sh /opt/myapp/bin/ 
WORKDIR /home/foouser 
ENTRYPOINT /opt/myapp/bin/startup.sh && /bin/bash 

데이터 컨테이너 :

FROM centos 
# Environment variable for the path to mount/create. Defaults to /opt/data 
ENV DATA_VOL_PATH="/opt/data" 

# Make sure the user id is the same as the container using the volume, otherwise we may run into permission issues on 
# the container mounting the volume. 
RUN useradd -u 6666 -ms /bin/bash foouser && \ 
    mkdir -p "$DATA_VOL_PATH" && \ 
    chown -R foouser:foouser "$DATA_VOL_PATH" 
VOLUME [ "$DATA_VOL_PATH" ] 

내가 레이블처럼 물건을 생략 등 간결에 대한 Dockerfiles이 같은 모양. 따라서이 Dockerfiles에서 빌드 한 이미지는 로컬 Artifactory 저장소에 저장됩니다. 우리는 이러한 이미지를 인스턴스화하기 위해 Rancher/Cattle을 사용하고 있습니다. Rancher에 Artifactory Repo를 추가하여 거기에서 끌어낼 수 있습니다. 목장의 고정 표시기-compose.yml 파일은 다음과 같은 :

# The data/volumes container for the data. 
data: 
    image: data-image 

# App 
myapp: 
    image: app-image 
environment: 
    DATA_VOL_PATH: 
volumes_from: 
    - data 

내가 (위의 DATA_VOL_PATH 같이) 고정 표시기-작성에서 환경 변수를 전달할 수 있다는 것을 알고,하지만 난 가지 방법으로 혼란 스러워요 작업. Docker 빌드를 실행하면 Dockerfile의 명령이 실행되고 그 이후에는 이미지가 변경되지 않습니다. 이미지를 기반으로 컨테이너를 인스턴스화하면 올바르게 이해 한 경우 새로운 쓰기 가능한 UFS 레이어가 만들어집니다. 그래서 데이터 컨테이너의 경우 볼륨이 실제로 생성되면 변경할 수 없습니다. 맞습니까? 이 가정이 맞다면 1) 두 개의 서로 다른 시스템 (Docker 이미지 생성을위한 Maven과 컨테이너 클러스터 인스턴스 생성을위한 Rancher)에서 사용자 ID를 가장 효과적으로 동기화하는 방법과 2) 생성을 유도하는 것이 더 낫습니다. docker-compose.yml의 데이터 볼륨 컨테이너 전체? 그러면 Docker-compose.yml에서 데이터 컨테이너의 Dockerfile 내용을 어떻게 복제 할 수 있습니까?

나는 이것이 매우 일반적인 시나리오라고 가정하므로 거기에 몇 가지 "모범 사례"솔루션이 있어야합니다. 감사.

+1

귀하의 질문에 혼란이 있습니다. 볼륨은 작성자가 아닌 컨테이너에 의해 작성되며, 원하는 사용자에게 볼륨을''채울 수 있습니다. 두 컨테이너에서 동일한 사용자가 있으므로 IO 사이에 아무런 문제가 없어야합니다. 호스트 시스템의 모든 것에 대해 질문은 왜 호스트 시스템에서 필요한 것이 있습니까? 동일한 UID로 실행되는 컨테이너를 사용하여 도커 이미지를 만들 수 있습니다. 그러나 어쨌든 호스트 시스템에 생성 된 동일한 UID를 가질 수 있습니다. UID를 제어하지 않는 다른 컨테이너를 사용하는 경우에만 문제가 발생합니다. –

+0

올레그, 나는 Dockerfile과 docker-compose.yml의 사용 사이의 상관 관계에 대해 약간 혼란 스럽다. 그래서 질문 자체가 혼란 스러울 수있다. 어쩌면 나는 질문을 다시하고 다른 끝에서 시작해야 할 것입니다. 명명 된 볼륨이이를 수행하는 데 선호되는 방법 인 것 같습니다. 나는 아직도 혼란 스럽지만 약간 계몽 된 방식으로 대답합니다 :-) – user2337270

+0

당신은 답을 얻지 못하고 있습니다. 사람들이 당신이 묻는 것을 이해하지 못한다는 것을 의미합니다.나는 당신이 반복적으로 배울 것을 제안 할 것입니다 : 당신의 젠킨스 (Jenkins) 빌드를 떠나서 docker.com에 대한 튜토리얼 몇 개를 먼저 읽은 다음, 자신의 컨테이너 몇 개를 만들고 함께 작성하십시오. 그 순간 당신은 기본을 이해하게 될 것이고 당신은 젠킨스 (Jenkins)의 셋업을 이해할 수있을 것입니다. 그 순간에도 여전히 열려있는 문제가있는 경우 사용자 정의 Jenkins/maven/설정에 대한 세부 정보가 없으면 한 번에 가장 중요한 질문을 하나 물어보십시오. –

답변

0

필자도이 경우에도 Docker 컨테이너에 루트가 아닌 프로세스가 있었으며이 프로세스는 호스트에서 마운트 된 파일에 액세스해야하므로 UID/GID 값에주의해야했습니다. Docker 이미지와 호스트 모두에 있습니다.

나는 그것에 대해 좋은 결정이 없다는 사실에 두려워합니다. 고정 표시기 이미지는 실제로 변경할 수 없으므로 일부 계약을 체결하거나 타사 소프트웨어를 사용하여 빌드 및 배포 프로세스를 제어해야합니다.

docker-compose의 사용을 중단하고 SaltStack을 시도하는 것이 좋습니다.

+0

SaltStack으로 전환하는 것이 간단한 구성 파일로 제어되는 상당히 간단한 운동에 얼마나 유익합니까? 배우고 설치하는 데 드는 시간과 생산성, 명료성 또는 단순성을 얻으십시오. –

+0

직장에서 누군가가 저에게이 대화를 가르쳐주었습니다. 본질적으로 이름이 지정된 볼륨이 갈 길이라고 생각합니다. https://github.com/docker/docker/issues/17798 – user2337270