blob: fb33dc17917e7d7d087bff68defa9506acec04be (
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
44
45
|
"""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 import python_version
DOCKERFILE_TEMPLATE = Path("scripts/in.Dockerfile").read_text("utf-8")
DOCKERFILE = Path("Dockerfile")
versions, main_version = python_version.get_all_versions()
# Download and copy multiple python images into one layer
python_build = ""
previous_layer = "first"
for version in 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!")
|