# syntax=docker/dockerfile:1 # escape=` ARG OS_BASE_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2022 ARG GIT_VERSION=2.52.0 ARG NASM_VERSION=3.01 ARG VS_BUILDTOOLS_VERSION=17 ARG PWSH_VERSION=7.5.4 ARG PCRE2_VERSION=10.47 ARG OPENSSL_VERSION=3.5.4 ARG LIBMODBUS_VERSION=3.1.11 ARG ZLIB_VERSION=1.3.1 ARG CURL_VERSION=8.17.0 ARG MAJOR_VERSION=8.0 ARG ZBX_VERSION=${MAJOR_VERSION} FROM ${OS_BASE_IMAGE} AS src ARG GIT_VERSION ARG NASM_VERSION ARG VS_BUILDTOOLS_VERSION ARG PWSH_VERSION ARG PCRE2_VERSION ARG OPENSSL_VERSION ARG LIBMODBUS_VERSION ARG ZLIB_VERSION ARG CURL_VERSION ARG GIT_URL=https://github.com/git-for-windows/git/releases/download/v$GIT_VERSION.windows.1/MinGit-$GIT_VERSION-64-bit.zip ARG PERL_URL=https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_54201_64bit/strawberry-perl-5.42.0.1-64bit-portable.zip ARG VS_BUILDTOOLS_URL=https://aka.ms/vs/$VS_BUILDTOOLS_VERSION/release/vs_buildtools.exe ARG NASM_URL=https://www.nasm.us/pub/nasm/releasebuilds/$NASM_VERSION/win64/nasm-$NASM_VERSION-win64.zip ARG PCRE2_URL=https://github.com/PCRE2Project/pcre2/releases/download/pcre2-$PCRE2_VERSION/pcre2-$PCRE2_VERSION.zip ARG OPENSSL_URL=https://github.com/openssl/openssl/releases/download/openssl-$OPENSSL_VERSION/openssl-$OPENSSL_VERSION.tar.gz ARG LIBMODBUS_URL=https://github.com/stephane/libmodbus/archive/refs/tags/v$LIBMODBUS_VERSION.tar.gz ARG ZLIB_URL=https://zlib.net/zlib-$ZLIB_VERSION.tar.gz ARG CURL_URL=https://curl.se/download/curl-$CURL_VERSION.tar.gz ARG PWSH_URL=https://github.com/PowerShell/PowerShell/releases/download/v$PWSH_VERSION/PowerShell-$PWSH_VERSION-win-x64.zip ADD --checksum=sha256:d74c183c86c77248ad50017c7f45bae8f88106a6cca5d87ad09917e1c6fb0784 $PCRE2_URL build_src\pcre2.zip ADD --checksum=sha256:967311f84955316969bdb1d8d4b983718ef42338639c621ec4c34fddef355e99 $OPENSSL_URL build_src\openssl.tar.gz ADD --checksum=sha256:15b4b2e0f68122c2da9b195de5c330489a9c97d40b4a95d2822378dc14d780e7 $LIBMODBUS_URL build_src\libmodbus.tar.gz ADD --checksum=sha256:9A93B2B7DFDAC77CEBA5A558A580E74667DD6FEDE4585B91EEFB60F03B72DF23 $ZLIB_URL build_src\zlib.tar.gz ADD --checksum=sha256:e8e74cdeefe5fb78b3ae6e90cd542babf788fa9480029cfcee6fd9ced42b7910 $CURL_URL build_src\curl.tar.gz ADD --checksum=sha256:b40d192ae95ba6ccc4cc362ff4e1b18ca6fb5055bebbcd3920684e12701fa8f6 $PWSH_URL build_deps\pwsh.zip ADD --checksum=sha256:f42a561840627747ad48e6ece05a14093292d31f3393a401a7f7c780ee7695c2 $GIT_URL build_deps\git.zip ADD --checksum=sha256:a1cde185656cf307b51670eed69f648b9eff15b5c518cb136e027c628e650b71 $PERL_URL build_deps\perl.zip ADD --checksum=sha256:e0ba5157007abc7b1a65118a96657a961ddf55f7e3f632ee035366dfce039ca4 $NASM_URL build_deps\nasm.zip ADD $VS_BUILDTOOLS_URL build_deps\vs_buildtools.exe COPY CMakeLists.txt build_src\libmodbus_project\ SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] RUN Set-Location -Path $env:SystemDrive\.; ` ` $env:BUILD_SRC = [string]::Format('{0}\build_src', $env:SystemDrive); ` [Environment]::SetEnvironmentVariable('BUILD_SRC', $env:BUILD_SRC, [EnvironmentVariableTarget]::Machine); ` $env:BUILD_DEPS = [string]::Format('{0}\build_deps', $env:SystemDrive); ` [Environment]::SetEnvironmentVariable('BUILD_DEPS', $env:BUILD_DEPS, [EnvironmentVariableTarget]::Machine); ` ` Set-Location -Path $env:BUILD_DEPS; ` Write-Host 'Installing PowerShell...'; ` Expand-Archive ` -Path $env:BUILD_DEPS\pwsh.zip ` -DestinationPath $env:BUILD_DEPS\pwsh\.; ` Get-ChildItem -Path $env:BUILD_DEPS\pwsh -Directory | Where-Object { ` $_.Name -match '^(cs|de|es|fr|it|ja|ko|pl|pt-BR|ru|tr|zh-Hans|zh-Hant)$' ` } | Remove-Item -Recurse -Force; ` Get-ChildItem -Path $env:BUILD_DEPS\pwsh -Recurse -Include '*.xml' | Where-Object { $_.FullName -notmatch '\\en-US\\' } | Remove-Item -Force; ` Get-ChildItem -Path $env:BUILD_DEPS\pwsh -Recurse -Include '*.resources.dll' | Where-Object { $_.FullName -notmatch '\\en-US\\' } | Remove-Item -Force; ` ` Write-Host 'Installing NASM...'; ` Expand-Archive ` -Path $env:BUILD_DEPS\nasm.zip ` -DestinationPath $env:BUILD_DEPS\.; ` Rename-Item -Path $env:BUILD_DEPS\nasm-$env:NASM_VERSION -NewName $env:BUILD_DEPS\NASM; ` ` Write-Host 'Installing GIT...'; ` Expand-Archive ` -Path $env:BUILD_DEPS\git.zip ` -DestinationPath $env:BUILD_DEPS\git\.; ` ` Write-Host 'Installing Perl...'; ` Expand-Archive -Path $env:BUILD_DEPS\perl.zip -DestinationPath $env:BUILD_DEPS\perl\; ` Remove-Item -Force -Recurse $env:BUILD_DEPS\perl\c\; ` ` Set-Location -Path $env:BUILD_SRC; ` ` Write-Host 'Extracting PCRE2 archive ...'; ` Expand-Archive -Path $env:BUILD_SRC\pcre2.zip -DestinationPath $env:BUILD_SRC; ` Rename-Item -Path $env:BUILD_SRC\pcre2-$env:PCRE2_VERSION -NewName $env:BUILD_SRC\pcre2; ` New-Item -ItemType directory -Path "$env:BUILD_SRC\pcre2\build" | Out-Null; ` ` Write-Host 'Extracting OpenSSL archive ...'; ` tar -zxf $env:BUILD_SRC\openssl.tar.gz; ` Rename-Item -Path $env:BUILD_SRC\openssl-$env:OPENSSL_VERSION -NewName $env:BUILD_SRC\openssl; ` ` Write-Host 'Extracting Libmodbus archive ...'; ` tar -zxf $env:BUILD_SRC\libmodbus.tar.gz; ` Move-Item -Path $env:BUILD_SRC\libmodbus-$env:LIBMODBUS_VERSION\ -Destination $env:BUILD_SRC\libmodbus; ` Copy-Item $env:BUILD_SRC\libmodbus_project\CMakeLists.txt -Destination $env:BUILD_SRC\libmodbus\CMakeLists.txt; ` Remove-Item -Force -Recurse $env:BUILD_SRC\libmodbus_project\; ` ` Write-Host 'Extracting Zlib archive ...'; ` tar -zxf $env:BUILD_SRC\zlib.tar.gz; ` Move-Item -Path $env:BUILD_SRC\zlib-$env:ZLIB_VERSION\ -Destination $env:BUILD_SRC\zlib; ` ` Write-Host 'Extracting CURL archive ...'; ` tar -zxf $env:BUILD_SRC\curl.tar.gz; ` Move-Item -Path $env:BUILD_SRC\curl-$env:CURL_VERSION\ -Destination $env:BUILD_SRC\curl; ` ` Write-Host 'Removing downloaded...'; ` Remove-Item -Force -Recurse $env:BUILD_SRC\*.tar.gz; ` Remove-Item -Force -Recurse $env:BUILD_SRC\*.zip; ` Remove-Item -Force -Recurse $env:BUILD_DEPS\*.tar.gz; ` Remove-Item -Force -Recurse $env:BUILD_DEPS\*.zip; FROM ${OS_BASE_IMAGE} ARG GIT_VERSION ARG NASM_VERSION ARG VS_BUILDTOOLS_VERSION ARG PCRE2_VERSION ARG OPENSSL_VERSION ARG LIBMODBUS_VERSION ARG ZLIB_VERSION ARG CURL_VERSION ARG MAJOR_VERSION ARG ZBX_VERSION ENV ZBX_VERSION=$ZBX_VERSION ` VS_BUILDTOOLS_VERSION=$VS_BUILDTOOLS_VERSION ` PCRE2_VERSION=$PCRE2_VERSION OPENSSL_VERSION=$OPENSSL_VERSION LIBMODBUS_VERSION=$LIBMODBUS_VERSION LABEL org.opencontainers.image.title="Zabbix agent build base for Windows" ` org.opencontainers.image.authors="Alexey Pustovalov " ` org.opencontainers.image.vendor="Zabbix SIA" ` org.opencontainers.image.url="https://zabbix.com/" ` org.opencontainers.image.description="Zabbix build base image contains all required packages to build Zabbix agent images" ` org.opencontainers.image.licenses="AGPL v3.0" ` org.opencontainers.image.documentation="https://www.zabbix.com/documentation/${MAJOR_VERSION}/manual/installation/containers" ` org.opencontainers.image.version="${ZBX_VERSION}" COPY --from=src build_src build_src COPY --from=src build_deps build_deps SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] RUN Set-Location -Path $env:SystemDrive\.; ` ` $env:BUILD_OUTPUT = [string]::Format('{0}\build_output', $env:SystemDrive); ` [Environment]::SetEnvironmentVariable('BUILD_OUTPUT', $env:BUILD_OUTPUT, [EnvironmentVariableTarget]::Machine); ` $env:BUILD_SRC = [string]::Format('{0}\build_src', $env:SystemDrive); ` [Environment]::SetEnvironmentVariable('BUILD_SRC', $env:BUILD_SRC, [EnvironmentVariableTarget]::Machine); ` $env:BUILD_DEPS = [string]::Format('{0}\build_deps', $env:SystemDrive); ` [Environment]::SetEnvironmentVariable('BUILD_DEPS', $env:BUILD_DEPS, [EnvironmentVariableTarget]::Machine); ` ` $env:PATH = [string]::Format('{0}\perl\perl\bin;{0}\NASM;{0}\git\cmd;{0}\git\mingw64\bin;{0}\git\usr\bin;', $env:BUILD_DEPS) + $env:PATH; ` [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine); ` ` New-Item -ItemType directory -Path $env:BUILD_OUTPUT -Force | Out-Null; ` Write-Host 'Verifying install ("git version") ...'; ` Write-Host $env:VS_BUILDTOOLS_VERSION; ` git version; ` ` Write-Host 'Verifying install ("nasm -v") ...'; ` nasm -v; ` ` Write-Host 'Verifying install ("perl -v") ...'; ` perl -v; ` ` Write-Host ('{0} - Visual Studio components installing...' -f $(Get-Date -format 'u')); ` cmd /C start /w $env:BUILD_DEPS\vs_buildtools.exe ` --quiet ` --wait ` --norestart ` --nocache ` --installPath """${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools""" ` --channelUri https://aka.ms/vs/$env:VS_BUILDTOOLS_VERSION/release/channel ` --installChannelUri https://aka.ms/vs/$env:VS_BUILDTOOLS_VERSION/release/channel ` --channelId VisualStudio.$env:VS_BUILDTOOLS_VERSION.Release ` # https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?view=vs-2022 --add Microsoft.VisualStudio.Component.Windows11SDK.22621 ` --add Microsoft.VisualStudio.Component.VC.CMake.Project; ` if ($err = dir $Env:TEMP -Filter dd_setup_*_errors.log | where Length -gt 0 | Get-Content) { ` throw $err; ` }; ` Wait-Process -name msiexec; ` Write-Host ('{0} - Visual Studio components installed' -f $(Get-Date -format 'u')); ` ` $env:VS_PATH = &(Join-Path ${env:ProgramFiles(x86)} """\Microsoft Visual Studio\Installer\vswhere.exe""") -latest -products Microsoft.VisualStudio.Product.BuildTools -property installationPath; ` [Environment]::SetEnvironmentVariable('VS_PATH', $env:VS_PATH, [EnvironmentVariableTarget]::Machine); ` ` Write-Host 'Visual Studio components installation cleanup'; ` Get-ChildItem -Path """${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer""" -Directory -Recurse | Remove-Item -Force -Recurse; ` ` Write-Host 'Build environment is ready...'; RUN Import-Module (Get-ChildItem $env:VS_PATH -Recurse -File -Filter Microsoft.VisualStudio.DevShell.dll).FullName; ` Enter-VsDevShell -VsInstallPath $env:VS_PATH -SkipAutomaticLocation -DevCmdArguments """-arch=$env:BUILD_ARCH"""; ` ` Write-Host 'Building Zlib library...'; ` Set-Location -Path $env:SystemDrive\.; ` $env:CL = """$env:CL /MP"""; ` cmake -S $env:BUILD_SRC\zlib -B $env:BUILD_SRC\zlib\build ` -G """Visual Studio 17 2022""" ` -A $env:BUILD_ARCH ` -DBUILD_SHARED_LIBS=OFF ` -DCMAKE_MSVC_RUNTIME_LIBRARY="""MultiThreaded$<$:Debug>""" ` -DCMAKE_INSTALL_PREFIX="""$env:BUILD_OUTPUT\zlib"""; ` cmake --build $env:BUILD_SRC\zlib\build --config Release --parallel; ` cmake --install $env:BUILD_SRC\zlib\build --config Release; ` Remove-Item -Path $env:BUILD_SRC\zlib\build -Force -Recurse; ` Write-Host 'Zlib is ready...'; RUN Import-Module (Get-ChildItem $env:VS_PATH -Recurse -File -Filter Microsoft.VisualStudio.DevShell.dll).FullName; ` Enter-VsDevShell -VsInstallPath $env:VS_PATH -SkipAutomaticLocation -DevCmdArguments """-arch=x64"""; ` ` Write-Host 'Building OpenSSL library...'; ` Set-Location -Path $env:BUILD_SRC\openssl; ` $env:CL = """$env:CL /nologo /MP /MT /wd4267 /wd4244"""; ` $env:NMAKEFLAGS = """/nologo"""; ` perl $env:BUILD_SRC\openssl\Configure ` VC-WIN64A ` no-capieng ` no-docs ` no-dgram ` no-dtls1-method ` no-dtls1_2-method ` no-gost ` no-shared ` no-srp ` no-tests ` no-ui-console ` no-winstore ` --api=1.1.0 ` --prefix=$env:BUILD_OUTPUT\openssl ` --openssldir=$env:BUILD_OUTPUT\openssl_ssl; ` nmake /S build_libs; ` nmake /S INSTALLDOCS=0 INSTALLHTML=0 install_dev; ` nmake /S clean | Out-Null; ` Write-Host 'OpenSSL is ready...'; RUN Import-Module (Get-ChildItem $env:VS_PATH -Recurse -File -Filter Microsoft.VisualStudio.DevShell.dll).FullName; ` Enter-VsDevShell -VsInstallPath $env:VS_PATH -SkipAutomaticLocation -DevCmdArguments """-arch=x64"""; ` ` Write-Host 'Building PCRE2 library ...'; ` Set-Location -Path $env:BUILD_SRC\pcre2; ` $env:CL = """$env:CL /MP"""; ` cmake -S $env:BUILD_SRC\pcre2 -B $env:BUILD_SRC\pcre2\build ` -G """Visual Studio 17 2022""" ` -A x64 ` -DBUILD_SHARED_LIBS=OFF ` -DPCRE2_BUILD_TESTS=OFF ` -DPCRE2_BUILD_PCRE2GREP=OFF ` -DPCRE2_SUPPORT_JIT=OFF ` -DCMAKE_MSVC_RUNTIME_LIBRARY="""MultiThreaded$<$:Debug>""" ` -DCMAKE_INSTALL_PREFIX="""$env:BUILD_OUTPUT\pcre2"""; ` ` cmake --build $env:BUILD_SRC\pcre2\build --config Release --parallel; ` cmake --install $env:BUILD_SRC\pcre2\build --config Release; ` ` Remove-Item -Recurse -Force -Path $env:BUILD_OUTPUT\pcre2\share -ErrorAction SilentlyContinue; ` Remove-Item -Recurse -Force $env:BUILD_SRC\pcre2\build; ` Write-Host 'PCRE2 is ready...'; RUN Import-Module (Get-ChildItem $env:VS_PATH -Recurse -File -Filter Microsoft.VisualStudio.DevShell.dll).FullName; ` Enter-VsDevShell -VsInstallPath $env:VS_PATH -SkipAutomaticLocation -DevCmdArguments """-arch=x64"""; ` ` Write-Host 'Building Libmodbus library ...'; ` $env:CL = """$env:CL /MP"""; ` Set-Location -Path $env:BUILD_SRC\libmodbus\src\win32; ` cscript //nologo .\configure.js; ` Set-Location -Path $env:BUILD_SRC\libmodbus; ` cmake -S $env:BUILD_SRC\libmodbus -B $env:BUILD_SRC\libmodbus\build ` -G """"Visual Studio 17 2022""" ` -A x64 ` -DBUILD_SHARED_LIBS=OFF ` -DCMAKE_MSVC_RUNTIME_LIBRARY="""MultiThreaded$<$:Debug>""" ` -DCMAKE_INSTALL_PREFIX="""$env:BUILD_OUTPUT\libmodbus"""; ` ` cmake --build $env:BUILD_SRC\libmodbus\build --config Release --parallel; ` cmake --install $env:BUILD_SRC\libmodbus\build --config Release; ` Remove-Item -Recurse -Force $env:BUILD_SRC\libmodbus\build; ` Write-Host 'Libmodbus is ready...'; RUN Import-Module (Get-ChildItem $env:VS_PATH -Recurse -File -Filter Microsoft.VisualStudio.DevShell.dll).FullName; ` Enter-VsDevShell -VsInstallPath $env:VS_PATH -SkipAutomaticLocation -DevCmdArguments """-arch=x64"""; ` Write-Host 'Building Curl library...'; ` Set-Location -Path $env:BUILD_SRC\curl; ` $env:CL = """$env:CL /MP"""; ` cmake -S $env:BUILD_SRC\curl -B $env:BUILD_SRC\curl\build ` -G """Visual Studio 17 2022""" ` -A x64 ` -DCMAKE_MSVC_RUNTIME_LIBRARY="""MultiThreaded$<$:Debug>""" ` -DBUILD_CURL_EXE=OFF ` -DBUILD_EXAMPLES=OFF ` -DBUILD_LIBCURL_DOCS=OFF ` -DBUILD_SHARED_LIBS=OFF ` -DBUILD_STATIC_LIBS=ON ` -DCURL_DISABLE_LDAP=ON ` -DCURL_DISABLE_LDAPS=ON ` -DCURL_STATIC_CRT=ON ` -DCURL_USE_LIBPSL=OFF ` -DCURL_USE_OPENSSL=ON ` -DCURL_ZLIB=ON ` -DENABLE_UNICODE=ON ` -DOPENSSL_ROOT_DIR="""$env:BUILD_OUTPUT\openssl""" ` -DOPENSSL_USE_STATIC_LIBS=ON ` -DUSE_WIN32_IDN=OFF ` -DZLIB_INCLUDE_DIR="""$env:BUILD_OUTPUT\zlib\include""" ` -DZLIB_LIBRARY="""$env:BUILD_OUTPUT\zlib\lib\zlibstatic.lib""" ` -DZLIB_USE_STATIC_LIBS=ON ` -DCMAKE_INSTALL_PREFIX="""$env:BUILD_OUTPUT\curl"""; ` cmake --build $env:BUILD_SRC\curl\build --config Release --parallel; ` cmake --install $env:BUILD_SRC\curl\build --config Release; ` Remove-Item -Path $env:BUILD_SRC\curl\build\ -Force -Recurse;