deploy/Dockerfile.windows
###############################################################################
# README
###############################################################################
# This Dockerfile prepares a docker image with MobileRT.
#
# It setups MobileRT by fetching it from git and compiling it using the
# `compile_native.sh` script inside the docker image.
# The script `compile_native.sh` compiles the MobileRT.
#
# At the moment, this Dockerfile allows to setup MobileRT inside a docker image
# based on Windows Operating Systems:
# * Windows Server Core
###############################################################################
###############################################################################
###############################################################################
# Set base docker image
###############################################################################
ARG BASE_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2022
FROM ${BASE_IMAGE}
###############################################################################
###############################################################################
###############################################################################
# Setup arguments
###############################################################################
ARG BUILD_TYPE=release
ARG BRANCH=master
###############################################################################
###############################################################################
###############################################################################
# Define cmd as shell
###############################################################################
SHELL ["cmd", "/S", "/V:ON", "/E:ON", "/C"]
###############################################################################
###############################################################################
###############################################################################
# Install git & setup environment
###############################################################################
# Users: https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-change-the-user-account-for-windows-containers/ba-p/3601571
USER ContainerAdministrator
# Set system environment variables. ContainerAdministrator must be used so the change is persisted in the image.
# Set lib path. Windows doesn't use LD_LIBRARY_PATH, but use PATH instead.
ENV \
PATH="C:\\MobileRT\\binariesShell;C:\\Windows;C:\\Windows\\System32;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\ProgramData\\chocolatey\\bin;C:\\MobileRT\\binariesResourceCompiler;C:\\MobileRT\\libraries;C:\\MobileRT\\build_${BUILD_TYPE}\\lib;C:\\Programs\\Git\\bin;C:\\Git-LFS;C:\\Programs\\CMake\\bin;${PATH}" \
RC="rc" \
CXX="g++" \
CC="gcc" \
CXXFLAGS="-O3 -std=c++11" \
BUILD_TYPE="${BUILD_TYPE}" \
CL="/MP"
RUN \
mklink /J "C:\\Programs" "C:\\Program Files" && \
mklink /J "C:\\Git-LFS" "C:\\Program Files\\Git LFS" && \
set && \
# Install chocolatey Package Manager.
powershell -NoProfile -ExecutionPolicy Bypass -Command " \
Write-Host "Setting up DNS"; \
$ErrorActionPreference = 'Stop'; \
$ProgressPreference = 'Continue'; \
$verbosePreference = 'Continue'; \
Get-NetIPInterface -AddressFamily IPv4 | Sort-Object -Property InterfaceMetric -Descending; \
netsh interface ipv4 set dnsserver 17 static address=8.8.8.8 register=primary; \
$env:chocolateyUseWindowsCompression = 'true'; \
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB=\"2048\"}'; \
Set-ExecutionPolicy Bypass -Scope Process -Force; \
Write-Host "Setting up Network protocol"; \
[Net.ServicePointManager]::SecurityProtocol; \
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; \
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \
[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials; \
[Net.ServicePointManager]::SecurityProtocol; \
Write-Host "Downloading chocolatey"; \
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')); \
" && \
# Install git: https://community.chocolatey.org/packages/git
choco install -y git && \
# Configure git.
git config --system https.postBuffer 1048576000 && \
git config --system --add safe.directory C:/MobileRT && \
echo "Configured git." && \
set
USER ContainerUser
###############################################################################
###############################################################################
###############################################################################
# Get MobileRT contents (required to create docker image in CI)
###############################################################################
RUN \
git --version && \
# Clone repository.
git clone https://github.com/TiagoMSSantos/MobileRT.git \
--shallow-submodules \
--progress \
--branch !BRANCH! && \
cd MobileRT && \
dir P* /X .\\app\\src\\androidTest\\resources\\CornellBox\\CornellBox-Water.obj && \
dir P* /X .\\app\\src\\androidTest\\resources\\teapot\\teapot.obj && \
# Print environment.
echo "BRANCH: !BRANCH!" && \
echo "BUILD_TYPE: !BUILD_TYPE!"
###############################################################################
###############################################################################
###############################################################################
# Copy necessary tools to docker image
###############################################################################
COPY tools MobileRT
WORKDIR MobileRT
###############################################################################
###############################################################################
###############################################################################
# Install dependencies
###############################################################################
USER ContainerAdministrator
RUN \
dir P* /X .\\binariesShell\\sh.exe && \
dir P* /X .\\binariesShell\\cut.exe && \
dir P* /X .\\binariesShell\\ls.exe && \
dir P* /X .\\binariesShell\\timeout.exe && \
dir P* /X . && \
ls -la . && \
ls -la ./binariesShell && \
ls -la ./binariesResourceCompiler && \
set && \
sh scripts/install_dependencies.sh && \
icacls "C:\MobileRT" /c /t /grant:r "Authenticated Users":(OI)(CI)F && \
sh -c "echo ${PWD} && ls -la /Qt | grep '[[:digit:]]\.[[:digit:]].*' | awk '{print $(NF)}' | head -1 > qt_version.txt && cat qt_version.txt" && \
for /f "delims=" %x in ('type qt_version.txt') do set QT_VERSION="%x" && \
setx /M QT_VERSION "!QT_VERSION: =!"
RUN \
dir P* /X C:\Qt\!QT_VERSION!\mingw81_64\bin\qmake.exe && \
setx /M PATH "C:\\Qt\\!QT_VERSION!\\mingw81_64\\bin;!PATH!" && \
setx /M Qt5_DIR "C:\\Qt\\!QT_VERSION!\\mingw81_64\\lib\\cmake\\Qt5" && \
setx /M CPLUS_INCLUDE_PATH "C:\\Qt\\!QT_VERSION!\\mingw81_64\\include;C:\\Qt\\!QT_VERSION!\\mingw81_64\\include\\QtWidgets;C:\\Qt\\!QT_VERSION!\\mingw81_64\\include\\QtGui;C:\\Qt\\!QT_VERSION!\\mingw81_64\\include\\QtCore"
USER ContainerUser
# Add environment variables in ContainerUser to also work with BuildKit
ENV QT_VERSION="5.15.2"
ENV \
PATH="C:\\Qt\\${QT_VERSION}\\mingw81_64\\bin;${PATH}" \
Qt5_DIR="C:\\Qt\\${QT_VERSION}\\mingw81_64\\lib\\cmake\\Qt5" \
CPLUS_INCLUDE_PATH="C:\\Qt\\${QT_VERSION}\\mingw81_64\\include;C:\\Qt\\${QT_VERSION}\\mingw81_64\\include\\QtWidgets;C:\\Qt\\${QT_VERSION}\\mingw81_64\\include\\QtGui;C:\\Qt\\${QT_VERSION}\\mingw81_64\\include\\QtCore"
###############################################################################
###############################################################################
###############################################################################
# Compile MobileRT
###############################################################################
RUN \
# Test commands
set && \
dir P* /X . && \
choco /? && \
rc /? && \
qmake --help && \
sh scripts/compile_native.sh -t !BUILD_TYPE! -c g++ -r yes && \
du -h -d 1 build_!BUILD_TYPE!/bin && \
du -h -d 1 build_!BUILD_TYPE!/lib && \
rm -rfv docs && \
rm -rfv documentation && \
rm -rfv git-hooks && \
rm -rfv gradle && \
rm -rfv .git && \
ls -la ./app/src/androidTest/resources/CornellBox/CornellBox-Water.obj && \
ls -la ./app/src/androidTest/resources/CornellBox/CornellBox-Water.mtl && \
ls -la ./app/src/androidTest/resources/CornellBox/CornellBox-Water.cam && \
ls -la ./app/src/androidTest/resources/teapot/teapot.obj && \
ls -la ./app/src/androidTest/resources/teapot/teapot.mtl && \
ls -la ./app/src/androidTest/resources/teapot/teapot.cam && \
ls -la ./binariesShell && \
ls -la ./binariesResourceCompiler && \
set && \
ls -la . && \
cd
###############################################################################
###############################################################################
###############################################################################
# Execute MobileRT by default
###############################################################################
ENTRYPOINT ["cmd", "/S", "/V:ON", "/E:ON", "/C", "sh", "-c"]
CMD ["sh scripts/profile.sh !BUILD_TYPE!"]
###############################################################################
###############################################################################