首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Linux上使用docker-组合和绑定挂载创建一个docker-Postgres-容器,这样dir包含pgres-data,并且不属于root。

在Linux上使用docker-组合和绑定挂载创建一个docker-Postgres-容器,这样dir包含pgres-data,并且不属于root。
EN

Stack Overflow用户
提问于 2021-07-28 13:49:18
回答 1查看 860关注 0票数 2

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

我想要的:

我想要创建一个Docker容器(使用Docker,并且只需要手动启动一个chmodchown ),其中包含一个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
    • while 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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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/427https://github.com/docker-library/postgres/issues/476https://github.com/docker-library/postgres/issues/264https://github.com/moby/moby/issues/22075https://github.com/docker-library/postgres/issues/116),人们似乎一直在琢磨它,但到目前为止,我还没有找到一个适用于我的需求的解决方案(对接-撰写,中间没有chmod,在Linux上工作,绑定挂载,dir不属于根,也不是空的)。

EN

回答 1

Stack Overflow用户

发布于 2022-05-27 20:56:37

我是这样的:

代码语言:javascript
运行
复制
postgres:    
      image: postgres
      user: 1000:1000    
      environment:    
        POSTGRES_DB: strapi    
        POSTGRES_USER: strapi    
        POSTGRES_PASSWORD: strapi

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68561662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档