Running Containers

Introduction

Fedora CoreOS ships with both the docker CLI tool (as provided via Moby) and podman installed. This page explains how to use systemd units to start and stop containers with podman.

Example configuration

The following Butane config snippet configures the systemd hello.service to run busybox.

You may be able to use local file references to systemd units instead of inlining them. See Using butane’s --files-dir Parameter to Embed Files for more information.
Example for running busybox using systemd and podman
variant: fcos
version: 1.5.0
systemd:
  units:
    - name: hello.service
      enabled: true
      contents: |
        [Unit]
        Description=MyApp
        After=network-online.target
        Wants=network-online.target

        [Service]
        TimeoutStartSec=0
        ExecStartPre=-/bin/podman kill busybox1
        ExecStartPre=-/bin/podman rm busybox1
        ExecStartPre=/bin/podman pull busybox
        ExecStart=/bin/podman run --name busybox1 busybox /bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 1; done"

        [Install]
        WantedBy=multi-user.target
Example for running busybox using Podman Quadlet

Podman Quadlet is functionality included in podman that allows starting containers via systemd using a systemd generator. The example below is the same hello.service that was previously shown but deployed via the Podman Quadlet functionality.

variant: fcos
version: 1.5.0
storage:
  files:
    - path: /etc/containers/systemd/hello.container
      contents:
        inline: |
          [Unit]
          Description=Hello Service
          Wants=network-online.target
          After=network-online.target

          [Container]
          ContainerName=busybox1
          Image=docker.io/busybox
          Exec=/bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 1; done"

          [Install]
          WantedBy=multi-user.target

Running etcd

etcd is not shipped as part of Fedora CoreOS. To use it, run it as a container, as shown below.

Butane config for setting up single node etcd
variant: fcos
version: 1.5.0
systemd:
  units:
    - name: etcd-member.service
      enabled: true
      contents: |
        [Unit]
        Description=Run single node etcd
        After=network-online.target
        Wants=network-online.target

        [Service]
        ExecStartPre=mkdir -p /var/lib/etcd
        ExecStartPre=-/bin/podman kill etcd
        ExecStartPre=-/bin/podman rm etcd
        ExecStartPre=-/bin/podman pull quay.io/coreos/etcd
        ExecStart=/bin/podman run --name etcd --volume /var/lib/etcd:/etcd-data:z --net=host quay.io/coreos/etcd:latest /usr/local/bin/etcd --data-dir /etcd-data --name node1 \
                --initial-advertise-peer-urls http://127.0.0.1:2380 --listen-peer-urls http://127.0.0.1:2380 \
                --advertise-client-urls http://127.0.0.1:2379 \
                --listen-client-urls http://127.0.0.1:2379 \
                --initial-cluster node1=http://127.0.0.1:2380

        ExecStop=/bin/podman stop etcd

        [Install]
        WantedBy=multi-user.target

For more information

See the etcd documentation for more information on running etcd in containers and how to set up multi-node etcd.