我有以下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,你可以:但是如果我真的想操作它呢?
以使用相同UID(如
rm
或sh
)的特定用户在容器中运行命令,例如:# 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
与前一个类似,您可以使用以下命令运行新容器:
# 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/*
使用上述任何一个,但使用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
,具有正确的权限,以便您的用户可以再次删除该文件。