Этот вопрос задавался бесчисленное количество раз в бесчисленных местах, но до сих пор я не нашел ни одного действительно работающего ответа.
Что я хочу:
Я хочу создать 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
returnsmkdir: 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, без chmod
ing между ними, работает на Linux, с биндом-монтированием, каталог не принадлежит руту и не пустой).