Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

A Red Hat training course is available for RHEL 8

12.3. Podman を使用した systemd ユニットファイルの自動生成

デフォルトで、Podman は既存のコンテナーまたは Pod のユニットファイルを生成します。podman generate systemd --new を使用して、移植可能な別の systemd ユニットファイルを生成できます。--new フラグでは、コンテナーの作成、起動、削除を行うユニットファイルを生成するように Podman に指示します。

手順

  1. システムで使用するイメージをプルします。たとえば、httpd-24 イメージをプルするには、以下を実行します。

    # podman pull registry.access.redhat.com/ubi8/httpd-24
  2. オプション:システムで利用可能なイメージの一覧を表示します。

    # podman images
    REPOSITORY                                TAG                  IMAGE ID      CREATED        SIZE
    registry.access.redhat.com/ubi8/httpd-24  latest               8594be0a0b57  2 weeks ago    462 MB
  3. httpd コンテナーを作成します。

    # podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi8/httpd-24
    cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1
  4. オプション:コンテナーが作成されたことを確認します。

    # podman ps -a
    CONTAINER ID  IMAGE                                            COMMAND               CREATED        STATUS      PORTS                   NAMES
    cdb9f981cf14  registry.access.redhat.com/ubi8/httpd-24:latest  /usr/bin/run-http...  5 minutes ago  Created     0.0.0.0:8080->8080/tcp  httpd
  5. httpd コンテナーの systemd ユニットファイルを生成します。

    # podman generate systemd --new --files --name httpd
    /root/container-httpd.service
  6. 生成された container-httpd.service systemd ユニットファイルの内容を表示します。

    # cat /root/container-httpd.service
    # container-httpd.service
    # autogenerated by Podman 3.3.1
    # Wed Sep  8 20:41:44 CEST 2021
    
    [Unit]
    Description=Podman container-httpd.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network-online.target
    After=network-online.target
    RequiresMountsFor=%t/containers
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    TimeoutStopSec=70
    ExecStartPre=/bin/rm -f %t/%n.ctr-id
    ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --sdnotify=conmon --cgroups=no-conmon --rm -d --replace --name httpd -p 8080:8080 registry.access.redhat.com/ubi8/httpd-24
    ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
    ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
    Type=notify
    NotifyAccess=all
    
    [Install]
    WantedBy=multi-user.target default.target
    注記

    --new オプションを使用してユニットファイルを生成した場合には、コンテナーと Pod の存在は想定されていません。したがって、サービスの起動時に (ExecStart の行を参照)、podman start コマンドではなく、podman run コマンドを実行します。たとえば、Generating a systemd unit file using Podmanのセクションを参照してください。

    • podman run コマンドは、以下のコマンドラインオプションを使用します。

      • --conmon-pidfile オプションは、ホストで実行している conmon プロセスのプロセス ID を格納するパスを指します。conmon プロセスはコンテナーと同じ終了ステータスで終了するので、systemd は正しいサービスステータスを報告して必要に応じてコンテナーを再起動できます。
      • --cidfile オプションは、コンテナー ID を格納するパスを指します。
      • %t は、ランタイムディレクトリーのルートへのパスです (例: /run/user/$UserID)。
      • %n は、サービスの完全な名前です。
  7. /usr/lib/systemd/system にユニットファイルをコピーして root ユーザーとしてインストールします。

    # cp -Z container-httpd.service /etc/systemd/system
  8. container-httpd.service を有効にして起動します。

    # systemctl daemon-reload
    # systemctl enable --now container-httpd.service
    Created symlink /etc/systemd/system/multi-user.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.
    Created symlink /etc/systemd/system/default.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.

検証手順

  • container-httpd.service のステータスを確認します。

    # systemctl status container-httpd.service
        ● container-httpd.service - Podman container-httpd.service
           Loaded: loaded (/etc/systemd/system/container-httpd.service; enabled; vendor preset: disabled)
           Active: active (running) since Tue 2021-08-24 09:53:40 EDT; 1min 5s ago
             Docs: man:podman-generate-systemd(1)
          Process: 493317 ExecStart=/usr/bin/podman run --conmon-pidfile /run/container-httpd.pid --cidfile /run/container-httpd.ctr-id --cgroups=no-conmon -d --repla>
          Process: 493315 ExecStartPre=/bin/rm -f /run/container-httpd.pid /run/container-httpd.ctr-id (code=exited, status=0/SUCCESS)
         Main PID: 493435 (conmon)
        ...