我如何给访问容器有一个绑定卷的完全访问权



当我使用绑定卷时,我在部署一些docker映像时遇到了问题,当我检查日志时,我看到错误,例如当docker应用程序试图创建文件夹时拒绝访问。例如,下面的docker组件创建了两个容器,一个用于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:

对于数据库,我使用bind volume,但是对于面板,我使用normal volume。应用程序运行良好。如果我改变面板容器使用绑定卷我的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这样的情况下,它使我更容易访问文件以创建主题。

有人能帮我解决这个问题吗?

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

您必须在PostgreAdmin中指定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"

最新更新