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