
一般化する
システムテンプレートユニットがある場合、特定のテンプレート[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
私は次の手順を実行しました。
- まず、デバイス検索パスディレクトリのルートなどの挿入ディレクトリを作成します
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ディレクトリからサービスを追加および削除したりするときは、このタスクを再実行する必要があります。