diff --git a/Dockerfile b/Dockerfile
index 54aabd355baf1fc0a88b7b006d73c19a1be08ae5..0e0671f1478531ddf21f801fd70e6d7c2cfc7e97 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -11,18 +11,23 @@ LABEL maintainer="Max Reinheimer <max@reinheimer.dev>" \
       description="A GitLab runner image with openstack custom executor." \
       io.k8s.description="A GitLab runner image with openstack custom executor."
 
-COPY cleanup.py env.py config.sh prepare.py run.py requirements.txt /data/
-COPY entrypoint.sh /usr/bin/entrypoint
+COPY requirements.txt /data/
+
+WORKDIR /data
 
 RUN apt-get update && apt-get -y install curl dumb-init gcc libffi-dev && \
     curl -L --output /usr/bin/gitlab-runner "${GITLAB_RUNNER_URL}" && \
     pip3 install -r /data/requirements.txt && \
-    chmod +x /data/* /usr/bin/entrypoint /usr/bin/gitlab-runner && \
+    chmod +x /usr/bin/gitlab-runner && \
     useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash && \
     apt-get remove -y gcc curl && apt autoremove -y && apt-get clean
 
+COPY cleanup.py env.py config.sh prepare.py run.py /data/
+COPY entrypoint.sh /usr/bin/entrypoint
+
+RUN chmod +x /data/* /usr/bin/entrypoint
+
 USER gitlab-runner
-WORKDIR /data
 
 ENTRYPOINT ["dumb-init", "--"]
 CMD ["entrypoint"]
diff --git a/entrypoint.sh b/entrypoint.sh
index 9fba9a8bce0ab08a50d781eadbfefc078b5277e4..bff9d067c992747a790f610a20faae7857ed3b62 100644
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-trap cleanup SIGTERM
+trap cleanup SIGTERM SIGINT
 
 cleanup() {
     gitlab-runner unregister --all-runners
diff --git a/env.py b/env.py
index 487f8880336a0d355e9ec174e474d15ad7bfabc5..bc34c6bf834e92e39aca9cb4b1edbfaa9d2ed18c 100644
--- a/env.py
+++ b/env.py
@@ -9,7 +9,8 @@ KEY_PAIR_NAME = os.getenv("CUSTOM_ENV_KEY_PAIR_NAME") or os.getenv("KEY_PAIR_NAM
 SECURITY_GROUPS = os.getenv("CUSTOM_ENV_SECURITY_GROUPS") or os.getenv("SECURITY_GROUPS")
 USERNAME = os.getenv("CUSTOM_ENV_USERNAME") or os.getenv("USERNAME")
 PRIVATE_KEY_PATH = f"{os.getenv('HOME')}/priv_key"
-SSH_TIMEOUT = os.getenv("CUSTOM_ENV_SSH_TIMEOUT") or os.getenv("SSH_TIMEOUT") or "30"
-
+SSH_TIMEOUT = os.getenv("CUSTOM_ENV_SSH_TIMEOUT") or os.getenv("SSH_TIMEOUT") or "20"
+FLOATING_IP_NETWORK = os.getenv("FLOATING_IP_NETWORK") or "public"
+SSH_IP_VERSION = os.getenv("SSH_IP_VERSION") or "4"
 BUILD_FAILURE_EXIT_CODE = os.getenv("BUILD_FAILURE_EXIT_CODE")
 SYSTEM_FAILURE_EXIT_CODE = os.getenv("SYSTEM_FAILURE_EXIT_CODE")
diff --git a/prepare.py b/prepare.py
index 23885c2ba60340fbaff1b41f2cf2933ea9692477..ec2e3bd7d8db2d99dd7fe871e255619e38e79d43 100644
--- a/prepare.py
+++ b/prepare.py
@@ -26,13 +26,22 @@ def provision_server(
         security_groups=[{"name": group} for group in env.SECURITY_GROUPS.split()],
         networks=[{"uuid": network.id}],
     )
-    return conn.compute.wait_for_server(server, wait=600)
+    server =  conn.compute.wait_for_server(server, wait=600)
+
+    if env.SSH_IP_VERSION == "4":
+        ips = conn.available_floating_ip(network=env.FLOATING_IP_NETWORK, server=server)
+        conn.compute.add_floating_ip_to_server(server, ips.floating_ip_address, fixed_address=None)
+    
+    return server
 
 
 def get_server_ip(
     conn: openstack.connection.Connection, server: openstack.compute.v2.server.Server
 ) -> str:
-    return list(conn.compute.server_ips(server))[0].address
+    if env.SSH_IP_VERSION == "4":
+        return list(conn.compute.server_ips(server))[2].address
+    else:
+        return list(conn.compute.server_ips(server))[0].address
 
 
 def check_ssh(ip: str) -> None:
diff --git a/run.py b/run.py
index 7a4ba7bfb9007550df54669734822e70cc774231..b82221f14ba3ca5cb16f6f1cc122feefda566ea5 100644
--- a/run.py
+++ b/run.py
@@ -9,7 +9,10 @@ import env
 
 def get_server_ip(conn: openstack.connection.Connection) -> str:
     server = list(conn.compute.servers(name=env.VM_NAME, status="ACTIVE"))[0]
-    return list(conn.compute.server_ips(server))[0].address
+    if env.SSH_IP_VERSION == "4":
+        return list(conn.compute.server_ips(server))[2].address
+    else:
+        return list(conn.compute.server_ips(server))[0].address
 
 
 def execute_script_on_server(ssh: paramiko.client.SSHClient, script_path: str) -> int: