如果平常本身有在玩 Docker 的開發者肯定知道透過 docker command 啟動的容器預設是使用 root
來當作預設使用者及群組,這邊會遇到一個問題,當 Host 環境你有 root 權限就沒有此問題,如果你沒有 root 權限,又有需求在 Docker 容器內掛上 Volume,會發現產生出來的檔案皆會是 root 權限,這時候在 Host 完全無法寫入。本篇教大家使用三種方式來設定容器使用者權限。
使用 docker 指令時指定使用者
進入 Ubuntu 容器會透過底下指令:
docker run -ti ubuntu /bin/bash
這時候可以透過 -u
方式將使用者 uid 及群組 gid 傳入容器內。
mkdir tmp
docker run -ti -v $PWD/tmp:/test \
-u uid:gid ubuntu /bin/bash
如何找到目前使用者 uid 及 gid 呢,可以透過底下方式
id -u
id -g
上述指令可以改成:
docker run -ti -v $PWD/tmp:/test \
-u $(id -u):$(id -g) ubuntu /bin/bash
使用 Dockerfile 指定使用者
也可以直接在 dockerfile 內直接指定使用者:
# Dockerfile
USER 1000:1000
我個人不是很推薦這方式,除非是在 container 內獨立建立使用者,並且指定權限。
透過 docker-compose 指定權限
透過 docker-compose 可以一次啟動多個服務。用 user
可以指定使用者權限來寫入特定的 volume
services:
agent:
image: xxxxxxxx
restart: always
networks:
- proxy
logging:
options:
max-size: "100k"
max-file: "3"
volumes:
- ${STORAGE_PATH}:/data
user: ${CURRENT_UID}
接著可以透過 .env
來指定變數值
STORAGE_PATH=/home/deploy/xxxx
CURRENT_UID=1001:1001
心得
會指定使用者權限通常都是有掛載 Host volume 進入容器內,但是您又沒有 root 權限,如果沒有這樣做,這樣產生出來的檔案都會是 root 權限,一般使用者無法寫入,只能讀取,這時就需要用到此方法。