Skip to content

Commit cf29cb0

Browse files
committed
Support podman
1 parent a42ff9a commit cf29cb0

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
@@ -136,26 +136,86 @@ __handle_docker() {
136136
local exitstatus
137137
local var
138138
local regex
139+
local message
140+
local use_podman=0
141+
local use_docker=0
139142

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

153-
__docker_version=$(docker --version | awk '{ gsub(/,/, "", $3); print $3 }')
213+
__docker_version=$(${__docker_exe} --version | awk '{ gsub(/,/, "", $3); print $3 }')
154214
__docker_major_version=$(echo "${__docker_version}" | awk '{ split($1, version, "."); print version[1]; }')
155215
__docker_minor_version=$(echo "${__docker_version}" | awk '{ split($1, version, "."); print version[2]; }')
156216
__docker_patch_version=$(echo "${__docker_version}" | awk '{ split($1, version, "."); print version[3]; }')
157217

158-
if [[ "${__docker_major_version}" -lt 23 ]]; then
218+
if [[ "${use_docker}" -eq 1 && "${__docker_major_version}" -lt 23 ]]; then
159219
# Debian 11 and Debian 12 have docker.io 20.10. From Debian 13, it's >= 26
160220
# Ubuntu has docker.io>= 27 from 22.04
161221
# The code to detect old docker.io can be removed when Debian 12 goes EOL in 2028
@@ -170,24 +230,37 @@ __handle_docker() {
170230
__oldish_docker=1
171231
fi
172232

173-
if ! docker images >/dev/null 2>&1; then
233+
if ! ${__docker_exe} images >/dev/null 2>&1; then
174234
if [[ "${__cannot_sudo}" -eq 1 ]]; then
175235
echo "Cannot call Docker and cannot use sudo. Please make your user part of the docker group"
176236
exit 1
177237
fi
178238
echo "Will use sudo to access Docker"
179239
__docker_sudo="sudo"
180240
fi
241+
181242
if [[ -f "${__env_file}" && "${__distro}" =~ (debian|ubuntu) ]]; then
182-
DOCKER_ROOT=$(__dodocker system info --format '{{.DockerRootDir}}')
243+
if [[ "${__docker_exe}" = "podman" ]]; then
244+
DOCKER_ROOT=$(__dodocker system info --format '{{.Store.GraphRoot}}')
245+
else
246+
DOCKER_ROOT=$(__dodocker system info --format '{{.DockerRootDir}}')
247+
fi
183248
var=DOCKER_ROOT
184249
__update_value_in_env "${var}" "${!var}" "${__env_file}"
185250

186251
# on macOS, user would set this manually to Colima or Docker Desktop value
187-
if __dodocker system info --format '{{json .SecurityOptions}}' | grep -qi rootless; then
188-
DOCKER_SOCK=/run/user/$(id -u)/docker.sock
252+
if [[ "${__docker_exe}" = "podman" ]]; then
253+
if [[ "$(__dodocker system info --format '{{.Host.Security.Rootless}}')" = "true" ]]; then
254+
DOCKER_SOCK=/run/user/$(id -u)/podman/podman.sock
255+
else
256+
DOCKER_SOCK=/run/podman/podman.sock
257+
fi
189258
else
190-
DOCKER_SOCK=/var/run/docker.sock
259+
if __dodocker system info --format '{{.SecurityOptions}}' | grep -qi rootless; then
260+
DOCKER_SOCK=/run/user/$(id -u)/docker.sock
261+
else
262+
DOCKER_SOCK=/var/run/docker.sock
263+
fi
191264
fi
192265
var=DOCKER_SOCK
193266
__update_value_in_env "${var}" "${!var}" "${__env_file}"
@@ -416,8 +489,8 @@ __check_compose_version() {
416489
# 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.
417490

418491
# Check for Compose V2+ (docker compose) vs Compose V1 (docker-compose)
419-
if docker compose version >/dev/null 2>&1; then
420-
__compose_version=$(${__docker_sudo} docker compose version | sed -n -E -e "s/.*version [v]?([0-9.-]*).*/\1/ip")
492+
if ${__docker_sudo} ${__docker_exe} compose version >/dev/null 2>&1; then
493+
__compose_version=$(${__docker_sudo} ${__docker_exe} compose version | sed -n -E -e "s/.*version [v]?([0-9.-]*).*/\1/ip")
421494
__compose_major=${__compose_version%%.*}
422495
__compose_minor=${__compose_version#*.}
423496
__compose_minor=${__compose_minor%%.*}
@@ -426,12 +499,16 @@ __check_compose_version() {
426499
elif [[ "${__compose_major}" -eq 2 && "${__compose_minor}" -lt 18 ]]; then
427500
__old_compose=1
428501
fi
429-
else
502+
elif ${__docker_sudo} docker-compose --version >/dev/null 2>&1; then
430503
__old_compose=1
431504
__compose_version=$(${__docker_sudo} docker-compose --version | sed -n -E -e "s/.*version [v]?([0-9.-]*).*/\1/ip")
432505
__compose_major=${__compose_version%%.*}
433506
__compose_minor=${__compose_version#*.}
434507
__compose_minor=${__compose_minor%%.*}
508+
else
509+
echo "Unable to find ${__docker_exe} compose. Please be sure it's installed"
510+
echo "Aborting"
511+
exit 1
435512
fi
436513
if [[ "${__compose_major}" -gt 1 ]]; then
437514
return
@@ -751,7 +828,11 @@ __optimize_host() {
751828
local memtotal
752829

753830
echo
754-
docker_root=$(__dodocker system info --format '{{.DockerRootDir}}')
831+
if dpkg-query -W -f='${Status}' podman 2>/dev/null | grep -q "ok installed"; then
832+
docker_root=$(__dodocker system info --format '{{.Store.GraphRoot}}')
833+
else
834+
docker_root=$(__dodocker system info --format '{{.DockerRootDir}}')
835+
fi
755836
if command -v findmnt >/dev/null; then
756837
docker_mount=$(findmnt -T "${docker_root}" -o TARGET -n)
757838
docker_mount_opts=$(findmnt -T "${docker_root}" -o OPTIONS -n 2>/dev/null)
@@ -842,6 +923,11 @@ __install_docker() {
842923
exit 70
843924
fi
844925

926+
if dpkg-query -W -f='${Status}' podman 2>/dev/null | grep -q "ok installed"; then
927+
echo "Found podman. Will not install Docker, as it would conflict."
928+
return
929+
fi
930+
845931
if [[ -z "$(command -v docker)" ]]; then
846932
${__auto_sudo} install -m 0755 -d /etc/apt/keyrings
847933
${__auto_sudo} curl -fsSL https://download.docker.com/linux/${repo}/gpg -o /etc/apt/keyrings/docker.asc
@@ -957,8 +1043,12 @@ __get_docker_free_space() {
9571043
if [[ "$OSTYPE" = "darwin"* ]]; then # macOS doesn't expose docker root dir to the OS
9581044
__free_space=$(__dodocker run --rm -v macos-space-check:/dummy busybox df -P /dummy | awk '/[0-9]%/{print $(NF-2)}')
9591045
else
960-
__docker_dir=$(__dodocker system info --format '{{.DockerRootDir}}')
961-
__free_space=$(df -P "${__docker_dir}" | awk '/[0-9]%/{print $(NF-2)}')
1046+
if [[ "${__docker_exe}" = "podman" ]]; then
1047+
__docker_dir=$(__dodocker system info --format '{{.Store.GraphRoot}}')
1048+
else
1049+
__docker_dir=$(__dodocker system info --format '{{.DockerRootDir}}')
1050+
fi
1051+
__free_space=$(${__docker_sudo} df -P "${__docker_dir}" | awk '/[0-9]%/{print $(NF-2)}') # Allow for rootful podman
9621052
fi
9631053

9641054
regex='^[0-9]+$'
@@ -967,7 +1057,7 @@ __get_docker_free_space() {
9671057
if [[ "$OSTYPE" = "darwin"* ]]; then
9681058
echo "df reports $(__dodocker run --rm -v macos-space-check:/dummy busybox df -P /dummy) and __free_space is ${__free_space}"
9691059
else
970-
echo "df reports $(df -P "${__docker_dir}") and __free_space is ${__free_space}"
1060+
echo "df reports $(${__docker_sudo} df -P "${__docker_dir}") and __free_space is ${__free_space}" # Allow for rootful podman
9711061
fi
9721062
exit 70
9731063
fi
@@ -980,7 +1070,7 @@ __display_docker_dir() {
9801070
__dodocker run --rm -v macos-space-check:/dummy busybox df -h /dummy
9811071
else
9821072
echo "Here's total and used space on ${__docker_dir}"
983-
df -h "${__docker_dir}"
1073+
${__docker_sudo} df -h "${__docker_dir}" # Allow for rootful podman
9841074
fi
9851075
}
9861076

@@ -4706,8 +4796,8 @@ __query_web3signer() {
47064796

47074797
__query_grafana() {
47084798
if whiptail --title "Grafana" --yesno "Do you want to use Grafana dashboards?" 10 65; then
4709-
if [[ "$OSTYPE" = "darwin"* ]] || __dodocker system info --format '{{json .SecurityOptions}}' | grep -qi rootless; then
4710-
# macOS doesn't do well with / bind mount - leave node-exporter and cadvisor off by default
4799+
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
4800+
# macOS doesn't do well with / bind mount - leave node-exporter and cadvisor off by default. Also detect rootless Docker/Podman
47114801
CORE_FILES+=":grafana-rootless.yml:grafana-shared.yml"
47124802
else
47134803
CORE_FILES+=":grafana.yml:grafana-shared.yml"
@@ -5176,9 +5266,14 @@ __query_mev_factor() {
51765266
return
51775267
fi
51785268

5179-
if [[ "${__cannot_sudo}" -eq 0 ]] && ! dpkg-query -W -f='${Status}' speedtest-cli 2>/dev/null | grep -q "ok installed"; then
5180-
echo "Installing speedtest-cli"
5181-
${__auto_sudo} apt-get update && ${__auto_sudo} apt-get install -y --no-install-recommends speedtest-cli
5269+
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
5270+
if [[ "${__cannot_sudo}" -eq 0 ]]; then
5271+
echo "Installing speedtest-cli and jq"
5272+
${__auto_sudo} apt-get update && ${__auto_sudo} apt-get install -y --no-install-recommends speedtest-cli jq
5273+
else
5274+
echo "Cannot install speedtest-cli and jq, skipping MEV Build Factor query"
5275+
return
5276+
fi
51825277
fi
51835278
if ! dpkg-query -W -f='${Status}' speedtest-cli 2>/dev/null | grep -q "ok installed"; then
51845279
echo "Cannot install \"speedtest-cli\", skipping MEV Build Factor query"
@@ -6148,7 +6243,7 @@ __update_help() {
61486243
echo "Updates ${__project_name} itself, as required the contents of \".env\", and the clients."
61496244
echo
61506245
echo "A combination of \"git pull\" for ${__project_name}, some bash scripting to bring new variables from \"default.env\","
6151-
echo "and \"docker compose pull\" as well as \"docker compose build\" for the clients."
6246+
echo "and \"${__compose_exe} pull\" as well as \"${__compose_exe} build\" for the clients."
61526247
echo
61536248
echo "If warranted, will also offer resync when clients require it, or upgrade of PostgreSQL version."
61546249
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)