From fdfacbd7741fff5d05513cc374ada74cff6e67cf Mon Sep 17 00:00:00 2001 From: Josh R Date: Sun, 16 Apr 2023 11:57:07 -0400 Subject: [PATCH 1/8] Guarantee REDIS_HOST_PORT is never null for UNIX sockets Addresses #1785 (which arises when using UNIX sockets) Without this fix (or manually specifying a bogus REDIS_HOST_PORT) UNIX socket connections won't work if REDIS_HOST is used to specify the socket to the container. Signed-off-by: Josh R. --- .config/redis.config.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.config/redis.config.php b/.config/redis.config.php index a5fde3c7..5ebdda10 100644 --- a/.config/redis.config.php +++ b/.config/redis.config.php @@ -13,5 +13,7 @@ if (getenv('REDIS_HOST')) { $CONFIG['redis']['port'] = (int) getenv('REDIS_HOST_PORT'); } elseif (getenv('REDIS_HOST')[0] != '/') { $CONFIG['redis']['port'] = 6379; + } elseif (getenv('REDIS_HOST')[0] == '/') { + $CONFIG['redis']['port'] = 0; } } From 6e8f484c4b913a9084ded085cc5d12e561bc9821 Mon Sep 17 00:00:00 2001 From: Jean-Kevin KPADEY <9912558+mivek@users.noreply.github.com> Date: Fri, 18 Apr 2025 13:11:41 +0000 Subject: [PATCH 2/8] fix: handle redis host user in the configuration of the session handler (#2411) Signed-off-by: Jean-Kevin KPADEY --- 29/apache/entrypoint.sh | 12 ++++++++++-- 29/fpm-alpine/entrypoint.sh | 12 ++++++++++-- 29/fpm/entrypoint.sh | 12 ++++++++++-- 30/apache/entrypoint.sh | 12 ++++++++++-- 30/fpm-alpine/entrypoint.sh | 12 ++++++++++-- 30/fpm/entrypoint.sh | 12 ++++++++++-- 31/apache/entrypoint.sh | 12 ++++++++++-- 31/fpm-alpine/entrypoint.sh | 12 ++++++++++-- 31/fpm/entrypoint.sh | 12 ++++++++++-- docker-entrypoint.sh | 12 ++++++++++-- 10 files changed, 100 insertions(+), 20 deletions(-) diff --git a/29/apache/entrypoint.sh b/29/apache/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/29/apache/entrypoint.sh +++ b/29/apache/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/29/fpm-alpine/entrypoint.sh b/29/fpm-alpine/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/29/fpm-alpine/entrypoint.sh +++ b/29/fpm-alpine/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/29/fpm/entrypoint.sh b/29/fpm/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/29/fpm/entrypoint.sh +++ b/29/fpm/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/30/apache/entrypoint.sh b/30/apache/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/30/apache/entrypoint.sh +++ b/30/apache/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/30/fpm-alpine/entrypoint.sh b/30/fpm-alpine/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/30/fpm-alpine/entrypoint.sh +++ b/30/fpm-alpine/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/30/fpm/entrypoint.sh b/30/fpm/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/30/fpm/entrypoint.sh +++ b/30/fpm/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/31/apache/entrypoint.sh b/31/apache/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/31/apache/entrypoint.sh +++ b/31/apache/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/31/fpm-alpine/entrypoint.sh b/31/fpm-alpine/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/31/fpm-alpine/entrypoint.sh +++ b/31/fpm-alpine/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/31/fpm/entrypoint.sh b/31/fpm/entrypoint.sh index 4e261827..c571d8d4 100755 --- a/31/fpm/entrypoint.sh +++ b/31/fpm/entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 4e261827..c571d8d4 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -114,13 +114,21 @@ if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ] || [ "${NEXTCLOUD_UP # check if redis host is an unix socket path if [ "$(echo "$REDIS_HOST" | cut -c1-1)" = "/" ]; then if [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"unix://${REDIS_HOST}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"unix://${REDIS_HOST}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"unix://${REDIS_HOST}\"" fi # check if redis password has been set elif [ -n "${REDIS_HOST_PASSWORD+x}" ]; then - echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + if [ -n "${REDIS_HOST_USER+x}" ]; then + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth[]=${REDIS_HOST_USER}&auth[]=${REDIS_HOST_PASSWORD}\"" + else + echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}?auth=${REDIS_HOST_PASSWORD}\"" + fi else echo "session.save_path = \"tcp://${REDIS_HOST}:${REDIS_HOST_PORT:=6379}\"" fi From b36cfa65da55abd7ffc04247b03bd9c4f4adc864 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 18 Apr 2025 09:12:44 -0400 Subject: [PATCH 3/8] fix(hooks): make the output more uniform and delineated (#2343) * fix(hooks): Consistent logging + skip when empty too - Use "Searching for scripts [...] located in [...]" consistently (i.e. for each hook_folder_path instead of only for some / under some conditions) - Skip early if a given hook folder is empty too (not just nonexistent) - Add feature name (hooks) to all messaging for clarity Signed-off-by: Josh * fix(hooks): Clear state delineation / consistent output Signed-off-by: Josh --------- Signed-off-by: Josh --- docker-entrypoint.sh | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } From f3e0c49c385e51de462a6b3b9102cddd0627c951 Mon Sep 17 00:00:00 2001 From: GitHub Workflow Date: Fri, 18 Apr 2025 13:13:10 +0000 Subject: [PATCH 4/8] Runs update.sh --- 29/apache/entrypoint.sh | 27 +++++++++++++++++---------- 29/fpm-alpine/entrypoint.sh | 27 +++++++++++++++++---------- 29/fpm/entrypoint.sh | 27 +++++++++++++++++---------- 30/apache/entrypoint.sh | 27 +++++++++++++++++---------- 30/fpm-alpine/entrypoint.sh | 27 +++++++++++++++++---------- 30/fpm/entrypoint.sh | 27 +++++++++++++++++---------- 31/apache/entrypoint.sh | 27 +++++++++++++++++---------- 31/fpm-alpine/entrypoint.sh | 27 +++++++++++++++++---------- 31/fpm/entrypoint.sh | 27 +++++++++++++++++---------- 9 files changed, 153 insertions(+), 90 deletions(-) diff --git a/29/apache/entrypoint.sh b/29/apache/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/29/apache/entrypoint.sh +++ b/29/apache/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/29/fpm-alpine/entrypoint.sh b/29/fpm-alpine/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/29/fpm-alpine/entrypoint.sh +++ b/29/fpm-alpine/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/29/fpm/entrypoint.sh b/29/fpm/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/29/fpm/entrypoint.sh +++ b/29/fpm/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/30/apache/entrypoint.sh b/30/apache/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/30/apache/entrypoint.sh +++ b/30/apache/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/30/fpm-alpine/entrypoint.sh b/30/fpm-alpine/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/30/fpm-alpine/entrypoint.sh +++ b/30/fpm-alpine/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/30/fpm/entrypoint.sh b/30/fpm/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/30/fpm/entrypoint.sh +++ b/30/fpm/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/31/apache/entrypoint.sh b/31/apache/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/31/apache/entrypoint.sh +++ b/31/apache/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/31/fpm-alpine/entrypoint.sh b/31/fpm-alpine/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/31/fpm-alpine/entrypoint.sh +++ b/31/fpm-alpine/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } diff --git a/31/fpm/entrypoint.sh b/31/fpm/entrypoint.sh index c571d8d4..e3b88f14 100755 --- a/31/fpm/entrypoint.sh +++ b/31/fpm/entrypoint.sh @@ -23,32 +23,39 @@ run_as() { run_path() { local hook_folder_path="/docker-entrypoint-hooks.d/$1" local return_code=0 + local found=0 - if ! [ -d "${hook_folder_path}" ]; then - echo "=> Skipping the folder \"${hook_folder_path}\", because it doesn't exist" + echo "=> Searching for hook scripts (*.sh) to run, located in the folder \"${hook_folder_path}\"" + + if ! [ -d "${hook_folder_path}" ] || directory_empty "${hook_folder_path}"; then + echo "==> Skipped: the \"$1\" folder is empty (or does not exist)" return 0 fi - echo "=> Searching for scripts (*.sh) to run, located in the folder: ${hook_folder_path}" - - ( - find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | while read -r script_file_path; do + find "${hook_folder_path}" -maxdepth 1 -iname '*.sh' '(' -type f -o -type l ')' -print | sort | ( + while read -r script_file_path; do if ! [ -x "${script_file_path}" ]; then - echo "==> The script \"${script_file_path}\" was skipped, because it didn't have the executable flag" + echo "==> The script \"${script_file_path}\" was skipped, because it lacks the executable flag" + found=$((found-1)) continue fi echo "==> Running the script (cwd: $(pwd)): \"${script_file_path}\"" - + found=$((found+1)) run_as "${script_file_path}" || return_code="$?" if [ "${return_code}" -ne "0" ]; then - echo "==> Failed at executing \"${script_file_path}\". Exit code: ${return_code}" + echo "==> Failed at executing script \"${script_file_path}\". Exit code: ${return_code}" exit 1 fi - echo "==> Finished the script: \"${script_file_path}\"" + echo "==> Finished executing the script: \"${script_file_path}\"" done + if [ "$found" -lt "1" ]; then + echo "==> Skipped: the \"$1\" folder does not contain any valid scripts" + else + echo "=> Completed executing scripts in the \"$1\" folder" + fi ) } From f130178136c00a6e6951591510bcc059490e4c54 Mon Sep 17 00:00:00 2001 From: J0WI Date: Fri, 18 Apr 2025 13:37:27 +0000 Subject: [PATCH 5/8] Imagick 3.8.0 (#2417) * Revert "Build imagick for PHP 8.3 (#2394)" This reverts commit af005991484e03918488bb6cdb75750598a121f5. * PHP imagick 3.8.0 Signed-off-by: J0WI --------- Signed-off-by: J0WI --- 29/apache/Dockerfile | 18 +----------------- 29/fpm-alpine/Dockerfile | 18 +----------------- 29/fpm/Dockerfile | 18 +----------------- 30/apache/Dockerfile | 18 +----------------- 30/fpm-alpine/Dockerfile | 18 +----------------- 30/fpm/Dockerfile | 18 +----------------- 31/apache/Dockerfile | 20 ++------------------ 31/fpm-alpine/Dockerfile | 20 ++------------------ 31/fpm/Dockerfile | 20 ++------------------ Dockerfile-alpine.template | 18 +----------------- Dockerfile-debian.template | 18 +----------------- update.sh | 3 +-- versions.json | 6 +++--- 13 files changed, 18 insertions(+), 195 deletions(-) diff --git a/29/apache/Dockerfile b/29/apache/Dockerfile index 266fc236..962f1bca 100644 --- a/29/apache/Dockerfile +++ b/29/apache/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.2-apache-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/29/fpm-alpine/Dockerfile b/29/fpm-alpine/Dockerfile index 3c79d672..937ae5dc 100644 --- a/29/fpm-alpine/Dockerfile +++ b/29/fpm-alpine/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template FROM php:8.2-fpm-alpine3.21 -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -65,23 +62,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/29/fpm/Dockerfile b/29/fpm/Dockerfile index e89e6e73..2d5ff91a 100644 --- a/29/fpm/Dockerfile +++ b/29/fpm/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.2-fpm-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/30/apache/Dockerfile b/30/apache/Dockerfile index e0ee6521..7b3f2939 100644 --- a/30/apache/Dockerfile +++ b/30/apache/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.2-apache-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/30/fpm-alpine/Dockerfile b/30/fpm-alpine/Dockerfile index 32ef9ca2..26c5c856 100644 --- a/30/fpm-alpine/Dockerfile +++ b/30/fpm-alpine/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template FROM php:8.2-fpm-alpine3.21 -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -65,23 +62,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/30/fpm/Dockerfile b/30/fpm/Dockerfile index 42fa3bc4..6ef1a6a7 100644 --- a/30/fpm/Dockerfile +++ b/30/fpm/Dockerfile @@ -1,9 +1,6 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template FROM php:8.2-fpm-bookworm -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/31/apache/Dockerfile b/31/apache/Dockerfile index fa82eda7..642be03e 100644 --- a/31/apache/Dockerfile +++ b/31/apache/Dockerfile @@ -1,8 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.3-apache-bookworm - -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b +FROM php:8.2-apache-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/31/fpm-alpine/Dockerfile b/31/fpm-alpine/Dockerfile index 77cadc5b..0c9ff741 100644 --- a/31/fpm-alpine/Dockerfile +++ b/31/fpm-alpine/Dockerfile @@ -1,8 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template -FROM php:8.3-fpm-alpine3.21 - -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b +FROM php:8.2-fpm-alpine3.21 # entrypoint.sh and cron.sh dependencies RUN set -ex; \ @@ -65,23 +62,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/31/fpm/Dockerfile b/31/fpm/Dockerfile index 0d25db84..9eee6cfc 100644 --- a/31/fpm/Dockerfile +++ b/31/fpm/Dockerfile @@ -1,8 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.3-fpm-bookworm - -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b +FROM php:8.2-fpm-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ @@ -68,23 +65,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-5.1.24; \ pecl install igbinary-3.2.16; \ + pecl install imagick-3.8.0; \ pecl install memcached-3.3.0 \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-6.2.0 \ diff --git a/Dockerfile-alpine.template b/Dockerfile-alpine.template index 2295bddf..cf6af0ff 100644 --- a/Dockerfile-alpine.template +++ b/Dockerfile-alpine.template @@ -1,8 +1,5 @@ FROM php:%%PHP_VERSION%%-%%VARIANT%%%%ALPINE_VERSION%% -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -64,23 +61,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-%%APCU_VERSION%%; \ pecl install igbinary-%%IGBINARY_VERSION%%; \ + pecl install imagick-%%IMAGICK_VERSION%%; \ pecl install memcached-%%MEMCACHED_VERSION%% \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-%%REDIS_VERSION%% \ diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index 8734caa9..cadae18a 100644 --- a/Dockerfile-debian.template +++ b/Dockerfile-debian.template @@ -1,8 +1,5 @@ FROM php:%%PHP_VERSION%%-%%VARIANT%%-%%DEBIAN_VERSION%% -# Define the commit hash for imagick as a variable -ENV IMAGICK_COMMIT_HASH d7d3c24af1b4f599897408f1714600b69a56473b - # entrypoint.sh and cron.sh dependencies RUN set -ex; \ \ @@ -67,23 +64,10 @@ RUN set -ex; \ zip \ ; \ \ -# The master version on the imagick repository is compatible with PHP 8.3. However, the PECL version is not updated yet. -# As soon as it will get updated, we can switch back to the PECL version, instead of having this workaround. - curl -fsSL -o imagick.tar.gz "https://github.com/Imagick/imagick/archive/$IMAGICK_COMMIT_HASH.tar.gz"; \ - tar -xzf imagick.tar.gz -C /tmp; \ - rm imagick.tar.gz; \ - cd "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - sed -i "s/@PACKAGE_VERSION@/git-$(echo ${IMAGICK_COMMIT_HASH} | cut -c 1-7)/" php_imagick.h; \ - phpize; \ - ./configure; \ - make; \ - make install; \ - cd; \ - rm -r "/tmp/imagick-$IMAGICK_COMMIT_HASH"; \ - \ # pecl will claim success even if one install fails, so we need to perform each install separately pecl install APCu-%%APCU_VERSION%%; \ pecl install igbinary-%%IGBINARY_VERSION%%; \ + pecl install imagick-%%IMAGICK_VERSION%%; \ pecl install memcached-%%MEMCACHED_VERSION%% \ --configureoptions 'enable-memcached-igbinary="yes"'; \ pecl install redis-%%REDIS_VERSION%% \ diff --git a/update.sh b/update.sh index 0f224b06..de9670b3 100755 --- a/update.sh +++ b/update.sh @@ -11,7 +11,6 @@ declare -A debian_version=( declare -A php_version=( [default]='8.2' - [31]='8.3' ) declare -A cmd=( @@ -55,7 +54,7 @@ igbinary_version="$( )" imagick_version="$( - git ls-remote --tags https://github.com/mkoppanen/imagick.git \ + git ls-remote --tags https://github.com/imagick/imagick.git \ | cut -d/ -f3 \ | grep -viE '[a-z]' \ | tr -d '^{}' \ diff --git a/versions.json b/versions.json index 1680b69a..2bfbfa63 100644 --- a/versions.json +++ b/versions.json @@ -9,19 +9,19 @@ "variant": "apache", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.3" + "phpVersion": "8.2" }, "fpm": { "variant": "fpm", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.3" + "phpVersion": "8.2" }, "fpm-alpine": { "variant": "fpm-alpine", "base": "alpine", "baseVersion": "3.21", - "phpVersion": "8.3" + "phpVersion": "8.2" } } }, From a19d68f081fe15700ec12f2fab46dbc456952586 Mon Sep 17 00:00:00 2001 From: J0WI Date: Fri, 18 Apr 2025 13:51:26 +0000 Subject: [PATCH 6/8] Bump stable to 31.0.4 Signed-off-by: J0WI --- generate-stackbrew-library.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate-stackbrew-library.sh b/generate-stackbrew-library.sh index 2b523c0e..14ea578f 100755 --- a/generate-stackbrew-library.sh +++ b/generate-stackbrew-library.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -Eeuo pipefail -stable_channel='30.0.9' +stable_channel='31.0.4' self="$(basename "$BASH_SOURCE")" cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" From 645f515e295c4a7b505c44bc9622d6b158a7b526 Mon Sep 17 00:00:00 2001 From: J0WI Date: Fri, 18 Apr 2025 15:01:40 +0000 Subject: [PATCH 7/8] Restore PHP 8.3 (#2422) Signed-off-by: J0WI --- 30/apache/Dockerfile | 2 +- 30/fpm-alpine/Dockerfile | 2 +- 30/fpm/Dockerfile | 2 +- 31/apache/Dockerfile | 2 +- 31/fpm-alpine/Dockerfile | 2 +- 31/fpm/Dockerfile | 2 +- update.sh | 3 ++- versions.json | 12 ++++++------ 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/30/apache/Dockerfile b/30/apache/Dockerfile index 7b3f2939..31d62217 100644 --- a/30/apache/Dockerfile +++ b/30/apache/Dockerfile @@ -1,5 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.2-apache-bookworm +FROM php:8.3-apache-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ diff --git a/30/fpm-alpine/Dockerfile b/30/fpm-alpine/Dockerfile index 26c5c856..09e10d33 100644 --- a/30/fpm-alpine/Dockerfile +++ b/30/fpm-alpine/Dockerfile @@ -1,5 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template -FROM php:8.2-fpm-alpine3.21 +FROM php:8.3-fpm-alpine3.21 # entrypoint.sh and cron.sh dependencies RUN set -ex; \ diff --git a/30/fpm/Dockerfile b/30/fpm/Dockerfile index 6ef1a6a7..8cbb07d3 100644 --- a/30/fpm/Dockerfile +++ b/30/fpm/Dockerfile @@ -1,5 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.2-fpm-bookworm +FROM php:8.3-fpm-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ diff --git a/31/apache/Dockerfile b/31/apache/Dockerfile index 642be03e..6421c7b0 100644 --- a/31/apache/Dockerfile +++ b/31/apache/Dockerfile @@ -1,5 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.2-apache-bookworm +FROM php:8.3-apache-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ diff --git a/31/fpm-alpine/Dockerfile b/31/fpm-alpine/Dockerfile index 0c9ff741..a20a12e8 100644 --- a/31/fpm-alpine/Dockerfile +++ b/31/fpm-alpine/Dockerfile @@ -1,5 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-alpine.template -FROM php:8.2-fpm-alpine3.21 +FROM php:8.3-fpm-alpine3.21 # entrypoint.sh and cron.sh dependencies RUN set -ex; \ diff --git a/31/fpm/Dockerfile b/31/fpm/Dockerfile index 9eee6cfc..92f3935c 100644 --- a/31/fpm/Dockerfile +++ b/31/fpm/Dockerfile @@ -1,5 +1,5 @@ # DO NOT EDIT: created by update.sh from Dockerfile-debian.template -FROM php:8.2-fpm-bookworm +FROM php:8.3-fpm-bookworm # entrypoint.sh and cron.sh dependencies RUN set -ex; \ diff --git a/update.sh b/update.sh index de9670b3..3128e4a3 100755 --- a/update.sh +++ b/update.sh @@ -10,7 +10,8 @@ declare -A debian_version=( ) declare -A php_version=( - [default]='8.2' + [29]='8.2' + [default]='8.3' ) declare -A cmd=( diff --git a/versions.json b/versions.json index 2bfbfa63..daac9da6 100644 --- a/versions.json +++ b/versions.json @@ -9,19 +9,19 @@ "variant": "apache", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.2" + "phpVersion": "8.3" }, "fpm": { "variant": "fpm", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.2" + "phpVersion": "8.3" }, "fpm-alpine": { "variant": "fpm-alpine", "base": "alpine", "baseVersion": "3.21", - "phpVersion": "8.2" + "phpVersion": "8.3" } } }, @@ -35,19 +35,19 @@ "variant": "apache", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.2" + "phpVersion": "8.3" }, "fpm": { "variant": "fpm", "base": "debian", "baseVersion": "bookworm", - "phpVersion": "8.2" + "phpVersion": "8.3" }, "fpm-alpine": { "variant": "fpm-alpine", "base": "alpine", "baseVersion": "3.21", - "phpVersion": "8.2" + "phpVersion": "8.3" } } }, From 614be2855049e3175d4fdd4cc84cf152382cdb95 Mon Sep 17 00:00:00 2001 From: Kaloyan Nikolov Date: Fri, 18 Apr 2025 18:42:58 +0300 Subject: [PATCH 8/8] Updated examples (#2405) * Updated examples Signed-off-by: Kaloyan Nikolov * Lock examples to PostgreSQL 16 Signed-off-by: Kaloyan Nikolov * Pin postgresql to 16 in Readme example Signed-off-by: Kaloyan Nikolov * Update .examples/docker-compose/insecure/mariadb/apache/compose.yaml Co-authored-by: J0WI Signed-off-by: Kaloyan Nikolov * Update .examples/docker-compose/insecure/postgres/apache/compose.yaml Co-authored-by: J0WI Signed-off-by: Kaloyan Nikolov * Update .examples/docker-compose/insecure/mariadb/fpm/compose.yaml Co-authored-by: J0WI Signed-off-by: Kaloyan Nikolov * Moved some comments on new lines. Signed-off-by: Kaloyan Nikolov * Moved another comment to new line Signed-off-by: Kaloyan Nikolov * Unified across files / updated README file. Signed-off-by: Kaloyan Nikolov * Use canonical links to external services. Signed-off-by: Kaloyan Nikolov --------- Signed-off-by: Kaloyan Nikolov Co-authored-by: J0WI --- .../insecure/mariadb/apache/compose.yaml | 7 ++++- .../insecure/mariadb/fpm/compose.yaml | 15 ++++++++-- .../insecure/mariadb/fpm/web/Dockerfile | 3 -- .../insecure/postgres/apache/compose.yaml | 5 ++++ .../insecure/postgres/fpm/compose.yaml | 13 ++++++-- .../insecure/postgres/fpm/web/Dockerfile | 3 -- .../mariadb/apache/compose.yaml | 17 +++++++---- .../mariadb/apache/proxy/Dockerfile | 2 +- .../with-nginx-proxy/mariadb/fpm/compose.yaml | 22 +++++++++++--- .../mariadb/fpm/proxy/Dockerfile | 2 +- .../mariadb/fpm/web/Dockerfile | 3 -- .../postgres/apache/compose.yaml | 12 +++++++- .../postgres/apache/proxy/Dockerfile | 2 +- .../postgres/fpm/compose.yaml | 22 ++++++++++---- .../postgres/fpm/proxy/Dockerfile | 2 +- .../postgres/fpm/web/Dockerfile | 3 -- README.md | 30 +++++++++++++++---- 17 files changed, 120 insertions(+), 43 deletions(-) delete mode 100644 .examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile delete mode 100644 .examples/docker-compose/insecure/postgres/fpm/web/Dockerfile delete mode 100644 .examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile delete mode 100644 .examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile diff --git a/.examples/docker-compose/insecure/mariadb/apache/compose.yaml b/.examples/docker-compose/insecure/mariadb/apache/compose.yaml index c765190c..c05d7d8e 100644 --- a/.examples/docker-compose/insecure/mariadb/apache/compose.yaml +++ b/.examples/docker-compose/insecure/mariadb/apache/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always diff --git a/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml b/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml index 90520e08..64faef6c 100644 --- a/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml +++ b/.examples/docker-compose/insecure/mariadb/fpm/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -31,14 +36,18 @@ services: - db - redis + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always ports: - 127.0.0.1:8080:80 volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) depends_on: - app diff --git a/.examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile b/.examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/insecure/mariadb/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/.examples/docker-compose/insecure/postgres/apache/compose.yaml b/.examples/docker-compose/insecure/postgres/apache/compose.yaml index 19c75ba4..8ae34013 100644 --- a/.examples/docker-compose/insecure/postgres/apache/compose.yaml +++ b/.examples/docker-compose/insecure/postgres/apache/compose.yaml @@ -1,5 +1,8 @@ services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -7,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always diff --git a/.examples/docker-compose/insecure/postgres/fpm/compose.yaml b/.examples/docker-compose/insecure/postgres/fpm/compose.yaml index 4e268cab..8a88afd4 100644 --- a/.examples/docker-compose/insecure/postgres/fpm/compose.yaml +++ b/.examples/docker-compose/insecure/postgres/fpm/compose.yaml @@ -1,5 +1,8 @@ services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -7,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -26,14 +31,18 @@ services: - db - redis + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always ports: - 127.0.0.1:8080:80 volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) depends_on: - app diff --git a/.examples/docker-compose/insecure/postgres/fpm/web/Dockerfile b/.examples/docker-compose/insecure/postgres/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/insecure/postgres/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml index e1a461d2..e1132818 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -33,9 +38,6 @@ services: depends_on: - db - redis - # Added proxy container dependency below. - # It is unclear on when or why it happens, but sometimes NC manages to start before the proxy - # and it breaks for whatever weird reason resulting in the need of manual proxy container restart. - proxy networks: - proxy-tier @@ -52,6 +54,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -69,6 +74,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -85,7 +92,7 @@ services: depends_on: - proxy -# self signed +# self signed,outdated # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/apache/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml index fa77198a..13d4a40b 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/compose.yaml @@ -1,6 +1,9 @@ services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts command: --transaction-isolation=READ-COMMITTED restart: always volumes: @@ -12,6 +15,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -32,12 +37,16 @@ services: - redis - proxy + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) environment: - VIRTUAL_HOST= - LETSENCRYPT_HOST= @@ -59,6 +68,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -75,6 +87,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -91,7 +105,7 @@ services: depends_on: - proxy -# self signed +# self signed, outdated. # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile b/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/with-nginx-proxy/mariadb/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml b/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml index 2eb4f638..035359f0 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/postgres/apache/compose.yaml @@ -1,5 +1,8 @@ services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -7,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -44,6 +49,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -60,6 +68,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -74,7 +84,7 @@ services: depends_on: - proxy -# self signed +# self signed, outdated # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/postgres/apache/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml index 80be65a6..78654edd 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml +++ b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/compose.yaml @@ -1,7 +1,8 @@ -version: '3' - services: + # Note: PostgreSQL is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server image: postgres:alpine restart: always volumes: @@ -9,6 +10,8 @@ services: env_file: - db.env + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -29,12 +32,16 @@ services: - redis - proxy + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - build: ./web + image: nginx:alpine-slim restart: always volumes: + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./web/nginx.conf:/etc/nginx/nginx.conf:ro + # NOTE: The `volumes` included below should match those of the `app` container (unless you know what you're doing) - nextcloud:/var/www/html:z,ro - # NOTE: The `volumes` included here should match those of the `app` container (unless you know what you're doing) environment: - VIRTUAL_HOST= - LETSENCRYPT_HOST= @@ -56,6 +63,9 @@ services: - db - redis + # Note: Nginx-proxy is an external service. You can find more information about the configuration here: + # Warning: Do not use :latest tags of nginx-proxy unless absolutely sure about the consequences. + # https://hub.docker.com/r/nginxproxy/nginx-proxy proxy: build: ./proxy restart: always @@ -72,6 +82,8 @@ services: networks: - proxy-tier + # Note: Letsencrypt companion is an external service. You can find more information about the configuration here: + # https://hub.docker.com/r/nginxproxy/acme-companion letsencrypt-companion: image: nginxproxy/acme-companion restart: always @@ -88,7 +100,7 @@ services: depends_on: - proxy -# self signed +# self signed, outdated # omgwtfssl: # image: paulczar/omgwtfssl # restart: "no" diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile index 46fc7e26..6f449c7f 100644 --- a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile +++ b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/proxy/Dockerfile @@ -1,3 +1,3 @@ -FROM nginxproxy/nginx-proxy:alpine +FROM nginxproxy/nginx-proxy:1.7-alpine COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf diff --git a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile b/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile deleted file mode 100644 index 9e620aff..00000000 --- a/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:alpine - -COPY nginx.conf /etc/nginx/nginx.conf diff --git a/README.md b/README.md index 7de62124..3be70217 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Database: ```console $ docker run -d \ -v db:/var/lib/mysql \ -mariadb:10.11 +mariadb:lts ``` ### Additional volumes @@ -403,8 +403,11 @@ Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` varia ```yaml services: + # Note: MariaDB is external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts restart: always command: --transaction-isolation=READ-COMMITTED volumes: @@ -415,6 +418,8 @@ services: - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -451,8 +456,11 @@ Make sure to pass in values for `MYSQL_ROOT_PASSWORD` and `MYSQL_PASSWORD` varia ```yaml services: + # Note: MariaDB is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/mariadb db: - image: mariadb:10.11 + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: mariadb:lts restart: always command: --transaction-isolation=READ-COMMITTED volumes: @@ -463,6 +471,8 @@ services: - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always @@ -481,15 +491,18 @@ services: - MYSQL_USER=nextcloud - MYSQL_HOST=db + # Note: Nginx is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/nginx/ web: - image: nginx + image: nginx:alpine-slim restart: always ports: - 8080:80 depends_on: - app volumes: - - ./nginx.conf:/etc/nginx/nginx.conf:ro + # https://docs.nextcloud.com/server/latest/admin_manual/installation/nginx.html + - ./nginx.conf:/etc/nginx/nginx.conf:ro volumes_from: - app @@ -514,8 +527,11 @@ Example: ```yaml services: + # Note: PostgreSQL is external service. You can find more information about the configuration here: + # https://hub.docker.com/_/postgres db: - image: postgres + # Note: Check the recommend version here: https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server + image: postgres:alpine restart: always volumes: - db:/var/lib/postgresql/data @@ -527,6 +543,8 @@ services: - postgres_db - postgres_password - postgres_user + # Note: Redis is an external service. You can find more information about the configuration here: + # https://hub.docker.com/_/redis redis: image: redis:alpine restart: always