使用无根 docker 创建的绑定挂载在主机上有一个奇怪的 uid。如何删除这些文件夹?

Mik*_*cki 7 docker docker-compose

我有以下docker-compose.yml文件,它$HOME/test在主机系统上创建了一个绑定安装:

version: '3.8'

services:
  pg: 
    image: postgres:13
    volumes:
      - $HOME/test:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=pass
      - PGUSER=postgres
Run Code Online (Sandbox Code Playgroud)

我打开容器并检查绑定挂载目录的权限:

$ docker-compose up -d
$ ls -l ~
drwx------ 19  4688518 usertest 4096 Mar 11 17:06 test
Run Code Online (Sandbox Code Playgroud)

该文件夹~/test使用不同的 uid 创建,以防止在容器外对该文件夹进行意外操作。但如果我真的想操纵它呢?例如,如果我尝试删除该文件夹,则会按预期收到权限被拒绝错误:

$ rm ~/test -rf
rm: cannot remove '/home/usertest/test': Permission denied
Run Code Online (Sandbox Code Playgroud)

我怀疑我需要以newuidmap某种方式使用命令更改 uid ,但我不确定如何去做。

Til*_*ann 2

在 docker 中处理用户 ID 是一件棘手的事情,因为 docker 容器与主机操作系统共享相同的内核(至少在 Linux 上)。因此,容器在绑定挂载中使用给定 uid 创建的任何文件都将在主机系统上具有相同的 uid。

每当容器使用的 uid(假设是 2222)与您自己的 uid 不同(或者您对 2222 拥有的文件没有写权限)时,您将无法删除该文件夹。简单的解决方法是运行sudo rm -rf ~/test.

编辑:如果用户没有管理员权限,您仍然可以授予他们修改生成文件的权限,如下所示。

# Create a directory that the users can write in.
mkdir workspace
# Change the owner to the group of users that should have access (3333).
sudo chown -R 2222:3333 workspace
# Give group write access.
sudo chmod -R g+w workspace
# Make sure that all users that should have write access are in group 3333.
Run Code Online (Sandbox Code Playgroud)

然后你可以使用运行容器

docker run --rm -u `id -u`:3333 -v `pwd`/workspace:/workspace \
    -w /workspace alpine:latest touch myfile
Run Code Online (Sandbox Code Playgroud)

它会myfileworkspace具有正确权限的文件夹中创建,以便您的用户可以再次删除该文件。