在Linux上创建一个Docker Postgres容器,使用Docker compose和绑定挂载,这样dir就包含了



这个问题在无数地方被问了无数次,但到目前为止,我还没有找到一个真正有效的答案。

我想要什么:

我想创建一个Docker容器(使用Docker Compose,只需一次启动,而不需要手动在两者之间进行chmodchown),其中包含一个Postgres数据库。这个数据库的内容应该绑定到我的本地系统,例如目录./data,理论上使用volumes:n ./data:/var/lib/postgresql/data是可能的。然而,如果这样的话,./data目录将由root拥有(或者由systemd-coredump拥有,因为这是id为999的用户),我不希望这样。我希望能够在没有根权限的情况下将整个目录移动到另一个位置,因此生成的目录应该归我的用户所有(1000:1000)。

这个问题已经被问了无数次,但我尝试过的答案都不起作用。创建的目录在主机上是空的(可能是因为容器没有作为我的用户写入的权限),或者它只能由root访问,或者它可以与卷一起使用(!=绑定装载),或者当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的解决方案也不起作用:
    • 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
    • 而CCD_ 14给了我错误CCD_。CCD_ 16和悬点的其他组合也没有结果

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

但我没能做到这一点。

我找到了很多其他答案,但没有一个提供工作代码(要么是在Unix上工作的纯docker命令(在我的例子中是Ubuntu),要么是工作的docker compose文件加上dockerfile(如果需要的话)。有很多聪明的答案,也许我太愚蠢了,无法将这些点联系起来,但如果有人能给我一个有效的解决方案,我将不胜感激。

此外,在我看来https://github.com/docker-library/docs/tree/master/postgres#arbitrary---用户注释甚至似乎是错误的——他们围绕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,在Linux上工作,有一个绑定挂载,dir不归root所有,也不为空)。

我得到的是这样的:

postgres:    
image: postgres
user: 1000:1000    
environment:    
POSTGRES_DB: strapi    
POSTGRES_USER: strapi    
POSTGRES_PASSWORD: strapi

user: 1000:1000添加到postgres服务中,运行docker-compose build,然后进行docker compose。容器运行时具有定义用户的正确写入和读取权限

最新更新