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
留言
張貼留言