volume_from инструкция - docker compose - PullRequest
1 голос
/ 17 октября 2019

С приведенным ниже файлом docker-compose.yml:

test:
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes_from:
    - cachev

cachev:
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - /build
  entrypoint: "true"

cachev служба в указанном файле запускает контейнер томов, который создает анонимный том в папке /var/lib/docker/ на хосте докера и создает точку монтирования /cache внутри контейнера тома (xx_cachev).


Создает ли инструкция volumes_from в сервисе test /build точка монтирования в контейнере xx_test? что указывает на /build точку монтирования xx_cachev контейнера?

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Из volumes_from документов :

Монтирование всех томов из другой службы или контейнера ...

Итак, краткий ответ да :

volumes_from монтируется /build объем, определяемый cachev сервисом внутри test сервиса.

Длинный ответ:

Чтобы ответить на ваш вопрос, давайте запустим сервис test:

docker compose up test

Прежде чем ответить на ваш вопрос, давайте убедимся, что описание понятно:

cachevслужба в приведенном выше файле запускает контейнер томов ...

Это обычный контейнер, который немедленно выходит из-за entrypoint: "true".

docker ps -a должен отображать:

ac68a33abe59 cache "true" 16 hours ago Exited (0) 4 minutes ago cache_1

Но перед выходом он создает тома, указанные в volumes:. Таким образом, мы можем назвать его контейнером томов, если его тома используются другим сервисом, например для кэширования.

, который создает анонимный том в папке / var / lib / docker / на хосте докера

Согласен. - /build - анонимный том. Можно проверить, просмотрев все монтирования контейнера:

docker inspect [cachev_container_id] --format '{{json .Mounts}}' | jq

должно показать что-то вроде:

  {
    "Type": "volume",
    "Name": "1ec7ff7c72bfb5a3259ed54be5b156ea694be6c8d932bcb3fa6e657cbcaea378",
    "Source": "/var/lib/docker/volumes/1ec7ff7c72bfb5a3259ed54be5b156ea694be6c8d932bcb3fa6e657cbcaea378/_data",
        "Destination": "/build",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
      }

jq - отличная утилита для работы с jsons в bash,Установите его для работы вышеуказанной команды.

и создайте точку монтирования / кэш в контейнере тома (xx_cachev).

Не видите никаких доказательств монтирования в cachev: предоставленная вами спецификация услуги.

Если вы добавите отображение - /tmp/cache:/cache в его раздел volumes, снова запустите docker compose up test и осмотрите вышедший контейнер, вы должны увидеть:

  {
    "Type": "bind",
    "Source": "/tmp/cache",
    "Destination": "/cache",
    "Mode": "rw",
    "RW": true,
    "Propagation": "rprivate"
  }

Обратите внимание, что docker inspect [cachev_service_id] --format '{{json .Mounts}}' | jq покажет все крепления контейнеров, включая те, которые указаны в docker/dev/Dockerfile с использованием инструкции VOLUME.

К ответ на ваш вопрос нам нужно проверить test сервисКонтейнер:

docker inspect [test_container_id] --format '{{json .Mounts}}' | jq:

покажет все тома, указанные в docker/dev/Dockerfile, если таковые имеются, и все тома cachev благодаря инструкции volumes_from.

Вы можете видеть, что оба контейнера test и cache имеют:

  {
    "Type": "volume",
    "Name": "1ec7ff7c72bfb5a3259ed54be5b156ea694be6c8d932bcb3fa6e657cbcaea378",
    "Source": "/var/lib/docker/volumes/1ec7ff7c72bfb5a3259ed54be5b156ea694be6c8d932bcb3fa6e657cbcaea378/_data",
    "Destination": "/build",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }

в своих креплениях, и этот том выживает при последующих запусках docker compose up test

1 голос
/ 17 октября 2019

Да, вы можете проверить, выполнив команду внутри обоих контейнеров. если файл создан в тестовом контейнере по пути touch /build/fromtest.txt, он будет виден в контейнере cacheV по тому же пути /build/fromtest.txt.

volume_from

Mountвсе тома из другой службы или контейнера

compose-file-объем__

Демонстрация, которую вы можете попробовать

test:
  image: alpine
  command: sh -c "touch /build/fromtest.txt && echo hell from test-container && ls /build/"
  volumes_from:
    - cachev

cachev:
  image: node:alpine
  command: sh -c "touch /build/fromcache.txt && echo hello from cache-container && ls /build/"
  volumes:
    - /build

logбудет

Recreating compose-volume_cachev_1 ... done
Recreating compose-volume_test_1   ... done
Attaching to compose-volume_cachev_1, compose-volume_test_1
cachev_1  | hello from cache-container
test_1    | hell from test-container
test_1    | fromcache.txt
test_1    | fromtest.txt
cachev_1  | fromcache.txt
cachev_1  | fromtest.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...