루트가 아닌 사용자를 docker 그룹에 추가하고 루트가 아닌 사용자가 docker 데몬에 연결되면 다른 서비스를 실행했습니다. 하지만 서비스가 작동하지 않습니다. 이에 대한 테스트 예제를 만들었습니다.
root@# systemctl start docker.service
root@# gpasswd -a tiger docker
Tiger에서 systemd 서비스를 만듭니다.
[Service]
ExecStart=/home/tiger/connectdocker
Restart=always
StartLimitInterval=0
Delegate=true
KillMode=process
[Install]
WantedBy=default.target
이와 같이 /home/tiger/connectdocker
:
docker run -itd busybox 2> connectdocker.log
이 서비스를 시작하세요:
tiger@# systemctl --user enable connectdocker.service
tiger@# systemctl --user start connectdocker.service
결과:
Thu Jul 21 00:59:15 CST 2016
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
하지만 Tiger를 사용하여 docker.sock에 연결할 수 있습니다.
tiger@# docker run -itd busybox
997e99f959cfd5500319935ec17677775da9d367d203a11efef8b42161c3ee64
이를 증명하기 위해 /var/run/docker.sock
그룹을 docker에서 Tiger로 변경했고 connectdocker 서비스는 docker 데몬에 연결할 수 있습니다.
변화 /var/run/docker.sock
:
ls -l /run/docker.sock
srw-rw---- 1 root docker 0 Jul 21 00:33 /run/docker.sock
도착하다:
ls -l /run/docker.sock
srw-rw---- 1 root tiger 0 Jul 21 00:33 /run/docker.sock
답변1
User=
서비스에서 이 지시문을 사용해야 합니다 systemd
.
사용자=,그룹=
프로세스가 실행되는 UNIX 사용자 또는 그룹을 각각 설정합니다. 단일 사용자나 그룹 이름 또는 숫자 ID를 인수로 사용합니다. 시스템 서비스(시스템 서비스 관리자가 실행하는 서비스, 즉 PID 1로 관리되는 서비스) 및 루트에 대한 사용자 서비스(루트의 systemd --user 인스턴스로 관리되는 서비스)의 경우 기본값은 "root"이지만 User=를 사용하여 다음 작업을 수행할 수 있습니다. 다른 사용자를 지정합니다. 다른 사용자의 사용자 서비스에 대해서는 사용자 ID 전환이 허용되지 않으므로 유효한 설정은 사용자 서비스 관리자를 실행하는 동일한 사용자에 대한 것뿐입니다. 그룹이 설정되지 않은 경우 사용자의 기본 그룹이 사용됩니다. 이 설정은 명령줄 앞에 "+"가 붙은 명령에는 영향을 주지 않습니다.
https://www.freedesktop.org/software/systemd/man/systemd.exec.html#User=
또한 스크립트를 홈 디렉터리에서 /usr/local/bin
.
connectdocker.service
After=docker.service
또한 및 를 제공하여 주문을 확인 해야 합니다 Requires=docker.service
. 쓰여진 대로, connectdocker.service
부팅과 거의 동시에 부팅을 시도할 수 있으며 , 연결하기 전에 부팅이 될 때까지 docker.service
기다려야 합니다 .docker.service
필요=
다른 단위에 대한 요구 사항 종속성을 구성합니다. 이 장치가 활성화되면 여기에 나열된 장치도 활성화됩니다. 다른 장치 중 하나가 비활성화되거나 활성화되지 않으면 이 장치가 비활성화됩니다. 이 옵션은 여러 번 지정하거나 하나의 옵션에서 공백으로 구분된 여러 단위로 지정할 수 있으며, 이 경우 나열된 모든 이름에 대해 요구 사항 종속성이 생성됩니다. 수요 종속성은 서비스가 시작되거나 중지되는 순서에 영향을 미치지 않습니다. 이는 After= 또는 Before= 옵션을 사용하여 독립적으로 구성해야 합니다. foo.service 장치에 Requires=로 구성된 bar.service 장치가 필요하고 After= 또는 Before=로 구성된 순서가 없는 경우 foo.service가 활성화되면 두 장치 사이에 지연 없이 동시에 시작됩니다. 일반적으로 실패한 서비스에 대해 시스템을 더욱 강력하게 만들려면 Requires= 대신 Wants=를 사용하는 것이 좋습니다.
이 종속성 유형은 이 장치가 실행 중일 때 다른 장치가 항상 활성화되어야 한다는 의미는 아닙니다. 특히: 실패한 조건 검사(예: ConditionPathExists=, ConditionPathExists=, ... — 아래 참조)는 Requires= 종속성을 가진 장치의 시작 작업이 실패하도록 만들지 않습니다. 또한 일부 장치 유형은 자체적으로 비활성화될 수 있습니다(예: 서비스 프로세스가 완전히 종료되도록 결정하거나 사용자가 장치의 플러그를 뽑을 수 있음). 이는 Requires= 종속성을 가진 장치에 전파되지 않습니다. After=와 함께 BindsTo= 종속성 유형을 사용하면 특정 다른 유닛도 활성화되지 않으면 해당 유닛이 활성화되지 않도록 할 수 있습니다(아래 참조).
이러한 유형의 종속성은 장치 파일과 함께 제공되는 .requires/ 디렉터리에 기호 링크를 추가하여 장치 구성 파일 외부에서 구성할 수도 있습니다. 자세한 내용은 위를 참조하세요.
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Requires=
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=