從 Docker Desktop 換成 Podman,有些習慣必須做些小調整。此文記錄一些常用的小技巧。

Image tree

很久很久以前,我們可以用 docker images --tree 來看 image layer 的層次關係。此功能選項被後來某一版 Docker 廢除了,於是就有一些替代方案來做這件事:

可惜的是,這些工具都假設現在是處於「有一個 daemon 跑在 DOCKER_HOST」的環境(畢竟這是 Docker 的老規矩)。如果我們不想為此而刻意以 daemon 模式啟動 Podman,可透過 Podman 的 image tree 指令來檢視 image:

% podman image tree python:3.9.16

Daemon mode

儘管 daemonless 的好處很多,但很多舊世界的工具,會假設現在是處於「有一個 container engine daemon 跑在 DOCKER_HOST」的環境。因此,有時候我們得故意讓 Podman 以 daemon mode 運行。

臨時性實驗

我們先啟動一個 rootless Podman process:

% podman system service -t 0

另開一個終端機視窗,設置 DOCKER_HOST 環境變數:

% podman info --format={{".Host.RemoteSocket.Path"}}

% export DOCKER_HOST=unix://$(podman info --format={{".Host.RemoteSocket.Path"}})

現在,我們可以在這個終端機實驗看看那些舊世界的工具是否可以正常運作。就以前面提到的 dive 為例吧!

% dive python:3.9.16

便利性設置

如果一切正常,我們可以寫一個 /usr/local/bin/start-podman-service.sh 程式以簡化啟用流程:

#!/bin/bash

FILE=/var/run/docker.sock
if [ ! -f "$FILE" ]; then
    sudo ln -s /run/user/$(id -u)/podman/podman.sock $FILE
fi

echo "Starting podman as server... Ctrl-C to stop."

exec podman system service -t 0

在不需要時,按下 Ctrl+C 即可關閉,非常方便。

持久性設置

如果你想透過 systemd 來管理,請參考 K3d 團隊提供的 Using Podman instead of Docker 這篇文章。