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



我有以下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

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

$ docker-compose up -d
$ ls -l ~
drwx------ 19  4688518 usertest 4096 Mar 11 17:06 test

文件夹~/test是用不同的uid创建的,以防止意外操作这个文件夹在容器之外。但如果我真的想操纵它呢?例如,如果我尝试删除文件夹,就会得到一个权限拒绝错误:

$ rm ~/test -rf
rm: cannot remove '/home/usertest/test': Permission denied

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

如何删除这些文件夹?

但是如果我真的想操作它呢?

使用Docker,你可以:
  1. 以使用相同UID(如rmsh)的特定用户在容器中运行命令,例如:

    # Run shell session using your user with docker-compose
    # You can then easily manipulate data
    docker-compose exec -u 4688518 pg sh 
    # Run command directly with docker
    # Docker container name may vary depending on your situation
    # Use docker ps to see real container name 
    docker exec -it -u 4688518 stack_pg_1 rm -rf /var/lib/postgresql/data 
    
  2. 与前一个类似,您可以使用以下命令运行新容器:

    # Will run sh by default
    docker run -it -u 4688518 -v $HOME/test:/tmp/test busybox
    # You can directly delete data with 
    docker run -it -u 4688518 -v $HOME/test:/tmp/test busybox rm -rf /tmp/test/*
    

    如果您的pg容器被停止或删除,这可能适用。Docker镜像本身不需要和Docker Compose运行的镜像相同,你只需要指定合适的用户UID。

    注意:您可能无法使用rm -rf /tmp/test删除文件夹,因为4688518可能没有对/tmp文件夹的写权限,因此使用/tmp/test/*

  3. 使用上述任何一个,但使用root用户,如-u 0-u root

不使用Docker,可以按照其他答案的建议有效地运行sudo命令,甚至暂时更改该文件夹的权限后再更改回来。然而,从经验来看,当操作与Docker相关的数据时,用户Docker本身更容易,更不容易出错。

在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.

然后你可以使用

来运行容器
docker run --rm -u `id -u`:3333 -v `pwd`/workspace:/workspace 
-w /workspace alpine:latest touch myfile

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

最新更新