我正在使用 docker 和 db2,但是当我尝试以用户 db2inst1 的身份将命令执行到正在运行的容器中时,我遇到了麻烦。我将容器启动为(它是 1 行,但为了便于阅读,我将其拆分):
docker run -itd --name mydb2 --privileged=true -p 50000:50000
-e LICENSE=accept
-e DB2INST1_PASSWORD=pelle_paltnacke
--mount type=volume,dst=${backupdir},volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=${addr}\",volume-opt=device=:${device}
-v /etc/passwd:/etc/passwd
-v /etc/group:/etc/group
-v /opt/nya/users/db2inst1:/opt/nya/users/db2inst1
-v /home/system/db2fenc1/:/home/system/db2fenc1/ ibmcom/db2
现在,如果我尝试这样做:
docker exec --user db2inst1 -ti mydb2 bash -c "cat /etc/passwd | grep db2inst1"
unable to find user db2inst1: no matching entries in passwd file
作为root没有问题:
docker exec -ti mydb2 bash -c "cat /etc/passwd | grep db2inst1"
db2inst1:x:422:422:DB2 Instance Administrator 1:/opt/nya/users/db2inst1:/bin/bash
而且 --user root 也可以正常工作:
docker exec --user root -ti mydb2 bash -c "cat /etc/passwd | grep db2inst1"
db2inst1:x:422:422:DB2 Instance Administrator 1:/opt/nya/users/db2inst1:/bin/bash
所以我尝试使用挂载的 passwd 文件中的 uid:
docker exec --user 422 -ti mydb2 bash -c "cat /etc/passwd | grep db2inst1"
db2inst1:x:422:422:DB2 Instance Administrator 1:/opt/nya/users/db2inst1:/bin/bash
/etc/passwd 对每个人都是可读的。无论如何,使用 uid 并没有让我走得太远:
docker exec --user 422 -ti mydb2 bash -c "db2licm -l"
bash: db2licm: command not found
所以我尝试:
docker exec --user 422 -ti mydb2 bash -c "whoami; . ~db2inst1/sqllib/db2profile;
db2licm -l"
db2inst1
bash: /opt/nya/users/db2inst1/sqllib/adm/db2licm: Permission denied
这只是我为演示问题而运行的几个命令。有没有人解释为什么 --user db2inst1 不能执行它们?
FWIW,我尝试不使用 nfs-mount 但我得到了相同的行为。
容器本身似乎工作正常。如果我如上所述启动容器并且:
#> docker exec -ti mydb2 bash
[root@0ee67959246f /]# mkdir -p /data/db/db2
[root@0ee67959246f /]# chown db2inst1:db2iadm1 /data/db/db2/
[root@0ee67959246f /]# su - db2inst1
[db2inst1@0ee67959246f ~]$ cd /data/backup/db2/wb11/MD000I11/
[db2inst1@0ee67959246f MD000I11]$ db2 "restore db MD000I11 incremental auto taken at 20220307141244 to /data/db/db2 into WD000I11"
DB20000I The RESTORE DATABASE command completed successfully.
编辑:一个有趣的观察是:
docker exec --user 422 -ti mydb2 bash -c "id"
uid=422(db2inst1) gid=0(root) groups=0(root)
docker exec --user 422:422 -ti mydb2 bash -c "id"
uid=422(db2inst1) gid=422(db2iadm1) groups=422(db2iadm1)
docker exec --user 422:422 -ti mydb2 bash -c "whoami; .
~db2inst1/sqllib/db2profile; db2licm -l"
db2inst1
Product name: "DB2 Community Edition"
License type: "Community"
...
不幸的:
docker exec --user db2inst1:db2iadm1 -ti mydb2 bash -c "id"
unable to find user db2inst1: no matching entries in passwd file
该问题似乎与 Db2 容器无关。我创建了一个 Dockerfile:
因为它只是内容并且可以重复这些现象。我什至删除了除 /etc/passwd 和 /etc/groups 的挂载之外的所有内容,但 --user 仍然失败。
看起来好像 --user X 在容器中变成了 uid 1000 ,无论用户名 X 是什么, /etc/passwd 中的 uid X 似乎都没有被考虑在内。
我试图解决这个问题的两个选项是:
在 Dockerfile 中创建一个“虚拟”用户:
或者使用 uid 作为 --user 的参数:
这里我使用 --login 来设置正确的环境。
我猜使用 podman 应该可以省去很多麻烦