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}

おすすめ記事