Skip to content

Commit 035260b

Browse files
committed
Multi-stage cache system & powershell for nano image
1 parent f2da3af commit 035260b

File tree

1 file changed

+121
-38
lines changed

1 file changed

+121
-38
lines changed

Dockerfile

Lines changed: 121 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,144 @@
1+
# syntax=docker/dockerfile:1
12
# escape=`
23

3-
FROM --platform=windows/amd64 mcr.microsoft.com/windows/servercore:ltsc2022 AS BUILD_TOOLS
4+
# ---------------- GLOBAL VARS ----------------
5+
ARG CMAKE_VERSION=3.31.0
6+
ARG PYTHON_VERSION=3.11.0
7+
ARG NINJA_VERSION=1.12.1
8+
ARG NASM_VERSION=2.16.03
9+
ARG GIT_VERSION=2.48.1
10+
ARG WINDOWS_11_SDK_VERSION=22621
11+
ARG WINDOWS_SDK_VERSION=10.0.${WINDOWS_11_SDK_VERSION}.0
12+
ARG VC_VERSION=14.42.17.12
13+
ARG MSVC_VERSION=14.42.34433
14+
15+
ARG IMPL_ARTIFACTS_DIR="C:\artifacts"
16+
ARG IMPL_NANO_BASE=mcr.microsoft.com/powershell
17+
ARG IMPL_NANO_TAG=lts-nanoserver-ltsc2022
418

5-
ARG WINDOWS_11_SDK_VERSION="22621"
6-
ARG VC_VERSION="14.42.17.12"
7-
ARG MSVC_VERSION="14.42.34433"
19+
# ---------------- BUILD TOOLS ----------------
20+
FROM mcr.microsoft.com/windows/servercore:ltsc2022 as buildtools
821

9-
ENV WINDOWS_11_SDK_VERSION=${WINDOWS_11_SDK_VERSION} VC_VERSION=${VC_VERSION} MSVC_VERSION=${MSVC_VERSION} BUILD_TOOLS_DIR="C:\artifacts"
22+
ARG WINDOWS_11_SDK_VERSION
23+
ARG VC_VERSION
24+
ARG MSVC_VERSION
25+
ARG IMPL_ARTIFACTS_DIR
1026

1127
RUN mkdir C:\Temp && cd C:\Temp `
1228
&& curl -SL --output vs_buildtools.exe https://aka.ms/vs/17/release/vs_buildtools.exe `
1329
&& (start /w vs_buildtools.exe --quiet --wait --norestart --nocache `
1430
--remove Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
1531
--add Microsoft.VisualStudio.Component.VC.%VC_VERSION%.x86.x64 `
1632
--add Microsoft.VisualStudio.Component.Windows11SDK.%WINDOWS_11_SDK_VERSION% `
17-
--installPath %BUILD_TOOLS_DIR% `
33+
--installPath %IMPL_ARTIFACTS_DIR% `
1834
|| IF "%ERRORLEVEL%"=="3010" EXIT 0) `
19-
&& dir %BUILD_TOOLS_DIR%\VC\Tools\MSVC `
20-
&& if exist %BUILD_TOOLS_DIR%\VC\Tools\MSVC\%MSVC_VERSION% ( `
21-
for /d %i in (%BUILD_TOOLS_DIR%\VC\Tools\MSVC\*) do if /I not "%i"=="%BUILD_TOOLS_DIR%\VC\Tools\MSVC\%MSVC_VERSION%" rd /s /q "%i" `
35+
&& dir %IMPL_ARTIFACTS_DIR%\VC\Tools\MSVC `
36+
&& if exist %IMPL_ARTIFACTS_DIR%\VC\Tools\MSVC\%MSVC_VERSION% ( `
37+
for /d %i in (%IMPL_ARTIFACTS_DIR%\VC\Tools\MSVC\*) do if /I not "%i"=="%IMPL_ARTIFACTS_DIR%\VC\Tools\MSVC\%MSVC_VERSION%" rd /s /q "%i" `
2238
) else ( `
2339
echo "Error: Expected MSVC version directory %MSVC_VERSION% does not exist!" && exit /b 1 `
2440
)
2541

26-
RUN (echo { "WINDOWS_SDK_VERSION": "10.0.%WINDOWS_11_SDK_VERSION%.0", "VC_VERSION": "%VC_VERSION%", "MSVC_VERSION": "%MSVC_VERSION%" }) > %BUILD_TOOLS_DIR%\env.json
42+
# ---------------- CMAKE ----------------
43+
FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as cmake
44+
SHELL ["pwsh", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
2745

28-
FROM mcr.microsoft.com/windows/nanoserver:ltsc2022
46+
ARG CMAKE_VERSION
47+
ARG IMPL_ARTIFACTS_DIR
2948

30-
ARG BUILD_TOOLS_DIR="C:\BuildTools"
31-
ARG WINDOWS_KITS_10_DIR="C:\WindowsKits10SDK"
32-
ARG CMAKE_VERSION=3.31.0
33-
ARG CMAKE_DIR="C:\CMake"
34-
ARG PYTHON_VERSION=3.11.0
35-
ARG PYTHON_DIR="C:\Python"
36-
ARG NINJA_VERSION=1.12.1
37-
ARG NINJA_DIR="C:\Ninja"
38-
ARG NASM_VERSION=2.16.03
39-
ARG NASM_DIR="C:\Nasm"
49+
RUN Write-Host "Installing CMake $env:CMAKE_VERSION" ; `
50+
New-Item -ItemType Directory -Force -Path C:\Temp, $env:IMPL_ARTIFACTS_DIR ; `
51+
Invoke-WebRequest -Uri "https://github.com/Kitware/CMake/releases/download/v$env:CMAKE_VERSION/cmake-$env:CMAKE_VERSION-windows-x86_64.zip" -OutFile C:\Temp\cmake.zip ; `
52+
tar -xf C:\Temp\cmake.zip -C $env:IMPL_ARTIFACTS_DIR ; `
53+
Remove-Item C:\Temp\cmake.zip
54+
55+
# ---------------- PYTHON ----------------
56+
FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as python
57+
SHELL ["pwsh", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
58+
59+
ARG PYTHON_VERSION
60+
ARG IMPL_ARTIFACTS_DIR
61+
62+
RUN Write-Host "Installing Python $env:PYTHON_VERSION" ; `
63+
New-Item -ItemType Directory -Force -Path C:\Temp, $env:IMPL_ARTIFACTS_DIR ; `
64+
Invoke-WebRequest -Uri "https://www.python.org/ftp/python/$env:PYTHON_VERSION/python-$env:PYTHON_VERSION-embed-amd64.zip" -OutFile C:\Temp\python.zip ; `
65+
tar -xf C:\Temp\python.zip -C $env:IMPL_ARTIFACTS_DIR ; `
66+
Remove-Item C:\Temp\python.zip
67+
68+
# ---------------- NINJA ----------------
69+
FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as ninja
70+
SHELL ["pwsh", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
71+
72+
ARG NINJA_VERSION
73+
ARG IMPL_ARTIFACTS_DIR
74+
75+
RUN Write-Host "Installing Ninja $env:NINJA_VERSION" ; `
76+
New-Item -ItemType Directory -Force -Path C:\Temp, $env:IMPL_ARTIFACTS_DIR ; `
77+
Invoke-WebRequest -Uri "https://github.com/ninja-build/ninja/releases/download/v$env:NINJA_VERSION/ninja-win.zip" -OutFile C:\Temp\ninja.zip ; `
78+
tar -xf C:\Temp\ninja.zip -C $env:IMPL_ARTIFACTS_DIR ; `
79+
Remove-Item C:\Temp\ninja.zip
80+
81+
# ---------------- NASM ----------------
82+
FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as nasm
83+
SHELL ["pwsh", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
84+
85+
ARG NASM_VERSION
86+
ARG IMPL_ARTIFACTS_DIR
87+
88+
RUN Write-Host "Installing NASM $env:NASM_VERSION" ; `
89+
New-Item -ItemType Directory -Force -Path C:\Temp, $env:IMPL_ARTIFACTS_DIR ; `
90+
Invoke-WebRequest -Uri "https://www.nasm.us/pub/nasm/releasebuilds/$env:NASM_VERSION/win64/nasm-$env:NASM_VERSION-win64.zip" -OutFile C:\Temp\nasm.zip ; `
91+
tar -xf C:\Temp\nasm.zip -C $env:IMPL_ARTIFACTS_DIR ; `
92+
Remove-Item C:\Temp\nasm.zip
93+
94+
# ---------------- GIT ----------------
95+
FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG} as git
96+
SHELL ["pwsh", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
97+
98+
ARG GIT_VERSION
99+
ARG IMPL_ARTIFACTS_DIR
100+
101+
RUN Write-Host "Installing Git $env:GIT_VERSION" ; `
102+
New-Item -ItemType Directory -Force -Path C:\Temp, $env:IMPL_ARTIFACTS_DIR ; `
103+
Invoke-WebRequest -Uri "https://github.com/git-for-windows/git/releases/download/v$env:GIT_VERSION.windows.1/MinGit-$env:GIT_VERSION-busybox-64-bit.zip" -OutFile C:\Temp\git.zip ; `
104+
tar -xf C:\Temp\git.zip -C $env:IMPL_ARTIFACTS_DIR ; `
105+
Remove-Item C:\Temp\git.zip
40106

41-
COPY --link --from=BUILD_TOOLS ["C:/Program Files (x86)/Windows Kits/10", "${WINDOWS_KITS_10_DIR}"]
42-
COPY --link --from=BUILD_TOOLS ["C:/artifacts", "${BUILD_TOOLS_DIR}"]
107+
# ---------------- FINAL IMAGE ----------------
108+
FROM ${IMPL_NANO_BASE}:${IMPL_NANO_TAG}
109+
SHELL ["pwsh", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command"]
43110

44-
ENV CMAKE_WINDOWS_KITS_10_DIR=${WINDOWS_KITS_10_DIR} BUILD_TOOLS_DIR=${BUILD_TOOLS_DIR} `
45-
CMAKE_VERSION=${CMAKE_VERSION} CMAKE_URL=https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-windows-x86_64.zip CMAKE_DIR=${CMAKE_DIR} `
46-
PYTHON_VERSION=${PYTHON_VERSION} PYTHON_URL=https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-embed-amd64.zip PYTHON_DIR=${PYTHON_DIR} `
47-
NINJA_VERSION=${NINJA_VERSION} NINJA_URL=https://github.com/ninja-build/ninja/releases/download/v${NINJA_VERSION}/ninja-win.zip NINJA_DIR=${NINJA_DIR} `
48-
NASM_VERSION=${NASM_VERSION} NASM_URL=https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}/win64/nasm-${NASM_VERSION}-win64.zip NASM_DIR=${NASM_DIR}
111+
ARG IMPL_ARTIFACTS_DIR
112+
COPY --link --from=buildtools ["C:/Program Files (x86)/Windows Kits/10", "C:/WindowsKits10SDK"]
113+
COPY --link --from=buildtools ["${IMPL_ARTIFACTS_DIR}", "C:/BuildTools"]
114+
COPY --link --from=cmake ["${IMPL_ARTIFACTS_DIR}", "C:/CMake"]
115+
COPY --link --from=python ["${IMPL_ARTIFACTS_DIR}", "C:/Python"]
116+
COPY --link --from=ninja ["${IMPL_ARTIFACTS_DIR}", "C:/Ninja"]
117+
COPY --link --from=nasm ["${IMPL_ARTIFACTS_DIR}", "C:/Nasm"]
118+
COPY --link --from=git ["${IMPL_ARTIFACTS_DIR}", "C:/Git"]
49119

50-
RUN mkdir C:\Temp && cd C:\Temp && mkdir "%CMAKE_DIR%" && curl -SL --output cmake.zip %CMAKE_URL% && tar -xf cmake.zip -C "%CMAKE_DIR%" && del cmake.zip
51-
RUN cd C:\Temp && mkdir "%PYTHON_DIR%" && curl -SL --output python.zip %PYTHON_URL% && tar -xf python.zip -C "%PYTHON_DIR%" && del python.zip
52-
RUN cd C:\Temp && mkdir "%NINJA_DIR%" && curl -SL --output ninja.zip %NINJA_URL% && tar -xf ninja.zip -C "%NINJA_DIR%" && del ninja.zip
53-
RUN cd C:\Temp && mkdir "%NASM_DIR%" && curl -SL --output nasm.zip %NASM_URL% && tar -xf nasm.zip -C "%NASM_DIR%" && del nasm.zip
120+
ARG CMAKE_VERSION
121+
ARG PYTHON_VERSION
122+
ARG NINJA_VERSION
123+
ARG NASM_VERSION
124+
ARG GIT_VERSION
125+
ARG WINDOWS_11_SDK_VERSION
126+
ARG WINDOWS_SDK_VERSION
127+
ARG VC_VERSION
128+
ARG MSVC_VERSION
54129

55-
RUN cd %BUILD_TOOLS_DIR% && "%PYTHON_DIR%\python.exe" -c "import json, os; env=json.load(open('./env.json')); [os.system(f'setx {k} \"{v}\"') for k,v in env.items()]" `
56-
&& setx PATH "%CMAKE_DIR%\cmake-%CMAKE_VERSION%-windows-x86_64\bin;%PYTHON_DIR%;%NINJA_DIR%;%NASM_DIR%\nasm-%NASM_VERSION%;%PATH%" `
57-
&& setx MSVC_TOOLSET_DIR "%BUILD_TOOLS_DIR%\VC\Tools\MSVC\%MSVC_VERSION%"
130+
USER ContainerAdministrator
131+
ENV CMAKE_WINDOWS_KITS_10_DIR="C:\WindowsKits10SDK" `
132+
CMAKE_VERSION=${CMAKE_VERSION} `
133+
PYTHON_VERSION=${PYTHON_VERSION} `
134+
NINJA_VERSION=${NINJA_VERSION} `
135+
NASM_VERSION=${NASM_VERSION} `
136+
GIT_VERSION=${GIT_VERSION} `
137+
WINDOWS_11_SDK_VERSION=${WINDOWS_11_SDK_VERSION} `
138+
WINDOWS_SDK_VERSION=${WINDOWS_SDK_VERSION} `
139+
VC_VERSION=${VC_VERSION} `
140+
MSVC_VERSION=${MSVC_VERSION} `
141+
MSVC_TOOLSET_DIR=C:\BuildTools\VC\Tools\MSVC\${MSVC_VERSION} `
142+
PATH="C:\Windows\system32;C:\Windows;C:\Program Files\PowerShell;C:\Git\cmd;C:\Git\bin;C:\Git\usr\bin;C:\Git\mingw64\bin;C:\CMake\cmake-${CMAKE_VERSION}-windows-x86_64\bin;C:\Python;C:\Nasm;C:\Nasm\nasm-${NASM_VERSION};"
58143

59-
SHELL ["cmd", "/c"]
60-
ENTRYPOINT ["cmd"]
61-
CMD ["/noexit"]
144+
CMD ["pwsh.exe", "-NoLogo", "-NoProfile", "-ExecutionPolicy", "Bypass"]

0 commit comments

Comments
 (0)