Създайте Docker-Postgres-Container на Linux с docker-compose и bind-mount, така че директорията да съдържа pgres-data и да не е собственост на root

Този въпрос е задаван безброй пъти на безброй места, но досега не съм намерил нито един отговор, който да работи.

Какво искам:

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

Това е задавано безброй пъти, но нито един отговор, който опитах, не работи. Или създадената директория е била празна на хоста (вероятно защото контейнерът не е имал права да пише като мой потребител), или е била достъпна само от root, или е щяла да работи с том (!=bind-mount), или щеше да работи, когато chown-ing между тях, но това не е всичко, което искам.

Какво открих досега:

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-file плюс 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, с bind-mount, dir не е собственост на root и не е празен).


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