Создайте Docker-Postgres-Container в Linux с помощью docker-compose и bind-mount, чтобы каталог содержал данные pgres и не принадлежал пользователю root.

Этот вопрос задавался бесчисленное количество раз в бесчисленных местах, но до сих пор я не нашел ни одного действительно работающего ответа.

Что я хочу:

Я хочу создать Docker-Container (используя Docker-Compose и только один запуск без необходимости вручную chmod или chown между ними), который содержит базу данных Postgres. Содержимое этой базы данных должно быть привязано к моей локальной системе, например. в каталог ./data, что теоретически возможно при использовании volumes:\n ./data:/var/lib/postgresql/data. Однако если кто-то скажет, что каталог ./data будет принадлежать пользователю root (или systemd-coredump, потому что это пользователь с идентификатором 999), а я этого не хочу. Я хочу иметь возможность перемещать все это в другое место без root-прав, поэтому полученный каталог должен принадлежать моему пользователю (1000:1000).

Об этом спрашивали бесчисленное количество раз, но ни один ответ, который я пробовал, не сработал. Либо созданный каталог был пустым на хосте (предположительно, потому что у контейнера не было прав на запись от имени моего пользователя), либо он был доступен только пользователю root, либо он работал бы с томом (!=bind-mount), или это сработало бы, когда между ними chown, но это все не то, чего я хочу.

Что я нашел до сих пор:

https://github.com/docker-library/postgres/issues/116: Ни одно из этих решений не сработало для меня.

  • когда я напр. запустить PG_DATA=$(pwd)/data docker run -d --name psql -e POSTGRES_PASSWORD=DB_PASS -e POSTGRES_USER=DB_USER -e POSTGRES_DB=DB_NAME -e PGDATA=$PG_DATA -v $PG_DATA:/var/lib/postgresql/data postgres:11.5-alpine (решение krzysztof-adamski), каталог ./data на моем хосте останется пустым.
  • shewless's solution also doesn't work:
    • docker run -it --rm --user "$(id -u):$(id -g)" -v $(pwd)/data:/var/lib/postgresql/data -v /etc/passwd:/etc/passwd:ro -e POSTGRES_PASSWORD=mysecretpassword -e PGDATA=/var/lib/postgresql/data/mydata postgres returns mkdir: cannot create directory ‘/var/lib/postgresql/data/mydata’: Permission denied
    • а docker run -it --rm --user "$(id -u):$(id -g)" -v $(pwd)/data:/var/lib/postgresql/data/pgdata -v /etc/passwd:/etc/passwd:ro -e POSTGRES_PASSWORD=mysecretpassword -e PGDATA=/var/lib/postgresql/data/pgdata postgres выдает ошибку chmod: changing permissions of '/var/lib/postgresql/data/pgdata': Operation not permitted chmod: changing permissions of '/var/run/postgresql': Operation not permitted The files belonging to this database system will be owned by user "chris". This user must also own the server process.. другие комбинации PGDATA и точки монтирования также не дали результатов.

https://stackoverflow.com/a/66502465/5122790:

Этот ответ теоретически работает, однако я не хочу chmod между ними, а затем менять свой файл docker-compose.yml. К этому сообщению в блоге есть комментарий: https://suedbroecker.net/2020/06/23/run-a-postgressql-container-as-a-non-root-user-in-openshift/, что предполагает создание пользовательского Dockerfile, где установлены правильный пользователь и разрешения, однако это также не сработало для меня (... может быть, потому что мой docker-compose.yml был несовместим с этим - я пробовал различные комбинации удаления/добавления некоторых строк с этими файлами:

Dockerfile:

FROM postgres:latest

# see https://stackoverflow.com/a/66502465/5122790

RUN mkdir temp


RUN groupadd non-root-postgres-group
RUN useradd non-root-postgres-user --group non-root-postgres-group

RUN chown -R non-root-postgres-user:non-root-postgres-group /temp
RUN chmod 777 /temp
#RUN chown -R non-root-postgres-user:non-root-postgres-group /usr/local/var/postgres

USER non-root-postgres-user 

docker-compose.yml:

version: "3.8"

#see https://forums.docker.com/t/data-directory-var-lib-postgresql-data-pgdata-has-wrong-ownership/17963/26
services:
  sidb:
    container_name: arg
#    image: postgres:latest
    build: . #see https://stackoverflow.com/a/66502465/5122790
    volumes:
      - ./django_data/db:/tmp/data:rw
      - /etc/passwd:/etc/passwd:ro
    ports:
      - "5433:5432"
    environment:
      - POSTGRES_DB=siddata
      - POSTGRES_USER=siddata
      - POSTGRES_PASSWORD=siddata
      #- PGDATA=/tmp/data #see https://stackoverflow.com/a/61884120/5122790 https://stackoverflow.com/a/66502465/5122790
    #user: 1000:1000

но мне не удалось заставить что-либо из этого работать.

Я нашел тонну других ответов, но НИ ОДИН из них не предоставил рабочий код (ни чистая команда docker, которая работает в Unix (Ubuntu в моем случае), либо работающий файл docker-compose плюс файл dockerfile если нужно.Есть много умных ответов, может быть, я слишком глуп, чтобы соединить точки, но если кто-то может дать мне рабочее решение, я был бы очень благодарен.

Кроме того, насколько я понимаю, документация по адресу https://github.com/docker-library/docs/tree/master/postgres#arbitrary---user-notes даже кажется неправильным - их второй обходной путь docker run -it --rm --user "$(id -u):$(id -g)" -v /etc/passwd:/etc/passwd:ro -e POSTGRES_PASSWORD=mysecretpassword postgres не работает на моем машина и снова выдает ошибку fixing permissions on existing directory /var/lib/postgresql/data ... initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted.

Также есть масса закрытых проблем (https://github.com/docker-library/postgres/issues/427, https://github.com/docker-library/postgres/issues/476, https://github.com/docker-library/postgres/issues/264, https://github.com/moby/moby/issues/22075, https://github.com/docker-library/postgres/issues/116), и люди, кажется, продолжают выяснять это, но пока я не нашел ни одного решения, которое бы соответствовало моим требованиям (docker-compose, без chmoding между ними, работает на Linux, с биндом-монтированием, каталог не принадлежит руту и ​​не пустой).


person Chris Stenkamp    schedule 28.07.2021    source источник