这个问题在无数地方被问了无数次,但到目前为止,我还没有找到一个真正有效的答案。
我想要的:
我想要创建一个Docker容器(使用Docker,并且只需要手动启动一个chmod
或chown
),其中包含一个Postgres。这个数据库的内容应该绑定到我的本地系统,例如。到目录./data
,理论上使用volumes:\n ./data:/var/lib/postgresql/data
是可能的。但是,如果有这样的数据,那么./data
目录将被根目录所拥有(或者由systemd-coredump
拥有,因为它是id 999
的用户),我不想这样做。我希望能够在没有根目录权限的情况下将整个目录移动到另一个位置,因此生成的目录应该由my user (1000:1000
)拥有。
这个问题已经问过无数次了,但没有一个答案有效。创建的目录要么是主机上的空目录(大概是因为容器没有以我的用户身份写入的权限),要么是它只能通过根用户访问,或者它可以使用卷(!=绑定挂载),或者当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的解决方案),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
返回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.
,./data
目录在我的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
解决方案上仍然是空的。其他组合的PGDATA
和挂载点也不是PGDATA
。https://stackoverflow.com/a/66502465/5122790
这个答案在理论上是可行的,但是我不想在这两者之间进行chmod
,然后更改我的docker-compose.yml
文件。对于这个blogpost:https://suedbroecker.net/2020/06/23/run-a-postgressql-container-as-a-non-root-user-in-openshift/有一个注释,它建议在设置正确的用户和权限的地方创建一个自定义的Dockerfile
,但是这也不适合我(...maybe,因为我的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
但我没能做到这一点。
我发现提供了大量的其他答案,但它们都没有提供工作代码(在我的例子中,这是一个在Unix上工作的纯docker命令(在我的例子中是Ubuntu),或者是一个工作的docker-复合文件加上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),人们似乎一直在琢磨它,但到目前为止,我还没有找到一个适用于我的需求的解决方案(对接-撰写,中间没有chmod
,在Linux上工作,绑定挂载,dir不属于根,也不是空的)。
发布于 2022-05-27 20:56:37
我是这样的:
postgres:
image: postgres
user: 1000:1000
environment:
POSTGRES_DB: strapi
POSTGRES_USER: strapi
POSTGRES_PASSWORD: strapi
将user: 1000:1000
添加到postgres服务中,运行docker-compose build
,然后进行对接-组合。为定义的用户运行具有正确的读写权限的容器。
https://stackoverflow.com/questions/68561662
复制相似问题