2016-08-16 2 views
1

docker-compose 사용 두 개의 서비스에서 둘 다 사용할 수있는 공유 볼륨을 만들려고합니다. 난에 다음과 같은 한 내 docker-compose.yml서비스 X는 서비스 또는 컨테이너의 이름이 아닌 Y의 볼륨을 마운트합니다.

version: '2' 
volumes: 
    bundler: 
    driver: local 
sidekiq: 
    build: . 
    volumes_from: 
    - bundler:/.bundle 
web: 
    build: . 
    volumes_from: 
    - bundler:/.bundle 

이 그러나 일을하고 나에게 제공하지 않습니다

ERROR: Service "sidekiq" mounts volumes from "bundler", which is not the name of a service or container.

고정 표시기가-구성하여이 일을 올바른 방법은 무엇입니까?

답변

2

나는 두 가지 개념을 여기에 섞어서 생각합니다.

  • volumes_from은 하나의 컨테이너에 저장 용으로 사용해야하는 볼륨 (마운트 됨 또는 마운트되지 않은 볼륨)이있을 때 사용됩니다. 그런 다음 이라는 volumes_from을 참조하여이 컨테이너의 볼륨을 사용할 수 있습니다. 컨테이너 또는 (작성) 서비스 이름을 가리켜 야합니다. 한편, 로컬 폴더 또는 명명 된 볼륨을 참조하는 데는

  • volumes이 사용됩니다. 이름 붙여진 볼륨은 이미 작성한 것처럼 작성 파일의 최상위 레벨 항목 volumes에 선언되어야합니다.

그래서 귀하의 경우, volumes- volumes_from에서 스위치는 트릭을해야한다. 자세한 내용은 참조 문서를 참조하십시오. https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

+0

을 해결할 수있는 경우 이것은 완벽하고 자세한 설명과 위의 대답에 대한 나의 제안 뒤에있는 이론입니다. 우리는 좋은 대답을 위해 둘 다 결합해야합니다 :) –

0

"volumes_from"은 컨테이너를 참조합니다. 이름이 지정된 볼륨을 사용하고 있기 때문에, 당신은 "볼륨을"필요

version: '2' 
volumes: 
    bundler: 
    driver: local 
services: 
    sidekiq: 
    build: . 
    volumes: 
     - bundler:/.bundle 
    web: 
    build: . 
    volumes: 
     - bundler:/.bundle 

을 또한, 버전 2를 사용하고 있기 때문에, 당신은 YML의 최상위 레벨 대신 자신의 services: 섹션에서 서비스를 지정해야 .

1

대답은

version: '2' 
volumes: 
    bundler: 
    driver: local 
sidekiq: 
    build: . 
    volumes: 
    - bundler:/.bundle 
web: 
    build: . 
    volumes_from: 
    - sidekiq:rw 

그래서 sidekiq가 그렇게 노출하고 bundler 볼륨을 생성, data-container라고해야합니다. 그런 다음이 볼륨을 필요한 다른 모든 컨테이너에 마운트합니다. 희망이 도움이

+1

sidekiq은 실제로 이름이 지정된 볼륨에서 데이터를 마운트하기 때문에 데이터 컨테이너의 전통적인 정의가 아닙니다. 데이터가 명명 된 볼륨에 있으므로 sidekiq에 추가 종속성을 추가하면 두 서비스간에 불필요한 종속성이 추가됩니다. 즉,이 디자인을 사용하면 웹 컨테이너를 파괴하고 나중에 다시 만들지 않고도 sidekiq를 업그레이드 할 수 있습니다. – BMitch

+0

중간 지점. 웹은 볼륨 구문이 아닌 컨테이너 구문을 사용하여 탑재되므로 종속성은 컨테이너로 이동합니다. 만약 내가 모든 컨테이너를 멈추게한다면, sidekiq/upgrade sidekiq를 제거 할 수 있어야한다. (?) 옆에있는 'cogniteev/echo'이후에 sidekiq를 업그레이드하는 것이 실용적인 righti에서는 의미가 없을 것이다. 당신의 생각을 더 자세히 설명해 주시겠습니까? –

+0

모든 컨테이너를 중지하면 sidekiq를 업그레이드 할 수 있습니다. 그러나 컨테이너 볼륨 대신 명명 된 볼륨을 사용하는 경우 웹을 중지하지 않고도 sidekiq를 업그레이드 할 수 있습니다 (수행 방법은 게시 한 대답 참조). 이는 각 컨테이너 간의 종속성을 분리하고 독립적으로 업그레이드 할 수있게합니다. 이들 각각은 여전히 ​​데이터에 대해 동일한 액세스 권한을 가지고 있습니다. – BMitch

관련 문제