Db2

docker exec –user db2inst1,找不到使用者 db2inst1:passwd 文件中沒有匹配的條目

  • March 14, 2022

我正在使用 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:

FROM registry.access.redhat.com/ubi8/ubi:8.5

因為它只是內容並且可以重複這些現象。我什至刪除了除 /etc/passwd 和 /etc/groups 的掛載之外的所有內容,但 –user 仍然失敗。

看起來好像 –user X 在容器中變成了 uid 1000 ,無論使用者名 X 是什麼, /etc/passwd 中的 uid X 似乎都沒有被考慮在內。

我試圖解決這個問題的兩個選項是:

在 Dockerfile 中創建一個“虛擬”使用者:

FROM ibmcom/db2

RUN groupadd --gid 422 db2iadm1
RUN useradd -u 422 -g db2iadm1 db2inst1
...

或者使用 uid 作為 –user 的參數:

docker exec --user 422:422 -ti mydb2 bash --login -c "db2licm -l"

這裡我使用 –login 來設置正確的環境。

我猜使用 podman 應該可以省去很多麻煩

引用自:https://dba.stackexchange.com/questions/308374