systemdテンプレートインスタンスをシンボリックリンクするか、別名を指定するには?

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

-ダッシュ()を含むセル名と見なされる属性を試しました。アーチLinuxのマンページ、そしてそれはうまくいきました:

また、ダッシュ()を含むユニット名の場合は、ダッシュの後の-すべてのユニット名を繰り返しカットして作成されたディレクトリセットも検索されます。特に、ユニット名の場合は、通常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

私は次の手順を実行しました。

  1. まず、デバイス検索パスディレクトリのルートなどの挿入ディレクトリを作成しますdocker-.service.d(例/etc/systemd/system:)。
  2. 次に、作成したドロップディレクトリに似たファイルを作成し、.conf指定子を使用してそのファイルにセクションを作成します。docker.conf[Unit][Service]%j

%j-: プレフィックス名の最後と最後の間の文字列です。

  1. 次に、ルート検索パスの挿入ディレクトリの横に、必要な各サービスのサービスファイルを作成します。[Install]optionsを使用してエイリアスが明示的に決定された部分のみを含める必要がありますAlias。 (この部分もファイルに入れようとしましたが、サービスが起動すると見つかりません。)注:これらのサービスの名前は制約を満たす必要がありますdocker.conf[Install]
  2. これで、作成したすべてのサービスに対して実行するだけで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サービスファイルの生成を使用します。ファイルを掻き集める

解決策

これは次のように仮定します。ルビーホストシステムにインストールされます。

  1. 存在することを確認してください。このファイルでサービス名として使用される変数(例: "nginx")。/etc/systemd/system/[email protected]%i

  2. 作成: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
    
  3. rakeディレクトリから実行します/var/docker-compose/

/etc/systemd/system/nginx.serviceこれは、テンプレートファイルに基づいて各サービスに対して別々の単位ファイルを明示的に生成します。/etc/systemd/system/[email protected]

利点:

  • systemctl start nginx働く
  • systemctl enable nginx働く
  • タブ完成が機能します

欠点:

  • rakeテンプレートファイルを変更したり、docker-composeディレクトリからサービスを追加および削除したりするときは、このタスクを再実行する必要があります。

関連情報