Привязать монтировать данные postgresql на окнах не работает - PullRequest
1 голос
/ 09 июля 2019

Если я использую это связывание для MySQL, оно будет заполнять папку / mysql-data после запуска контейнера

mysql:
  image: mysql:8.0
  volumes:
    - ./mysql-data:/var/lib/mysql

Но если я использую тот же подход с PostgreSQL, папка / pg-data останетсяпусто

postgres:
  image: postgres:11.3-alpine
  volumes:
    - ./pg-data:/var/lib/postgresql[/data]

Я пробовал оба пути с правой стороны: /var/lib/postgresql и /var/lib/postgresql/data

Я знаю, что могу использовать том данных для сохранения данных postgresql.Но меня удивляет, почему такой же подход работает с MySQL, но не с контейнером PostgreSQL.

Настройка: Windows 10, Docker Desktop v2.0.0.3 (31259)

Ответы [ 2 ]

0 голосов
/ 09 июля 2019
  1. Я подробно проверю вашу проблему, с помощью docker for windows, volumes: - ./mysql-data:/var/lib/mysql смонтирую папку Windows ./mysql-data в папку контейнера /var/lib/mysql с владельцем root:root. Затем точка входа mysql:8.0 запустит сервер MySQL и поместит вещи в /var/lib/mysql, чтобы вы могли видеть вещи в папке Windows.

  2. Но все по-другому для postgres:11.3-alpine, если вы проверите журнал:

    PS E:\test> docker-compose logs postgres
    Attaching to test_postgres_1
    postgres_1  | The files belonging to this database system will be owned by user "postgres".
    postgres_1  | This user must also own the server process.
    postgres_1  |
    postgres_1  | The database cluster will be initialized with locale "en_US.utf8".
    postgres_1  | The default database encoding has accordingly been set to "UTF8".
    postgres_1  | The default text search configuration will be set to "english".
    postgres_1  |
    postgres_1  | Data page checksums are disabled.
    postgres_1  |
    postgres_1  | fixing permissions on existing directory /var/lib/postgresql/data ... ok
    postgres_1  | creating subdirectories ... ok
    postgres_1  | selecting default max_connections ... 20
    postgres_1  | selecting default shared_buffers ... 400kB
    postgres_1  | selecting dynamic shared memory implementation ... posix
    postgres_1  | creating configuration files ... ok
    postgres_1  | 2019-07-09 13:50:21.843 UTC [47] FATAL:  data directory "/var/lib/postgresql/data" has wrong ownership
    postgres_1  | 2019-07-09 13:50:21.843 UTC [47] HINT:  The server must be started by the user that owns the data directory.
    postgres_1  | child process exited with exit code 1
    postgres_1  | initdb: removing contents of data directory "/var/lib/postgresql/data"
    postgres_1  | running bootstrap script ...
    

    Вы можете увидеть data directory "/var/lib/postgresql/data" has wrong ownership, хотя docker-entrypoint.sh сделал chown -R postgres "$PGDATA", чтобы изменить владельца с root на postgres, но, к сожалению, это работает, если вы запустите контейнер на linux. Для окон это не удастся, но для postgres необходимо, чтобы владельцем этой папки было postgres, а не root. Таким образом, служба даже не запускается в Windows, поэтому вы, безусловно, не можете видеть, как что-то всплывает в вашей папке Windows.

  3. Наконец, почему chown -R postgres "$PGDATA" терпит неудачу, если хост докера - Windows? Это ответ.

    К сожалению, с текущей реализацией (основанной на CIFS / Samba) мы не можем улучшить это.

    Попытка изменить эти значения с помощью chmod / chown вернет успех, но безрезультатно.

    https://www.samba.org/samba/docs/man/manpages-3/mount.cifs.8.html#id2532725

    Я оставляю эту проблему открытой для отслеживания.

  4. Что мы можем сделать?

    В настоящее время обходным путем для этого является использование именованных томов:

    докер-compose.yaml:

    postgres:
    image: postgres:11.3-alpine
      volumes:
        - pg-data:/var/lib/postgresql/data
    

    С учетом вышеизложенного данные не будут вставляться в папку Windows pg-data, они будут поддерживаться самой докерской системой. Вы можете использовать следующий, чтобы проверить громкость:

    PS E:\test> docker volume inspect pg-data
    [
        {
            "CreatedAt": "2019-07-09T14:09:38Z",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/pg-data/_data",
            "Name": "pg-data",
            "Options": null,
            "Scope": "local"
        }
    ]
    

    Хотя Mountpoint, расположенный в виртуальной машине MOBY, являющейся машиной Hyper-V, получить к ней доступ нельзя, но она всегда будет сохраняться там. Это означает, что даже если вы удалите свой контейнер, в следующий раз используйте тот же именованный том, ваш контейнер все еще может использовать постоянные данные.

  5. Что мы можем ожидать?

    Может быть, вы можете ожидать WSL2, что Microsoft встраивает ядро ​​Linux в Windows, тогда мы можем установить в него докер, возможно, решить эту проблему.

0 голосов
/ 09 июля 2019

Это может быть проблема с разрешением. На хосте Docker запустите.

chown -R 70:70 ./pg-data

Если на хосте Windows, проверьте, имеет ли папка разрешение на запись для всех пользователей (Все).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...