Permission không bị ảnh hưởng bởi user ngừoi chạy docker-compose up (như ban đầu mình nghĩ), mà ban đầu bên ngoài nó có permission nào thì mount vào trong container sẽ có permission như vậy.
Mình cũng chưa bao giờ dùng tới biến môi trường CI_PROJECT_DIR.
Lúc chạy bạn cứ làm sao chắc chắn là folder - nơi bạn mount volume có quyền bằng với user trong container là được. Do vậy dùng đường dẫn tương đối hay tuyệt đối cũng chỉ là tuỳ chọn
Và nếu bạn vẫn không hiểu thì mình rất sẵn lòng setup 1 pipeline demo về việc này (dùng đường dẫn tương đối)
Bạn đang chạy gitlab runner với user james (1000:1000) và container db cũng set user 1000:1000 ...
@thungrac43 thì tất nhiên rồi bạn, đây không phải là điều kiện lý tưởng mà là điều kiện cần mà mình đã nói rất rõ ở bài chạy container với non root user đó là user trong container phải có quyền bằng với user môi trường ngoài - người sở hữu folder mount volume.
@duong.manh.hoang
cảm ơn bạn. Mình đang ko hỏi về cách override.
Câu hỏi của mình là khi dùng hàm attempt. Thì có cách nào thêm condition cho nó, để nó check theo câu truy vấn kia ko
where email = $email AND password = $pw AND role in ('Admin', 'Admod')
Và
where email = $email AND password = $pw AND role != 'ABC'
@maitrungduc1410 nếu bạn dùng đường dẫn tương đối. ở job jest tại bước
docker-compose up -d
thì container db sẽ không khởi động được vì ko có permission trên thư mục /data/db
Bạn đang chạy gitlab runner với user james (1000:1000) và container db cũng set user 1000:1000 là điều kiện lý tưởng nên mới được. Bạn thử tạo 1 user mới khác james và chạy db với user này sẽ lỗi ngay.
Cảm ơn bạn đã góp ý nhưng mình chưa rõ ý của bạn lắm. Bạn có thể giúp đỡ mình chỉ ra chỗ sai để mình update bài viết không?.
Những gì mình nghiên cứu được là một coroutine được phóng trong GlobalScope, nó sử dụng Dispatchers.Default tức là sử dụng shared background pool of threads nên mình viết là // chạy một coroutine trên background thread. Có thể mình bị miss ở đâu đó. Mong bạn chỉ dẫn thêm.
The default dispatcher that is used when coroutines are launched in GlobalScope is represented by Dispatchers.Default and uses a shared background pool of threads, so launch(Dispatchers.Default) { ... } uses the same dispatcher as GlobalScope.launch { ... }.
Khi chạy CICD, Gitlab Runner sẽ tự động clone code về folder hiện tại mà nó làm việc, ta không cần biết chính xác folder đó tên là gì, vì mount volume ta dùng đường dẫn tương đối trỏ về folder hiện tại.
Ở docker-compose.yml khi mount volume, thì chỉ đường dẫn ở trong container (phía bên phải) phải là đường dẫn tuyệt đối, còn đường dẫn phía môi trường ngoài thì có thể là tương đối hoặc tuyệt đối:
volumes:
- /home/docker/tmp/.docker/data/db:/data/db # tuyệt đối
- .docker/data/db:/data/db # tương đối
Mình làm về lĩnh vực này lâu rồi nên thấy cái gọi là chặn tải file thực ra là chống chia sẻ public file tĩnh, chỉ có ai thanh toán mới dùng được. Để thực hiện nó thì link phải có chữ ký và có thời gian sống, mỗi phiên người dùng sẽ được tạo mới và hết hạn sau một thời gian đặt trước.
Còn chống người dùng download video thì chịu, mỗi khi họ thanh toán và xem được video thì có thể bắt được luồng video, trình duyệt nào cũng có hàng tá plugin cho phép lưu video đang xem, ai không tin đưa link và tài khoản trang bất kỳ mình download về cho.
THẢO LUẬN
thank
@thungrac43, bạn đọc lại phần cuối của bài Docker non-root nhé,
Permission không bị ảnh hưởng bởi user ngừoi chạy
docker-compose up(như ban đầu mình nghĩ), mà ban đầu bên ngoài nó có permission nào thì mount vào trong container sẽ có permission như vậy.Mình cũng chưa bao giờ dùng tới biến môi trường
CI_PROJECT_DIR.Lúc chạy bạn cứ làm sao chắc chắn là folder - nơi bạn mount volume có quyền bằng với user trong container là được. Do vậy dùng đường dẫn tương đối hay tuyệt đối cũng chỉ là tuỳ chọn
Và nếu bạn vẫn không hiểu thì mình rất sẵn lòng setup 1 pipeline demo về việc này (dùng đường dẫn tương đối)
@maitrungduc1410 trong bài docker non root bạn chạy docker-compose up tại thư mục đã tạo sẵn. Bạn thử inspect container sẽ thấy tham số
CI_PROJECT_DIR chính là thư mục bạn đang đứng. Khi đó bạn đã set permission cho folder này rồi. Nên user trong db có thể truy cập được.
Tuy vậy trong bài này bạn chạy docker-compose up qua gitlab-runner user (thường là root). Khi đó
CI_PROJECT_DIR="/builds/maitrungduc1410/cicd-auto-deploy"
và user trong db ko có quyền truy cập vào đây => service không khởi động được.
Cảm ơn em
Sư phụ xin hãy nhận đệ tử một lạy
@thungrac43 thì tất nhiên rồi bạn, đây không phải là điều kiện lý tưởng mà là điều kiện cần mà mình đã nói rất rõ ở bài chạy container với non root user đó là user trong container phải có quyền bằng với user môi trường ngoài - người sở hữu folder mount volume.
và nó làm bạn Khôi lầm tưởng là Viết tay :v
@ngankim attempt thì thêm được điều kiện nhưng phủ định thì theo mình nghĩ là không
Good job
@duong.manh.hoang cảm ơn bạn. Mình đang ko hỏi về cách override.
Câu hỏi của mình là khi dùng hàm attempt. Thì có cách nào thêm condition cho nó, để nó check theo câu truy vấn kia ko
@maitrungduc1410 nếu bạn dùng đường dẫn tương đối. ở job jest tại bước
thì container db sẽ không khởi động được vì ko có permission trên thư mục /data/db
Bạn đang chạy gitlab runner với user james (1000:1000) và container db cũng set user 1000:1000 là điều kiện lý tưởng nên mới được. Bạn thử tạo 1 user mới khác james và chạy db với user này sẽ lỗi ngay.
sẽ sớm có nhé bạn :v
Với các bạn nhà nghèo như mình có thể triển khai demo bằng máy ảo (vmware) như sau:
Cảm ơn bạn đã góp ý nhưng mình chưa rõ ý của bạn lắm. Bạn có thể giúp đỡ mình chỉ ra chỗ sai để mình update bài viết không?.
Những gì mình nghiên cứu được là một coroutine được phóng trong GlobalScope, nó sử dụng Dispatchers.Default tức là sử dụng shared background pool of threads nên mình viết là
// chạy một coroutine trên background thread. Có thể mình bị miss ở đâu đó. Mong bạn chỉ dẫn thêm.Nguồn: https://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html
@thungrac43
Sao bạn phải phức tạp hoá vấn đề lên vậy
Khi chạy CICD, Gitlab Runner sẽ tự động clone code về folder hiện tại mà nó làm việc, ta không cần biết chính xác folder đó tên là gì, vì mount volume ta dùng đường dẫn tương đối trỏ về folder hiện tại.
Ở
docker-compose.ymlkhi mount volume, thì chỉ đường dẫn ở trong container (phía bên phải) phải là đường dẫn tuyệt đối, còn đường dẫn phía môi trường ngoài thì có thể là tương đối hoặc tuyệt đối:Cả 2 cách đều được.
GlobalScope.launch { // chạy một coroutine trên background thread
Mục 2 "Hai cách để xóa bỏ tất cả các phần tử của mảng (đưa mảng về rỗng)" có thể dùng thêm phương thức splice(0,arr.length) nữa ạ.
restart mysql la dc do ban
Mình làm về lĩnh vực này lâu rồi nên thấy cái gọi là chặn tải file thực ra là chống chia sẻ public file tĩnh, chỉ có ai thanh toán mới dùng được. Để thực hiện nó thì link phải có chữ ký và có thời gian sống, mỗi phiên người dùng sẽ được tạo mới và hết hạn sau một thời gian đặt trước. Còn chống người dùng download video thì chịu, mỗi khi họ thanh toán và xem được video thì có thể bắt được luồng video, trình duyệt nào cũng có hàng tá plugin cho phép lưu video đang xem, ai không tin đưa link và tài khoản trang bất kỳ mình download về cho.
@Nobita1234 không có gì, nếu có thắc mắc gì bạn có thể tạo questions trên viblo để mọi người cùng discuss