@@ -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
0 commit comments