일반화하다
시스템 템플릿 단위가 있는 경우 [email protected]
특정 템플릿 인스턴스에 대한 별칭(예: bar.service
바로가기) 을 심볼릭 링크하거나 생성하려면 어떻게 해야 합니까 [email protected]
?
배경
docker-compose로 실행되는 여러 서비스가 있습니다.
/var/docker-compose/nginx/docker-compose.yml
/var/docker-compose/nextcloud/docker-compose.yml
/var/docker-compose/diaspora/docker-compose.yml
systemd를 사용하여 이러한 서비스를 관리하기 위해 다음을 사용했습니다.템플릿 단위 사용 방법모든 docker-compose 단위 파일이 거의 동일하므로 중복을 피하기 위해.
# /etc/systemd/system/[email protected]
[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service
[Service]
Restart=always
WorkingDirectory=/var/docker-compose/%i
# Remove old containers, images and volumes
ExecStartPre=/usr/bin/docker-compose down -v
ExecStartPre=/usr/bin/docker-compose rm -fv
ExecStartPre=-/bin/bash -c 'docker volume ls -qf "name=%i_" | xargs docker volume rm'
ExecStartPre=-/bin/bash -c 'docker network ls -qf "name=%i_" | xargs docker network rm'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=%i_*" | xargs docker rm'
# Compose up
ExecStart=/usr/bin/docker-compose up %i
# Compose down, remove containers and volumes
ExecStop=/usr/bin/docker-compose down -v
[Install]
WantedBy=multi-user.target
표적
이제 개별 서비스에 별칭이나 심볼릭 링크를 제공하여 서비스를 시작하고 중지하는 데 걸리는 시간을 단축하고 싶습니다.
대신에
systemctl stop docker-compose@nginx
입력하고 싶은 항목:
systemctl stop nginx
작동하지 않는 것
심볼릭 링크를 생성하려고 합니다.
cd /etc/systemd/system ln -s [email protected] nginx.service
하지만
nginx.service
시작하거나 중지하려고 할 때 찾을 수 없습니다.템플릿 단위에서 별칭을 정의해 보았습니다.
[Install] Alias=%i.service
그러나 내가 올바르게 이해한다면 이것은허용되지 않음이것은 나에게 효과가 없습니다.
기본 단위 파일을 "가져오기" 또는 "요구"하고 해당 줄을 재정의하는 방법을 찾지 못했습니다
WorkingDirectory
. 그런 다음 다음과 같은 별도의 짧은 파일을 만들 수 있습니다.# /etc/systemd/system/nginx.service [email protected] WorkingDirectory=/var/docker-compose/nginx
감사해요!
답변1
-
대시( )가 포함된 셀 이름으로 간주되는 속성을 사용해 보았습니다.아치리눅스 맨페이지, 그리고 그것은 작동했습니다 :
또한 대시( )가 포함된 유닛 이름의 경우
-
대시 뒤의 모든 유닛 이름을 반복적으로 잘라서 생성된 디렉터리 집합도 검색됩니다. 특히, 단위 이름의 경우foo-bar-baz.service
일반 삽입 디렉터리뿐만 아니라 및foo-bar-baz.service.d/
도 검색됩니다 .foo-bar-.service.d/
foo-.service.d/
매뉴얼 페이지의 또 다른 참고 사항은 다음과 같습니다.
유닛 파일 외에도
foo.service
"insert" 디렉터리가 있을 수 있습니다. 이 디렉토리에foo.service.d/
접미사가 있는 모든 파일은.conf
영숫자 순서로 병합되고 기본 장치 파일 자체 다음에 구문 분석됩니다.
/etc/systemd/system/
내 작업 예에서 이것은 내 유닛 검색 경로(예: ) 의 루트에 있는 파일의 최종 구조입니다 .
│ docker-a.service
│ docker-b.service
│ docker-c.service
│
└─── docker-.service.d
│ docker.conf
│
또한 docker.conf
파일은 docker-a.service
다음과 같습니다.
# /etc/systemd/system/docker-.service.d/docker.conf
[Unit]
Description=We named our service [%j] service
After=network.target
[Service]
WorkingDirectory=/home/arman/%j
ExecStartPre=/bin/bash -c 'echo "The prestart command for %j was done!" >> log.txt'
ExecStart=/bin/bash -c 'echo "The start command for %j was done!" >> log.txt'
# /etc/systemd/system/docker-a.service
[Install]
WantedBy=multi-user.target
Alias=a.service
나는 다음 단계를 수행했습니다.
- 먼저, 장치 검색 경로 디렉터리의 루트와 같은 삽입 디렉터리를 만듭니다
docker-.service.d
(예/etc/systemd/system
: ). - 그런 다음 생성한 드롭 디렉터리와 유사한 파일을 생성
.conf
하고 지정자를 사용하여 해당 파일에 및 섹션을 작성합니다.docker.conf
[Unit]
[Service]
%j
%j
-
: 접두사 이름의 마지막과 끝 사이의 문자열입니다.
- 그런 다음 루트 검색 경로의 삽입 디렉터리 옆에 원하는 각 서비스에 대한 서비스 파일을 만듭니다.
[Install]
options 를 사용하여 별칭이 명시적으로 결정된 부분 만 포함해야 합니다Alias
. (이 부분도 파일에 넣으려고 했는데 서비스가 시작되면 찾을 수 없습니다.) 참고로 이러한 서비스의 이름은 제약 조건을 충족해야 합니다docker.conf
.[Install]
- 이제 생성한 모든 서비스에 대해 실행하면
systemctl enable docker-{alias}.service
그냥 통과할 수 있습니다{alias}
.
답변2
명령을 있는 그대로 수락하고 명령줄에서 bash 별칭을 사용하는 방법:
문서~/.bash_aliases
alias nginx-stop="systemctl stop docker-compose@nginx"
alias nginx-start="systemctl start docker-compose@nginx"
alias nextcloud-stop="systemctl stop docker-compose@nextcloud"
alias nextcloud-start="systemctl start docker-compose@nextcloud"
alias diaspora-stop="systemctl stop docker-compose@diaspora"
alias diaspora-start="systemctl start docker-compose@diaspora"
답변3
다음 솔루션은 systemd에 기본이 아니지만 systemd 서비스 파일 생성을 사용합니다.파일을 긁어 모으다.
해결책
이는 다음과 같이 가정합니다.루비호스트 시스템에 설치됩니다.
존재하는지 확인하십시오. 이 파일에서 서비스 이름으로 사용되는 변수입니다(예: "nginx").
/etc/systemd/system/[email protected]
%i
생성 :
Rakefile
/var/docker-compose/
# /var/docker-compose/Rakefile TEMPLATE_SERVICE_FILE = "/etc/systemd/system/[email protected]" task :systemd_units do print "Creating systemd units:\n" Dir.glob("/var/docker-compose/*/docker-compose.yml").each do |compose_file| service_name = compose_file.split("/")[-2] unit_file = "/etc/systemd/system/#{service_name}.service" unit_file_content = File.read TEMPLATE_SERVICE_FILE unit_file_content.gsub! "%i", service_name File.write unit_file, unit_file_content print "#{unit_file}\n" end end
rake
디렉토리에서 실행하십시오/var/docker-compose/
.
/etc/systemd/system/nginx.service
이는 템플릿 파일을 기반으로 각 서비스에 대해 별도의 단위 파일을 명시적으로 생성합니다 ./etc/systemd/system/[email protected]
이점:
systemctl start nginx
일하다systemctl enable nginx
일하다- 탭 완성이 작동합니다
결점:
rake
템플릿 파일을 변경하거나 docker-compose 디렉터리에서 서비스를 추가/제거할 때 이 작업을 다시 실행해야 합니다.