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

Я пытаюсь сохранить данные нексуса в постоянном объеме. Для этого я использую этот набор 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/

А вот список томов docker перед запуском compose file (он пуст):

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

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

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# 

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

Ответы [ 3 ]

5 голосов
/ 08 января 2020

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

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

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

Для того, чтобы он работал, установите его следующим образом:

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

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

2 голосов
/ 08 января 2020

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

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

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

1 голос
/ 08 января 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 spe c:

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

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

...