docker 容器之使用者 uid 和 gid

 docker 容器的 uid 和 gid 常會讓使用者在 host 端取用 volume 時綁手綁腳,雖然有人說這其中還有安全性的考量,但是使用 sudo 好像也沒有比較好,為了可以直接存取 volume 的檔案,居然花了好久好久,久到夫人說:怎麼最近又開始抱著電腦了?……………………………………其實是電腦沒有放人

 工作環境:
    Debian
        mariadb 10.11 docker(compose)

狀況:裝好 mariadb 之後,volume 的權限是 999.999 ,很煩,得 sudo 才能在本機作業,雖然也沒什麼不行,但就不愛,然後…………搞死自已 

2個解法,因為不是 product 環境,先試到這兒,期望有人講白話,把這題解了,免得折騰半天

法1:雖然不能自動化,但是直覺…

 先裝起來

 dcshell container_name (docker exec -it $1 /bin/bash -l)

 usermod -u your_uid_in_host app_user;

 groupmod -g your_gid_in_host app_group;

 exit

 chown -R user_user:user_group docker_volume

 然後參照之前的客製 docker image 的方式, 在 docker-compose.override.yml 設定引用新的 image 


法2:真的用 Dockerfile 就可以自動化嗎!?先搞懂 Dockerfile 怎麼用吧

 去下載所需的檔案,然後加一個超奇怪的 「USER "1000"」 到 Dockerfile 裏,再回到 docker-compose 裏引用 Dockerfile 並且指定 user ,這個解法能用匪夷所思來形容,反正能解,先頂著

 

總而言之

 書到用時恨太多!

先醬!

 

 

 收工!

=================== sample 檔 ==================

法1

 docker-compose.yml 

version: '3'
services:
mariadb:
image: mariadb:10.11
  container_name: mariadb
#user: 1000:1000 #makes volume own by root.root
environment:
MYSQL_ROOT_PASSWORD: xxxxxx
MYSQL_DATABASE: xxxxx
MYSQL_USER: xxxxx
MYSQL_PASSWORD: xxxxx
logging:
driver: syslog
options:
tag: "{{.DaemonName}}(image={{.ImageName}};name={{.Name}};id={{.ID}})"
# networks:
# - backend
restart: unless-stopped
#restart: on-failure
volumes:
- ${PWD}/mariadb:/var/lib/mysql
#version: '3'
# ...service prarmeters

networks:
default:
external: true
name: npm

 docker-compose.override.yml

version: '3'
services:
mariadb:
image: mariadb:10.11.tagDesc

 

 法2

 Dockerfile

#……找到最底下 
EXPOSE 3306
USER "1000" # 加上這個…this works but volume files owned by user_name.root
CMD ["mariadbd"]

 

 docker-compose.yml

version: '3'
services:
mariadb:
#image: mariadb:10.11
container_name: mariadb
build:
args:
user: "1000"
uid: 1000 #seems not needed
gid: 1000 #seems not working
dockerfile: ./10.11/Dockerfile
#user: 1000:1000 #makes volume own by root.root
environment:
MYSQL_ROOT_PASSWORD: xxxxx
MYSQL_DATABASE: xxxxx
MYSQL_USER: xxxxx
MYSQL_PASSWORD: xxxxx
TZ: Asia/Taipei
logging:
driver: syslog
options:
tag: "{{.DaemonName}}(image={{.ImageName}};name={{.Name}};id={{.ID}})"
# networks:
# - backend
restart: unless-stopped
#restart: on-failure
volumes:
- ${PWD}/mariadb:/var/lib/mysql
#version: '3'
# ...service prarmeters

networks:
default:
external: true
name: npm

 

留言

這個網誌中的熱門文章

使用 Excel 計算2個地點之間的直線距離

LINE 儲存的檔案傳到 email 不方便 很不方便 非常不方便 但是有解的筆記

合併列印標籤漏印