docker 如何给予对container的访问权限,以便对绑定卷具有完全访问权限

h22fl7wq  于 2023-01-16  发布在  Docker
关注(0)|答案(2)|浏览(159)

当我使用绑定卷时,我在部署一些docker映像时遇到了问题,当我检查日志时,我看到了错误,比如docker应用程序尝试创建文件夹时拒绝访问。例如,下面的docker compose创建了两个容器,一个用于postgres数据库,一个用于postgres管理面板。

version: '3.7'

services:

  PostgresDB:
    image: postgres    
    environment:
      - POSTGRES_DB=MyDatabase
      - POSTGRES_USER=MyUser
      - POSTGRES_PASSWORD=MyPassword
    volumes: 
      - ./data:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  PostgresDBAdmin:  
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: example@example.com
      PGADMIN_DEFAULT_PASSWORD: MyPasword
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - pgadmin:/var/lib/pgadmin
    ports:
      - "5050:80"

volumes:
    pgadmin:

对于数据库,我使用绑定卷,但对于面板,我使用普通卷。应用程序工作正常。如果我改变面板容器使用绑定卷,我的docker合成文件看起来像这样

version: '3.7'

services:

  PostgresDB:
    image: postgres    
    environment:
      - POSTGRES_DB=MyDatabase
      - POSTGRES_USER=MyUser
      - POSTGRES_PASSWORD=MyPassword
    volumes: 
      - ./data:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  PostgresDBAdmin:  
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: example@example.com
      PGADMIN_DEFAULT_PASSWORD: MyPasword
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - ./pgadmin:/var/lib/pgadmin
    ports:
      - "5050:80"

这将导致面板容器由于目录权限问题而失败。生成的错误日志如下所示

PostgresDBAdmin_1  | ERROR  : Failed to create the directory /var/lib/pgadmin/sessions:
PostgresDBAdmin_1  |            [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
PostgresDBAdmin_1  | HINT   : Create the directory /var/lib/pgadmin/sessions, ensure it is writeable by
PostgresDBAdmin_1  |          'pgadmin', and try again, or, create a config_local.py file
PostgresDBAdmin_1  |          and override the SESSION_DB_PATH setting per
PostgresDBAdmin_1  |          https://www.pgadmin.org/docs/pgadmin4/6.18/config_py.html
PostgresDBAdmin_1  | Traceback (most recent call last):
PostgresDBAdmin_1  |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 82, in create_app_data_directory
PostgresDBAdmin_1  |     _create_directory_if_not_exists(config.SESSION_DB_PATH)
PostgresDBAdmin_1  |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 20, in _create_directory_if_not_exists
PostgresDBAdmin_1  |     os.mkdir(_path)
PostgresDBAdmin_1  | PermissionError: [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'

这种问题很少见,我试着找到一种方法给予访问容器来创建目录,但我没有找到这样做的方法。我希望能够使用绑定卷的原因是因为在像NopCommerce这样的情况下,它使我更容易访问文件来创建主题。
有人能帮我解决这个问题吗?

qc6wkl3g

qc6wkl3g1#

pgadmin容器进程在UID为5050的用户下运行。
该用户需要具有主机上./pgadmin目录的访问权限。
一种方法是使用该UID在主机上创建一个用户,并使其成为有权访问./pgadmin目录的组的成员。
例如,如果./pgadmin归您和您的组所有,而您和您的组都称为“pitaridis”,那么您可以创建一个名为“pgadmin”的用户,如下所示

sudo adduser --system --no-create-home --uid 5050 --ingroup pitaridis --shell /usr/sbin/nologin pgadmin

然后容器进程可以访问./pgadmin并创建它需要的文件。
另一种可能更简单但不太安全的方法是以root身份运行容器,如下所示:

PostgresDBAdmin:  
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: example@example.com
      PGADMIN_DEFAULT_PASSWORD: MyPasword
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - ./pgadmin:/var/lib/pgadmin
    ports:
      - "5050:80"
    user: root
cqoc49vn

cqoc49vn2#

您必须在PostgreSQL Admin服务中指定user:root。Docker合成文件的结果如下所示:

PostgresDBAdmin:  
  image: dpage/pgadmin4
  user: root
  environment:
    PGADMIN_DEFAULT_EMAIL: example@example.com
    PGADMIN_DEFAULT_PASSWORD: MyPasword
    PGADMIN_CONFIG_SERVER_MODE: 'False'
  volumes:
    - ./pgadmin:/var/lib/pgadmin
  ports:
    - "5050:80"

相关问题