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 ,但我不确定如何去做。
在 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)
它会myfile在workspace具有正确权限的文件夹中创建,以便您的用户可以再次删除该文件。
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |