Почему docker-compose создает том по случайному пути, а не по пути, который я указал в docker-compose.yml?

Я пытаюсь сохранить данные нексуса в постоянном томе. Для этого я использую этот составной yaml:

version: '3.5'

services:
  nexus:
    image: sonatype/nexus3
    volumes:
       - ./nexus-data:/nexus-data sonatype/nexus3
    ports:
      - "8081:8081"
    networks:
      - devops
    extra_hosts:
      - "my-proxy:my-proxy-address"
    restart: on-failure

networks:
  devops:
    name: devops
    driver: bridge

Перед запуском docker-compose up я создал папку nexus-data и дал необходимые разрешения для uid/guid 200, как предлагается здесь:

https://github.com/sonatype/docker-nexus3/blob/master/README.md#persistent-data.

root@master-node:~/docker# ll
total 16
drwxr-xr-x  3 root root 4096 Jan  8 13:37 ./
drwx------ 22 root root 4096 Jan  8 13:40 ../
-rw-r--r--  1 root root  319 Jan  8 13:36 docker-compose.yml
drwxr-xr-x  2  200  200 4096 Jan  8 13:37 nexus-data/

А вот список томов докера перед запуском файла компоновки (он пустой):

root@master-node:~/docker# docker volume ls
DRIVER              VOLUME NAME

После команды docker-compose up докер создал том, как показано ниже:

root@master-node:~/docker# docker volume ls
DRIVER              VOLUME NAME
local               7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b
root@master-node:~/docker# docker volume inspect  7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b 
[
    {
        "CreatedAt": "2020-01-08T13:42:34+03:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b/_data",
        "Name": "7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b",
        "Options": null,
        "Scope": "local"
    }
]
root@master-node:~/docker# ls /var/lib/docker/volumes/7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b/_data
admin.password  cache  db  elasticsearch  etc  generated-bundles  instances  javaprefs  karaf.pid  keystores  lock  log  orient  port  restore-from-backup  tmp

но папка, которую я указал в файле компоновки (nexus-data), все еще пуста:

root@master-node:~/docker# ls nexus-data/
root@master-node:~/docker# 

Итак, что я делаю неправильно здесь? Почему isnexus-data пуст, а докер создает том по другому пути?


person kadir    schedule 08.01.2020    source источник
comment
В вашей директиве volumes: в пути на стороне контейнера есть пробел; это правильно?   -  person David Maze    schedule 08.01.2020
comment
Объявите свой объем вот так - ./nexus-data:/nexus-data.   -  person leopal    schedule 08.01.2020
comment
В официальных документах используется простая команда докера docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3. Объемная часть -v nexus-data:/nexus-data, а не sonatype/nexus3, которая является именем изображения.   -  person leopal    schedule 08.01.2020
comment
Спасибо за ваши ценные комментарии, изменение пути к ./nexus-data:/nexus-data решило мою проблему. Если вы решите написать в качестве ответа свои комментарии, я могу принять это. @леопал   -  person kadir    schedule 08.01.2020
comment
Я использовал руководство из этого сообщения в блоге: medium.com/@ahmed24khaled/ и этот репозиторий: github.com/ahmed24khaled/DevOps -app/blob/develop/ но оказывается, что у руководства есть некоторые проблемы. Обновление пути как ./nexus-data:/nexus-data решило мою проблему.   -  person kadir    schedule 08.01.2020


Ответы (3)


Вы создали хост-том, также известный как привязка монтирования (который не отображается в docker volume ls, так как это не именованный том)B от ./nexus-data на хосте до /nexus-data sonatype/nexus3 внутри контейнера. Это похоже на ошибку копирования и вставки из команды docker run, поскольку вы добавляете имя образа к пути, монтируемому внутри контейнера. Вы должны иметь возможность запускать контейнер и просматривать свои файлы с помощью:

docker exec ... ls "/nexus-data sonatype/nexus3"

Вы должны удалить имя образа из пути к тому, чтобы смонтировать типичное место внутри контейнера:

version: '3.5'

services:
  nexus:
    image: sonatype/nexus3
    volumes:
       - ./nexus-data:/nexus-data
    ports:
      - "8081:8081"
    networks:
      - devops
    extra_hosts:
      - "my-proxy:my-proxy-address"
    restart: on-failure

networks:
  devops:
    name: devops
    driver: bridge

Том, который вы видели, был анонимным томом. Это будет из самого образа, определяющего том, который вы не включили в спецификацию контейнера. Проверка контейнера с использованием этого тома покажет, где он смонтирован, скорее всего, в /nexus-data.

person BMitch    schedule 08.01.2020
comment
Спасибо, кажется, у руководства, которое я использовал, были некоторые проблемы. Обновление пути решило мою проблему. - person kadir; 08.01.2020

Вы определили том вместо привязки монтирования, чего вы и хотите. Прочитайте документацию об этом.

По сути, ваша конфигурация заставляет докер создавать volume, который сопоставляется со случайно созданным каталогом где-то под /var/lib/docker/volumes.

Если вам нужен определенный каталог, которым вы управляете, вам нужно создать файл bind. Вот почему у вас нет данных в выбранном вами каталоге, поскольку докер игнорирует их, потому что они бесполезны для volume.

Чтобы он работал, установите его так:

    volumes:
      - type: bind
        source: ./nexus-data
        target: /nexus-data

как описано в документации по составлению. (Также удалено имя образа из этой конфигурации)

person samthegolden    schedule 08.01.2020
comment
Я понизил голос, потому что вопросы OP ... что я здесь делаю неправильно? Почему нексус-данные пусты, а докер создает том по другому пути? ни один из которых не был рассмотрен в вашем ответе. - person masseyb; 08.01.2020
comment
Я использовал руководство из этого сообщения в блоге: medium.com/@ahmed24khaled/ и этот репозиторий: github.com/ahmed24khaled/DevOps -app/blob/develop/ но оказывается, что у руководства есть некоторые проблемы. Обновление пути как ./nexus-data:/nexus-data решило мою проблему. - person kadir; 08.01.2020
comment
@samthegolden баллы за последнее редактирование. Примечание. краткий синтаксис v3 ./path:/path относится к типу bind (эквивалентно явному длинному синтаксису). - person masseyb; 08.01.2020

Приведенный ниже docker-compose.yaml работает, как и ожидалось:

version: '3.5'

services:
  nexus:
    image: sonatype/nexus3
    volumes:
       - ./nexus-data:/nexus-data
    ports:
      - "8081:8081"
    networks:
      - devops
    extra_hosts:
      - "my-proxy:my-proxy-address"
    restart: on-failure

networks:
  devops:
    name: devops
    driver: bridge

Конечная цифра sonatype/nexus3 в исходной спецификации docker-compose.yaml:

    ...
    volumes:
       - ./nexus-data:/nexus-data sonatype/nexus3
    ...

... выбрасывает docker - том со случайным именем создается с учетом инструкции VOLUME в sonatype/nexus3 Dockerfile и монтируется в работающий контейнер, поэтому предполагаемый локально смонтированный каталог пуст.

person masseyb    schedule 08.01.2020
comment
@whoever_that_downпроголосовал по какой-либо причине, почему? Неконструктивно имхо понижать голос только потому, что. - person masseyb; 08.01.2020
comment
Это был не я. Я проголосовал за ваш ответ. Спасибо. - person kadir; 08.01.2020