aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/set_versions.py
blob: 3bd2ab444bc4e96588d8337416c264ad92d2e43b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
"""Generate a Dockerfile from in.Dockerfile and a version JSON file, and write version info."""

from pathlib import Path
from textwrap import dedent

from scripts.python_version import ALL_VERSIONS, MAIN_VERSION

DOCKERFILE_TEMPLATE = Path("scripts/in.Dockerfile").read_text("utf-8")
DOCKERFILE = Path("Dockerfile")

# Download and copy multiple python images into one layer
python_build = ""
previous_layer = "first"

for version in ALL_VERSIONS:
    if version.is_main:
        # Main is handled separately later
        continue

    # Add the current version to the Dockerfile
    layer_name = version.version_name.replace(".", "-")  # Dots aren't valid in layer names
    python_build += dedent(
        f"""
        FROM python:{version.image_tag} as base-{layer_name}
        COPY --from=base-{previous_layer} / /
    """
    )
    previous_layer = layer_name

# Main version is installed twice, once at the very beginning to make sure
# its files aren't overwritten, and once at the end which actually makes use of the version
python_build = f"FROM python:{MAIN_VERSION.image_tag} as base-first\n" + python_build

# Write new dockerfile
DOCKERFILE.write_text(
    "# THIS FILE IS AUTOGENERATED, DO NOT MODIFY! #\n"
    + DOCKERFILE_TEMPLATE.replace("{python_install_commands}", python_build)
    .replace("{final_base}", previous_layer)
    .replace("{main_version_tag}", MAIN_VERSION.image_tag),
    "utf-8",
)

print("Finished!")