Db2
docker exec –user db2inst1,找不到使用者 db2inst1:passwd 文件中沒有匹配的條目
我正在使用 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 應該可以省去很多麻煩