Skip to content

Commit 87446da

Browse files
committed
Support podman
1 parent 40e4ee4 commit 87446da

47 files changed

Lines changed: 183 additions & 128 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test-ethd.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ jobs:
3636
- name: Set up Docker on macOS
3737
if: ${{ startsWith(matrix.os, 'macos-') }}
3838
uses: douglascamata/setup-docker-macos-action@d5ccc6aae0ce23e7700154f5e63cc53e6433ac48
39-
- name: Install Expect
39+
- name: Prerequisites on Ubuntu
4040
if: ${{ startsWith(matrix.os, 'ubuntu-') }}
41-
run: sudo apt-get install -y expect whiptail
41+
run: |
42+
sudo apt-get install -y expect whiptail
43+
sudo apt-get remove -y podman
4244
- name: Prerequisites on macOS
4345
if: ${{ startsWith(matrix.os, 'macos-') }}
4446
run: brew install bash newt coreutils expect gawk

anchor.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
x-logging: &logging
22
logging:
3-
driver: json-file
43
options:
54
max-size: 100m
65
max-file: "3"
7-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
6+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
87

98
services:
109
anchor:

besu.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
x-logging: &logging
22
logging:
3-
driver: json-file
43
options:
54
max-size: 100m
65
max-file: "3"
7-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
6+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
87

98
services:
109
execution:

central-metrics.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
# For scraping with central-proxy-docker, when all you want is the metrics exporter
22
x-logging: &logging
33
logging:
4-
driver: json-file
54
options:
65
max-size: 100m
76
max-file: "3"
8-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
7+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
98

109
services:
1110
ethereum-metrics-exporter:

commit-boost-pbs.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
x-logging: &logging
22
logging:
3-
driver: json-file
43
options:
54
max-size: 100m
65
max-file: "3"
7-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
6+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
87

98
services:
109
cb-pbs:

contributoor.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22
## Read more: https://github.com/ethpandaops/contributoor
33
x-logging: &logging
44
logging:
5-
driver: json-file
65
options:
76
max-size: 100m
87
max-file: "3"
9-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
8+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
109

1110
services:
1211
contributoor:

erigon.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
x-logging: &logging
22
logging:
3-
driver: json-file
43
options:
54
max-size: 100m
65
max-file: "3"
7-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
6+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
87

98
services:
109
execution:

ethd

Lines changed: 121 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,86 @@ __handle_docker() {
133133
local exitstatus
134134
local var
135135
local regex
136+
local message
137+
local use_podman=0
138+
local use_docker=0
136139

137140
set +e
138141
if [[ "${__distro}" =~ (debian|ubuntu) ]]; then
139-
systemctl status docker >/dev/null
140-
exitstatus=$?
141-
if [[ ! "${exitstatus}" -eq 0 ]] && ! docker system info --format '{{json .SecurityOptions}}' | grep -qi rootless; then
142-
echo "The Docker daemon is not running. Please check Docker installation."
143-
echo "\"sudo systemctl status docker\" and \"sudo journalctl -fu docker\" will be helpful."
142+
if dpkg-query -W -f='${Status}' docker-ce 2>/dev/null | grep -q "ok installed" \
143+
|| dpkg-query -W -f='${Status}' docker.io 2>/dev/null | grep -q "ok installed"; then
144+
use_docker=1
145+
fi
146+
if dpkg-query -W -f='${Status}' podman 2>/dev/null | grep -q "ok installed"; then
147+
use_podman=1
148+
fi
149+
150+
# If both are installed:
151+
# If DOCKER_SOCK is set to podman.sock, assume the user prefers podman
152+
# If service podman.socket is running, assume the user prefers podman
153+
# Otherwise, default to Docker
154+
if [[ "${use_docker}" -eq 1 && "${use_podman}" -eq 1 ]]; then
155+
echo "Both Docker and Podman are installed"
156+
echo "Guessing at user preference by \"DOCKER_SOCK\" in \".env\" and status of service podman.socket"
157+
var=DOCKER_SOCK
158+
__get_value_from_env "${var}" "${__env_file}" "__value"
159+
if [[ "${__value}" =~ podman.sock ]] || systemctl --user status podman.socket >/dev/null 2>&1 || systemctl status podman.socket >/dev/null 2>&1; then
160+
echo "Preferring Podman"
161+
echo
162+
use_docker=0
163+
else
164+
echo "Preferring Docker"
165+
echo
166+
use_podman=0
167+
fi
168+
fi
169+
170+
if [[ "${use_docker}" -eq 1 ]]; then
171+
if ${__docker_exe} system info --format '{{json .SecurityOptions}}' | grep -qi rootless; then
172+
systemctl --user status docker >/dev/null 2>&1
173+
exitstatus=$?
174+
message="\"systemctl --user status docker\" and \"journalctl --user -fu docker\" will be helpful."
175+
else
176+
systemctl status docker >/dev/null 2>&1
177+
exitstatus=$?
178+
message="\"systemctl status docker\" and \"sudo journalctl -fu docker\" will be helpful."
179+
fi
180+
if [[ ! "${exitstatus}" -eq 0 ]]; then
181+
echo "The Docker daemon is not running. Please check Docker installation."
182+
echo "${message}"
183+
echo "Aborting."
184+
exit 1
185+
fi
186+
elif [[ "${use_podman}" -eq 1 ]]; then
187+
__docker_exe=podman
188+
__compose_exe="podman compose"
189+
if systemctl status podman.socket >/dev/null 2>&1; then # User has enabled system socket, run podman with sudo.
190+
__docker_sudo="sudo"
191+
else
192+
systemctl --user status podman.socket >/dev/null 2>&1
193+
exitstatus=$?
194+
if [[ ! "${exitstatus}" -eq 0 ]]; then
195+
echo "The Podman socket service is not running. Please check Podman installation."
196+
echo "\"systemctl --user status podman.socket\" and \"journalctl --user -fu podman.socket\" will be helpful."
197+
echo "Aborting."
198+
exit 1
199+
fi
200+
fi
201+
else
202+
echo "Neither docker-ce, docker.io nor podman appear to be installed."
203+
echo "One of those is required to run ${__project_name}."
144204
echo "Aborting."
145205
exit 1
146206
fi
147207
fi
148208
set -e
149209

150-
__docker_version=$(docker --version | awk '{ gsub(/,/, "", $3); print $3 }')
210+
__docker_version=$(${__docker_exe} --version | awk '{ gsub(/,/, "", $3); print $3 }')
151211
__docker_major_version=$(echo "${__docker_version}" | awk '{ split($1, version, "."); print version[1]; }')
152212
__docker_minor_version=$(echo "${__docker_version}" | awk '{ split($1, version, "."); print version[2]; }')
153213
__docker_patch_version=$(echo "${__docker_version}" | awk '{ split($1, version, "."); print version[3]; }')
154214

155-
if [[ "${__docker_major_version}" -lt 23 ]]; then
215+
if [[ "${use_docker}" -eq 1 && "${__docker_major_version}" -lt 23 ]]; then
156216
# Debian 11 and Debian 12 have docker.io 20.10. From Debian 13, it's >= 26
157217
# Ubuntu has docker.io>= 27 from 22.04
158218
# The code to detect old docker.io can be removed when Debian 12 goes EOL in 2028
@@ -161,24 +221,37 @@ __handle_docker() {
161221
__old_docker=0
162222
fi
163223

164-
if ! docker images >/dev/null 2>&1; then
224+
if ! ${__docker_exe} images >/dev/null 2>&1; then
165225
if [[ "${__cannot_sudo}" -eq 1 ]]; then
166226
echo "Cannot call Docker and cannot use sudo. Please make your user part of the docker group"
167227
exit 1
168228
fi
169229
echo "Will use sudo to access Docker"
170230
__docker_sudo="sudo"
171231
fi
232+
172233
if [[ -f "${__env_file}" && "${__distro}" =~ (debian|ubuntu) ]]; then
173-
DOCKER_ROOT=$(__dodocker system info --format '{{.DockerRootDir}}')
234+
if [[ "${__docker_exe}" = "podman" ]]; then
235+
DOCKER_ROOT=$(__dodocker system info --format '{{.Store.GraphRoot}}')
236+
else
237+
DOCKER_ROOT=$(__dodocker system info --format '{{.DockerRootDir}}')
238+
fi
174239
var=DOCKER_ROOT
175240
__update_value_in_env "${var}" "${!var}" "${__env_file}"
176241

177242
# on macOS, user would set this manually to Colima or Docker Desktop value
178-
if __dodocker system info --format '{{json .SecurityOptions}}' | grep -qi rootless; then
179-
DOCKER_SOCK=/run/user/$(id -u)/docker.sock
243+
if [[ "${__docker_exe}" = "podman" ]]; then
244+
if [[ "$(__dodocker system info --format '{{.Host.Security.Rootless}}')" = "true" ]]; then
245+
DOCKER_SOCK=/run/user/$(id -u)/podman/podman.sock
246+
else
247+
DOCKER_SOCK=/run/podman/podman.sock
248+
fi
180249
else
181-
DOCKER_SOCK=/var/run/docker.sock
250+
if __dodocker system info --format '{{.SecurityOptions}}' | grep -qi rootless; then
251+
DOCKER_SOCK=/run/user/$(id -u)/docker.sock
252+
else
253+
DOCKER_SOCK=/var/run/docker.sock
254+
fi
182255
fi
183256
var=DOCKER_SOCK
184257
__update_value_in_env "${var}" "${!var}" "${__env_file}"
@@ -407,8 +480,8 @@ __check_compose_version() {
407480
# Compose V1 is in Ubuntu 22.04 and 24.04. The Compose version check can be removed when Ubuntu 24.04 goes EOL in 2029.
408481

409482
# Check for Compose V2+ (docker compose) vs Compose V1 (docker-compose)
410-
if docker compose version >/dev/null 2>&1; then
411-
__compose_version=$(${__docker_sudo} docker compose version | sed -n -E -e "s/.*version [v]?([0-9.-]*).*/\1/ip")
483+
if ${__docker_sudo} ${__docker_exe} compose version >/dev/null 2>&1; then
484+
__compose_version=$(${__docker_sudo} ${__docker_exe} compose version | sed -n -E -e "s/.*version [v]?([0-9.-]*).*/\1/ip")
412485
__compose_major=${__compose_version%%.*}
413486
__compose_minor=${__compose_version#*.}
414487
__compose_minor=${__compose_minor%%.*}
@@ -417,12 +490,16 @@ __check_compose_version() {
417490
elif [[ "${__compose_major}" -eq 2 && "${__compose_minor}" -lt 18 ]]; then
418491
__old_compose=1
419492
fi
420-
else
493+
elif ${__docker_sudo} docker-compose --version >/dev/null 2>&1; then
421494
__old_compose=1
422495
__compose_version=$(${__docker_sudo} docker-compose --version | sed -n -E -e "s/.*version [v]?([0-9.-]*).*/\1/ip")
423496
__compose_major=${__compose_version%%.*}
424497
__compose_minor=${__compose_version#*.}
425498
__compose_minor=${__compose_minor%%.*}
499+
else
500+
echo "Unable to find ${__docker_exe} compose. Please be sure it's installed"
501+
echo "Aborting"
502+
exit 1
426503
fi
427504
if [[ "${__compose_major}" -gt 1 ]]; then
428505
return
@@ -738,7 +815,11 @@ __optimize_host() {
738815
local memtotal
739816

740817
echo
741-
docker_root=$(__dodocker system info --format '{{.DockerRootDir}}')
818+
if dpkg-query -W -f='${Status}' podman 2>/dev/null | grep -q "ok installed"; then
819+
docker_root=$(__dodocker system info --format '{{.Store.GraphRoot}}')
820+
else
821+
docker_root=$(__dodocker system info --format '{{.DockerRootDir}}')
822+
fi
742823
if command -v findmnt >/dev/null; then
743824
docker_mount=$(findmnt -T "${docker_root}" -o TARGET -n)
744825
docker_mount_opts=$(findmnt -T "${docker_root}" -o OPTIONS -n 2>/dev/null)
@@ -829,6 +910,11 @@ __install_docker() {
829910
exit 70
830911
fi
831912

913+
if dpkg-query -W -f='${Status}' podman 2>/dev/null | grep -q "ok installed"; then
914+
echo "Found podman. Will not install Docker, as it would conflict."
915+
return
916+
fi
917+
832918
if [[ -z "$(command -v docker)" ]]; then
833919
${__auto_sudo} install -m 0755 -d /etc/apt/keyrings
834920
${__auto_sudo} curl -fsSL https://download.docker.com/linux/${repo}/gpg -o /etc/apt/keyrings/docker.asc
@@ -935,8 +1021,12 @@ __get_docker_free_space() {
9351021
if [[ "$OSTYPE" = "darwin"* ]]; then # macOS doesn't expose docker root dir to the OS
9361022
__free_space=$(__dodocker run --rm -v macos-space-check:/dummy busybox df -P /dummy | awk '/[0-9]%/{print $(NF-2)}')
9371023
else
938-
__docker_dir=$(__dodocker system info --format '{{.DockerRootDir}}')
939-
__free_space=$(df -P "${__docker_dir}" | awk '/[0-9]%/{print $(NF-2)}')
1024+
if [[ "${__docker_exe}" = "podman" ]]; then
1025+
__docker_dir=$(__dodocker system info --format '{{.Store.GraphRoot}}')
1026+
else
1027+
__docker_dir=$(__dodocker system info --format '{{.DockerRootDir}}')
1028+
fi
1029+
__free_space=$(${__docker_sudo} df -P "${__docker_dir}" | awk '/[0-9]%/{print $(NF-2)}') # Allow for rootful podman
9401030
fi
9411031

9421032
regex='^[0-9]+$'
@@ -945,7 +1035,7 @@ __get_docker_free_space() {
9451035
if [[ "$OSTYPE" = "darwin"* ]]; then
9461036
echo "df reports $(__dodocker run --rm -v macos-space-check:/dummy busybox df -P /dummy) and __free_space is ${__free_space}"
9471037
else
948-
echo "df reports $(df -P "${__docker_dir}") and __free_space is ${__free_space}"
1038+
echo "df reports $(${__docker_sudo} df -P "${__docker_dir}") and __free_space is ${__free_space}" # Allow for rootful podman
9491039
fi
9501040
exit 70
9511041
fi
@@ -958,7 +1048,7 @@ __display_docker_dir() {
9581048
__dodocker run --rm -v macos-space-check:/dummy busybox df -h /dummy
9591049
else
9601050
echo "Here's total and used space on ${__docker_dir}"
961-
df -h "${__docker_dir}"
1051+
${__docker_sudo} df -h "${__docker_dir}" # Allow for rootful podman
9621052
fi
9631053
}
9641054

@@ -4676,8 +4766,8 @@ __query_web3signer() {
46764766

46774767
__query_grafana() {
46784768
if whiptail --title "Grafana" --yesno "Do you want to use Grafana dashboards?" 10 65; then
4679-
if [[ "$OSTYPE" = "darwin"* ]] || __dodocker system info --format '{{json .SecurityOptions}}' | grep -qi rootless; then
4680-
# macOS doesn't do well with / bind mount - leave node-exporter and cadvisor off by default
4769+
if [[ "$OSTYPE" = "darwin"* ]] || { [[ "${__docker_exe}" = "podman" ]] && ! systemctl status podman.socket >/dev/null 2>&1 ;} || __dodocker system info --format '{{json .SecurityOptions}}' 2>/dev/null | grep -qi rootless; then
4770+
# macOS doesn't do well with / bind mount - leave node-exporter and cadvisor off by default. Also detect rootless Docker/Podman
46814771
CORE_FILES+=":grafana-rootless.yml:grafana-shared.yml"
46824772
else
46834773
CORE_FILES+=":grafana.yml:grafana-shared.yml"
@@ -5146,9 +5236,14 @@ __query_mev_factor() {
51465236
return
51475237
fi
51485238

5149-
if [[ "${__cannot_sudo}" -eq 0 ]] && ! dpkg-query -W -f='${Status}' speedtest-cli 2>/dev/null | grep -q "ok installed"; then
5150-
echo "Installing speedtest-cli"
5151-
${__auto_sudo} apt-get update && ${__auto_sudo} apt-get install -y --no-install-recommends speedtest-cli
5239+
if ! dpkg-query -W -f='${Status}' speedtest-cli 2>/dev/null | grep -q "ok installed" || ! dpkg-query -W -f='${Status}' jq 2>/dev/null | grep -q "ok installed"; then
5240+
if [[ "${__cannot_sudo}" -eq 0 ]]; then
5241+
echo "Installing speedtest-cli and jq"
5242+
${__auto_sudo} apt-get update && ${__auto_sudo} apt-get install -y --no-install-recommends speedtest-cli jq
5243+
else
5244+
echo "Cannot install speedtest-cli and jq, skipping MEV Build Factor query"
5245+
return
5246+
fi
51525247
fi
51535248
if ! dpkg-query -W -f='${Status}' speedtest-cli 2>/dev/null | grep -q "ok installed"; then
51545249
echo "Cannot install \"speedtest-cli\", skipping MEV Build Factor query"
@@ -6118,7 +6213,7 @@ __update_help() {
61186213
echo "Updates ${__project_name} itself, as required the contents of \".env\", and the clients."
61196214
echo
61206215
echo "A combination of \"git pull\" for ${__project_name}, some bash scripting to bring new variables from \"default.env\","
6121-
echo "and \"docker compose pull\" as well as \"docker compose build\" for the clients."
6216+
echo "and \"${__compose_exe} pull\" as well as \"${__compose_exe} build\" for the clients."
61226217
echo
61236218
echo "If warranted, will also offer resync when clients require it, or upgrade of PostgreSQL version."
61246219
echo

ethrex.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
x-logging: &logging
22
logging:
3-
driver: json-file
43
options:
54
max-size: 100m
65
max-file: "3"
7-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
6+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
87

98
services:
109
execution:

geth.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
x-logging: &logging
22
logging:
3-
driver: json-file
43
options:
54
max-size: 100m
65
max-file: "3"
7-
tag: '{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}'
6+
tag: '{{.ImageName}}|{{.Name}}|{{.ID}}'
87

98
services:
109
execution:

0 commit comments

Comments
 (0)