Docker Compose-여러 컨테이너간에 명명 된 볼륨 공유


107

docker-compose 및 v3을 사용하고 있습니다. Docker에 볼륨을 마운트하려고합니다.

./appdata:/appdata

이 볼륨을 볼륨으로 한 다음 여러 컨테이너에서 해당 볼륨을 참조하고 싶습니다. 볼륨 구성 참조 만 도시 data-volume:없는 값으로 명명 된 볼륨으로, 그것은 위처럼 보이지 않도록.

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume

volumes:
     app-volume: ./appdata:/appdata

이것은 나에게 준다 :

오류 : './docker-compose.yml'파일에서 'app-volume'볼륨은 문자열이 아닌 매핑이어야합니다.

분명히 volumes키 / 값 쌍 을 변경해야한다는 것을 알고 있지만 서비스간에 볼륨을 공유 할 수 있도록이를 변경 하는 방법 을 잘 모르겠습니다 .

나는 또한 체크 아웃 volumes_from했지만 이것은 효과적으로 다른 컨테이너로부터 상속을 허용합니다. 나는 누군가가 volumes_from원하는 매핑을 포함하는 다른 컨테이너에서 사용 하는 것을 보았지만 command: true컨테이너가 실제로 실행되지 않도록 설정하면 나에게는 해킹처럼 보입니다.

어떻게 할 수 있습니까?


참고, 내가 다음과 같은 작업이 :

nginx:
    volumes:
        - ./appdata:/appdata
php:
    volumes:
        - ./appdata:/appdata

그러나 그것은 단지 복제이며 명명 된 볼륨이 나를 피하는 데 도움이 될 수 있기를 바랍니다. :-)


: 당신은이 답변에서 답 찾을 수 있습니다 stackoverflow.com/a/49920624
ISEN 잉

답변:


141

명명 된 볼륨은 다음과 같은 방법으로 컨테이너간에 공유 할 수 있습니다.

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume:location_in_the_container

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume:location_in_the_container

volumes:
     app-volume: 

다음은 더 나은 이해를 위해 사용하는 예제 구성입니다. web컨테이너 에서 생성 된 정적 파일 을라는 명명 된 볼륨에 노출 한 다음 컨테이너에서 static-content읽고 제공합니다 nginx.

services:
  nginx:
    container_name: nginx
    build: ./nginx/

    volumes:
      - static-content:/usr/src/app

  web:
    container_name: web
    env_file: .env
    volumes:
      - static-content:/usr/src/app/public
    environment:
      - NODE_ENV=production

    command: npm run package

volumes:
  static-content:

79
static_content호스트 파일 시스템 의 위치는 어디에 설정 합니까?
Travis Bear

10
공백 app-volume: location_in_the_container이 잘못되었습니다.
hasufell 2010 년

4
어떤 경우 /usr/src/app에서 nginx컨테이너와 /usr/src/app/publicweb용기 모두 하나가 사용 이유됩니다 원본 콘텐츠를 가지고?
jallen0927

2
이 사용 사례 (컨테이너 간 데이터 공유)의 경우 @TravisBear는 실제로 호스트에있을 필요가 없습니다. 정적 데이터 예는 중대하다 - 당신이 실행하는 collectstatic하나 개의 컨테이너에 결과가 다른 하나에 사용할 수있게하려면,하지만 당신은 호스트 폴더에 대해 걱정하지 않는다
대부

7
@Kannaj TravisBear의 질문은 내가 가장 혼란스러워하는 문제를 올바르게 식별하는 질문입니다. 작성 파일에서 명명 된 볼륨의 출처를 어떻게 지정할 수 있습니까? 호스트에서 명명 된 볼륨을 저장할 위치를 결정하기 위해 Docker 엔진에 맡기고 싶지 않고 경로를 지정하고 싶습니다.
Ben Collins

33

이렇게하면 명명 된 볼륨을 사용하지 않고 문제가 해결됩니다.

      volumes:
          - ./appdata:/appdata

따라서 다음과 같이 보입니다.

services:

  nginx:
      build: ./nginx/
      ports:
          - 80:80
      links:
          - php
      volumes:
          - ./appdata:/appdata

  php:
      build: ./php/
      expose:
          - 9000
      volumes:
          - ./appdata:/appdata

4
아, 좋은 타이밍! 위에서이 작업을 수행했습니다 (변경 사항 참조). 그러나 우리는 여전히 매핑을 복제하고있는 것 같습니다. 이것을 3 개 이상 사용하면 커집니다. 이 중복을 피하기 위해 명명 된 컨테이너를 사용할 수 있습니까?
Jimbo

문제는 명명 된 볼륨이 구문과 명확한 코드에 관한 것이 아니라는 것입니다. Docker 데이터 설치 디렉터리 내에 볼륨이 생성되고 로컬 파일 (./appdata)이 없습니다. 어쨌든 당신에게 유용합니까?
Robert

1
나는 확실히 ./appdata, 그것이 내가하려는 일이 필요합니다. 그래도 여기에 대답을 남겨주세요 :) +1
Jimbo

2
하나의 컨테이너에 파일을 업로드 (업로드 파일 서비스를 통해)하는 동일한 이미지의 컨테이너가 두 개있는 경우 다른 컨테이너에서 사용할 수 있습니까? 그렇지 않다면 어떻게 할 수 있습니까?
magnoz

0

docker라는 이름의 볼륨은 버전 docker-compose 3부터 제거되었습니다.

그러나 확장 필드 를 사용 하여 볼륨 소스 복제를 방지하고 향후 오타를 방지 할 수 있습니다 .

version: '3.5'

x-services-volume:
  &services-volume
  type: bind
  source: ./appdata
  target: /appdata

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes: *services-volume

    php:
        build: ./php/
        expose:
            - 9000
        # Use same way as for nginx if target override not needed.
        volumes:
            - <<: *services-volume
            target: /opt/target-override

참고 : 해당 기능은 버전 3.4 파일 형식부터 사용할 수 있습니다.


* services-volume이 위에 설정 한 값에 대한 포인터 일 뿐이라면 멋져 보입니다. 시도해 보겠습니다.
Jimbo

@Jimbo 예, 그렇습니다. docker-compose 파일 버전은
3.4 이상

2
이름이 지정된 볼륨 (일명 최상위 volumes필드)은 v3의docker-compose .
Alex Povel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.