概括
如果我有一个 systemd 模板单元[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
-
我尝试根据以下内容使用包含破折号 ( ) 的单元名称所考虑的属性archlinux 手册页,并且它起作用了:
此外,对于包含破折号( )的单元名称
-
,也会搜索通过重复截断所有破折号后的单元名称而生成的目录集。具体来说,对于单位名称,foo-bar-baz.service
不仅会搜索常规的插入目录foo-bar-baz.service.d/
,还会搜索foo-bar-.service.d/
和foo-.service.d/
。
作为手册页的另一条注释:
除了单元文件之外,还可能存在
foo.service
“插入”目录。此目录中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]
使用选项显式确定其别名的部分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 目录添加/删除服务时,必须重新运行。