người dùng systemd không thể có được khả năng của nhóm người dùng


8

Tôi đã thêm một người dùng không root trong nhóm docker và một dịch vụ khác chạy khi người dùng không root này kết nối với daemon docker. nhưng dịch vụ không thể hoạt động. Tôi làm một ví dụ thử nghiệm cho điều này:

root@# systemctl start docker.service 
root@# gpasswd -a tiger docker

tạo một dịch vụ systemd trong tiger:

[Service]
ExecStart=/home/tiger/connectdocker
Restart=always
StartLimitInterval=0
Delegate=true
KillMode=process
[Install]
WantedBy=default.target

các /home/tiger/connectdockernhư thế này:

docker run -itd busybox 2> connectdocker.log

bắt đầu dịch vụ này:

tiger@# systemctl --user enable connectdocker.service
tiger@# systemctl --user start connectdocker.service

và kết quả:

Thu Jul 21 00:59:15 CST 2016
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

nhưng tôi có thể kết nối với docker.sock với tiger:

tiger@# docker run -itd busybox
997e99f959cfd5500319935ec17677775da9d367d203a11efef8b42161c3ee64

để chứng minh rằng, tôi thay đổi /var/run/docker.socknhóm từ docker thành tiger và dịch vụ kết nối có thể kết nối với docker daemon.

thay đổi /var/run/docker.sock:

ls -l /run/docker.sock
srw-rw---- 1 root docker 0 Jul 21 00:33 /run/docker.sock

đến:

ls -l /run/docker.sock
srw-rw---- 1 root tiger 0 Jul 21 00:33 /run/docker.sock

1
Bạn đã bao giờ làm việc này?
Mark Stosberg

Câu trả lời:


1

Bạn nên sử dụng User=chỉ thị trong systemddịch vụ của bạn .

Người dùng =, Nhóm =

Đặt người dùng UNIX hoặc nhóm mà các quy trình được thực hiện tương ứng. Lấy một tên người dùng hoặc nhóm hoặc ID số làm đối số. Đối với các dịch vụ hệ thống (các dịch vụ do người quản lý dịch vụ hệ thống điều hành, tức là được quản lý bởi PID 1) và cho các dịch vụ người dùng của người dùng root (các dịch vụ được quản lý bởi phiên bản gốc của systemd --user), mặc định là "root", nhưng User = may được sử dụng để chỉ định một người dùng khác. Đối với dịch vụ người dùng của bất kỳ người dùng nào khác, việc chuyển đổi danh tính người dùng không được phép, do đó cài đặt hợp lệ duy nhất là cùng một người dùng mà trình quản lý dịch vụ của người dùng đang chạy. Nếu không có nhóm nào được đặt, nhóm mặc định của người dùng sẽ được sử dụng. Cài đặt này không ảnh hưởng đến các lệnh có dòng lệnh được thêm tiền tố "+".

https://www.freedesktop.org/software/systemd/man/systemd.exec.html#User=

Tôi cũng sẽ khuyên bạn nên chuyển tập lệnh của bạn từ một thư mục chính sang một đường dẫn chuẩn, giống như /usr/local/binhoặc một cái gì đó tương tự.

Bạn cũng nên đảm bảo thứ tự của bạn connectdocker.servicebằng cách cung cấp cho nó After=docker.serviceRequires=docker.service. Vì nó được viết nên connectdocker.servicecó lẽ đang cố gắng bắt đầu cùng khoảng thời gian với docker.service, và bạn cần phải đợi docker.serviceđể được lên trước khi bạn có thể kết nối với nó.

Yêu cầu =

Định cấu hình phụ thuộc yêu cầu vào các đơn vị khác. Nếu đơn vị này được kích hoạt, các đơn vị được liệt kê ở đây cũng sẽ được kích hoạt. Nếu một trong các đơn vị khác bị vô hiệu hóa hoặc kích hoạt không thành công, đơn vị này sẽ bị hủy kích hoạt. Tùy chọn này có thể được chỉ định nhiều lần hoặc nhiều đơn vị phân tách không gian có thể được chỉ định trong một tùy chọn trong đó trường hợp phụ thuộc yêu cầu cho tất cả các tên được liệt kê sẽ được tạo. Lưu ý rằng các phụ thuộc yêu cầu không ảnh hưởng đến thứ tự dịch vụ được bắt đầu hoặc dừng. Điều này phải được cấu hình độc lập với các tùy chọn After = hoặc Before =. Nếu một đơn vị foo.service yêu cầu một đơn vị bar.service như được định cấu hình với Yêu cầu = và không có thứ tự nào được định cấu hình với After = hoặc Before =, thì cả hai đơn vị sẽ được khởi động đồng thời và không có bất kỳ độ trễ nào giữa chúng nếu foo.service được kích hoạt. Thường

Lưu ý rằng loại phụ thuộc này không có nghĩa là đơn vị khác luôn phải ở trạng thái hoạt động khi thiết bị này đang chạy. Cụ thể: không kiểm tra điều kiện (chẳng hạn như conditionPathExists =, conditionPathExists =, Tiết - xem bên dưới) không làm cho công việc bắt đầu của một đơn vị có Yêu cầu = phụ thuộc vào đơn vị đó không thành công. Ngoài ra, một số loại đơn vị có thể tự hủy kích hoạt (ví dụ: quy trình dịch vụ có thể quyết định thoát ra một cách sạch sẽ hoặc người dùng có thể rút phích cắm thiết bị), không được truyền đến các đơn vị có Yêu cầu = phụ thuộc. Sử dụng loại phụ thuộc BindsTo = cùng với After = để đảm bảo rằng một đơn vị có thể không bao giờ ở trạng thái hoạt động mà không có đơn vị cụ thể khác cũng ở trạng thái hoạt động (xem bên dưới).

Lưu ý rằng các phụ thuộc của loại này cũng có thể được cấu hình bên ngoài tệp cấu hình đơn vị bằng cách thêm liên kết tượng trưng vào thư mục .requires / đi kèm với tệp đơn vị. Để biết chi tiết, xem ở trên.

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Requires=

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#B Before =

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.