programing

도커 작성 - 여러 컨테이너 간에 명명된 볼륨 공유

muds 2023. 8. 24. 22:32
반응형

도커 작성 - 여러 컨테이너 간에 명명된 볼륨 공유

저는 도커 컴포지와 v3를 사용하고 있습니다.도커에 볼륨을 마운트하려고 합니다.

./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

하지만 그것은 단지 복제일 뿐이고 제가 이름이 붙은 볼륨이 제가 피하는 데 도움이 되기를 바랍니다 :-)

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

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:

이렇게 하면 명명된 볼륨을 사용하지 않고도 문제를 해결할 수 있습니다.

      volumes:
          - ./appdata:/appdata

다음과 같이 표시됩니다.

services:

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

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

다음 두 가지 옵션 중 하나를 사용할 수 있습니다.

  1. 명명된 볼륨: https://docs.docker.com/compose/compose-file/07-volumes/

  2. 볼륨 소스의 중복을 방지하고 향후 오타를 방지하기 위한 확장 필드:

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 파일 형식부터 사용할 수 있습니다.

이전 답변이 많은 도움이 되었지만(감사합니다!) 공유를 생성하기 위한 옵션을 설정하는 방법을 파악하는 데 시간이 더 걸렸습니다.tmpfs볼륨(메모리 파일 시스템).같은 상황에 처한 개발자들의 삶이 편해지길 바라는 마음에서 공유합니다.

의 관련 부분만 보여주는 예제docker-compose.yml:

version: '3'

volumes:
  shared-tmpfs:
    driver: local
    driver_opts:
      type: "tmpfs"
      device: "tmpfs"
      o: "size=256m,uid=1000"

services:
  nginx:
    volumes:
      - shared-tmpfs:/tmp/mytmpfs

  php-fpm:
    volumes:
      - shared-tmpfs:/tmp/mytmpfs

개발/감시 모드에서 SSD를 대량 쓰기(고정 HTML 파일의 빌드 로트)로부터 보호하는 데 사용합니다.

자세한 내용은 다음을 참조하십시오.driver_opts여기 도커 공식 문서에 있습니다.

언급URL : https://stackoverflow.com/questions/44284484/docker-compose-share-named-volume-between-multiple-containers

반응형