Thay đổi owner của mount volume khi dev với Docker

Chạy docker mount volume trong môi trường dev (Nguồn ảnh: blaize.net)

Tình huống

Khi dev với Docker, thường thì chúng ta sẽ mount thư mục code vào Docker Container. Khi thay đổi code ở máy dev thì trong code trong container thay đổi luôn, không cần build lại.

Vấn đề

  • Với máy Linux, user ở máy dev thường có user_id = 1000.
  • Trong container, thường chạy với user root, có user_id khác 1000.

→ Gặp vấn đề: ở máy dev không sửa được file, gặp lỗi “Permission Denied” vì không phải là owner của file source code.

Ví dụ: Khi chạy container wordpress, thư mục /var/www/html có owner là www-data:www-data

Khi ở máy dev, thực hiện sửa file sẽ bị lỗi “Permission Denied

Giải pháp

Thực hiện đổi user_id của user trong container, sao cho giống với user_id của máy dev. Cần build Docker Image theo cách sau:

  1. Sử dụng biến MAP_USERID để có thể truyền giá trị biến phù hợp.
  2. Khi chạy Docker Container, câu lệnh đầu tiên được chạy là docker-entrypoint.sh, sẽ thực hiện việc sửa user_id và chown thư mục phù hợp.

Ví dụ: docker-entrypoint.sh

Khi chạy với docker-compose, có thể dùng docker-compose.yml có dạng sau:

Ngoài ra, có thể sử dụng kết hợp gosu và chạy process trong container dưới quyền user thường, không phải user root để đảm bảo vấn đề security.

Tài liệu tham khảo

  1. https://github.com/cuongtransc/docker-training
  2. https://github.com/cuongtransc/docker-image-tmpl
  3. https://github.com/tianon/gosu
The following two tabs change content below.

Cuong Tran

Think big, start small, and don't walk alone.