Running containers from systemd
¶
When you embed a container in an operating system (OS) image, you can start the container manually in the booted system with the podman run
command. However, the container does not start automatically at boot time. To configure a container to start at boot time, you must create a
systemd
service that starts the container at the right time, in the right way.
Quadlet is a tool that optimally runs Podman containers under systemd
. Rather than creating the systemd
service manually, use Quadlet to
automatically generate the corresponding systemd
service unit file at boot time. In this example, create Quadlet files for the sample applications
that are available in the AutoSD sample apps repository. If you want to use your own
containerized software, see the Podman documentation for more information
about creating your own Quadlet configuration files.
Prerequisites
- A container image available inside your OS image at
localhost/auto-apps
embedded according to Embedding local containerized applications in the root partition - A custom manifest file, such as the manifest file you created in Embedding RPM packages from local storage into the AutoSD image
- You have installed the
automotive-image-builder
tool. For more information, see Installing Automotive Image Builder.
Procedure
-
Create Quadlet unit files for the
radio-service
andengine-service
services in your sample applicationauto-apps
:radio.container file[Unit] Description=Demo radio service container Requires=routingmanagerd.socket After=routingmanagerd.socket Wants=engine.service [Container] Image=localhost/auto-apps Exec=/usr/bin/radio-service Volume=/run/vsomeip:/run/vsomeip [Service] Restart=always [Install] WantedBy=multi-user.target
-
Create an automotive image builder manifest named
quadlet_radio_engine.aib.yml
that contains the following code, which copies the Quadlet unit files to the/etc/containers/systemd/
directory during the OS image build process:Manifest configuration to copy Quadlet unit files# Example manifest building an image with, pre-installed, a container image # hosted in a remote container registry name: quadlet_radio_engine content: repos: - id: copr-sample-apps baseurl: https://download.copr.fedorainfracloud.org/results/alexl/cs9-sample-images/centos-stream-9-$arch/ rpms: - podman - containernetworking-plugins - vsomeip3-routingmanager - dlt-daemon # For testing the image only: - openssh-server - openssh-clients container_images: # Get the auto-apps container image from gitlab - source: registry.gitlab.com/centos/automotive/sample-images/demo/auto-apps tag: latest name: localhost/auto-apps add_files: - path: /etc/containers/systemd/radio.container source_path: ../radio.container - path: /etc/containers/systemd/engine.container source_path: ../engine.container # Required for testing the image only: systemd: enabled_services: # Enable ssh daemon - sshd.service # Enable the dlt daemon - dlt auth: # "password" root_password: $6$xoLqEUz0cGGJRx01$H3H/bFm0myJPULNMtbSsOFd/2BnHqHkMD92Sfxd.EKM9hXTWSmELG8cf205l6dktomuTcgKGGtGDgtvHVXSWU. # Required for testing the image only: sshd_config: PasswordAuthentication: true PermitRootLogin: true
Note
The
path:
option resolves a relative path. In this example, your Quadlet unit files are in the../
directory. -
Run the
automotive-image-builder
tool to build an OS image: -
Verify that the script has created an AutoSD image file named
quadlet_radio_engine.<arch>.qcow2
in your present working directory.Note
After you have created the OS image, assuming that you have installed QEMU, you can boot the AutoSD image in a virtual machine by using the
automotive-image-runner
utility: -
Run the image in QEMU using the
automotive-image-runner
script:If necessary, substitute the filename of your
.qcow2
image file. -
After the image has booted in QEMU, log in with the user name
root
and the passwordpassword
.
Additional resources