From d5e5072f6aeb33d84d11017b76af259c80365195 Mon Sep 17 00:00:00 2001 From: cgbautista Date: Tue, 29 Jul 2025 16:09:44 +0200 Subject: [PATCH 1/2] Fix upgrade argument, since it didn't perform the major_version check to choose between the different tomcat/java versions and tried to use `docker build` with 3 different Dockerfile in 3 subfolders Moved the sleep in wait_for_server to let docker start nginx before trying to connect to it (raising an exception). Even in the best case scenario in which nginx would start before reaching this code, tomcat would likely take a little extra to be ready, so the sleep will take place at least once (usually several times, since a migration would include some SQL to be run before tomcat would be in a ready state and until then a 502 error would be generated each time it is tested) --- setup.py | 2 +- src/d2_docker/commands/create.py | 22 ++-------------------- src/d2_docker/commands/upgrade.py | 2 +- src/d2_docker/utils.py | 26 +++++++++++++++++++++++++- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/setup.py b/setup.py index 423e8ad..ac4b464 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ setuptools.setup( name="d2_docker", - version="1.16.0", + version="1.16.1", description="Dockers for DHIS2 instances", long_description=open("README.md", encoding="utf-8").read(), keywords=["python"], diff --git a/src/d2_docker/commands/create.py b/src/d2_docker/commands/create.py index e06fa15..4352875 100644 --- a/src/d2_docker/commands/create.py +++ b/src/d2_docker/commands/create.py @@ -46,26 +46,8 @@ def create_core(args): def get_core_build_dir(args): base_dir = utils.get_docker_directory("core", args) - major_version = get_major_version(args.version or args.war) - utils.logger.info("DHIS2 major version: {}".format(major_version or "-")) - - if not major_version: - raise utils.D2DockerError("Cannot get version from --version or --war") - else: - if major_version >= 42: - return os.path.join(base_dir, "java-17-tomcat-10") - elif major_version >= 41: - return os.path.join(base_dir, "java-17") - else: - return os.path.join(base_dir, "java-11") - - -def get_major_version(s): - """Return major DHIS2 version. Ex: "2.38.4" -> "38". "40.1.2" -> 40.""" - match = re.search(r"(\d+\.\d+)", s) - if not match: return None - parts = [int(s) for s in match.groups()[0].split(".")] - return parts[1] if parts[0] == 2 else parts[0] + major_version = utils.get_major_version(args.version or args.war) + return utils.get_core_java_dir(base_dir, major_version) def create_data(args): diff --git a/src/d2_docker/commands/upgrade.py b/src/d2_docker/commands/upgrade.py index aaac7f2..fffa8df 100644 --- a/src/d2_docker/commands/upgrade.py +++ b/src/d2_docker/commands/upgrade.py @@ -68,7 +68,7 @@ def upgrade_to_version( ) war_exists = dhis_war_path and os.path.exists(dhis_war_path) create_core_kwargs = dict(war=dhis_war_path) if war_exists else dict(version=version) - core_docker_dir = utils.get_docker_directory("core") + core_docker_dir = utils.get_core_java_dir(utils.get_docker_directory("core"), utils.get_major_version(version)) utils.create_core( docker_dir=core_docker_dir, image=core_image, diff --git a/src/d2_docker/utils.py b/src/d2_docker/utils.py index 0442a6c..8f94765 100644 --- a/src/d2_docker/utils.py +++ b/src/d2_docker/utils.py @@ -68,6 +68,28 @@ def copytree(source, dest): dir_util.copy_tree(source, dest) +def get_core_java_dir(base_dir, major_version): + logger.info("DHIS2 major version: {}".format(major_version or "-")) + + if not major_version: + raise D2DockerError("Cannot get version from --version or --war") + else: + if major_version >= 42: + return os.path.join(base_dir, "java-17-tomcat-10") + elif major_version >= 41: + return os.path.join(base_dir, "java-17") + else: + return os.path.join(base_dir, "java-11") + + +def get_major_version(s): + """Return major DHIS2 version. Ex: "2.38.4" -> "38". "40.1.2" -> 40.""" + match = re.search(r"(\d+\.\d+)", s) + if not match: return None + parts = [int(s) for s in match.groups()[0].split(".")] + return parts[1] if parts[0] == 2 else parts[0] + + def run( command_parts, raise_on_error=True, @@ -606,6 +628,9 @@ def wait_for_server(port): url = "http://localhost:{}".format(port) while True: + # This functions is called right after a "docker up", which takes a little to be able to start the nginx (and way longer for the tomcat to be ready), + # so to avoid calling before nginx can accept connections (and raising an exception) just move the sleep to be the first step + time.sleep(5) try: logger.debug("wait_for_server:url={}".format(url)) urllib.request.urlopen(url) # nosec @@ -619,7 +644,6 @@ def wait_for_server(port): except urllib.request.URLError as exc: logger.debug("wait_for_server:url-error: {}".format(exc.reason)) - time.sleep(5) def create_core( From c00c6faa072b5364d2985c5f335af18d6a8d20c0 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Bautista Date: Wed, 24 Dec 2025 16:03:50 +0100 Subject: [PATCH 2/2] This version change should not have been increased in this stage --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ac4b464..423e8ad 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ setuptools.setup( name="d2_docker", - version="1.16.1", + version="1.16.0", description="Dockers for DHIS2 instances", long_description=open("README.md", encoding="utf-8").read(), keywords=["python"],