# syntax=docker/dockerfile:1.6 # escape=` ARG OS_BASE_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2022 ARG NASM_VERSION=3.02 ARG VS_BUILDTOOLS_VERSION=17 ARG PWSH_VERSION=7.6.3 ARG PCRE2_VERSION=10.47 ARG OPENSSL_VERSION=4.0.1 ARG LIBMODBUS_VERSION=3.2.0 ARG ZLIB_VERSION=1.3.2 ARG CURL_VERSION=8.21.0 ARG MAJOR_VERSION=7.4 ARG ZBX_VERSION=${MAJOR_VERSION}.12 FROM ${OS_BASE_IMAGE} AS src 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/v2.55.0.windows.2/MinGit-2.55.0.2-64-bit.zip ARG PERL_URL=https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_54221_64bit/strawberry-perl-5.42.2.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:2db3f3a0d6ea4b59e1f094ace2c8cd536dffb87cdc39084c5afa1e6f7f37dd09 $OPENSSL_URL build_src\openssl.tar.gz ADD --checksum=sha256:72239f319b9b8483e3d393c5a60865d734fcff18a8abbb2486e389834a2f6ef1 $LIBMODBUS_URL build_src\libmodbus.tar.gz ADD --checksum=sha256:bb329a0a2cd0274d05519d61c667c062e06990d72e125ee2dfa8de64f0119d16 $ZLIB_URL build_src\zlib.tar.gz ADD --checksum=sha256:d9b327997999045a24cda50f3983e69e51c516bd8be6ef9842fc7f99135e33bb $CURL_URL build_src\curl.tar.gz ADD --checksum=sha256:07ddb0d00b660459560ef82a9841da7705b27cd5dcca5a0d7b025a98eca29eca $PWSH_URL build_deps\pwsh.zip ADD --checksum=sha256:e3ea2944cea4b3fabcd69c7c1669ef69b1b66c05ac7806d81224d0abad2dec31 $GIT_URL build_deps\git.zip ADD --checksum=sha256:32d83be90cf04b807cfb9477482bc36302cdee6f5b04cf57e81adecbd8f07898 $PERL_URL build_deps\perl.zip ADD --checksum=sha256:161d0bfaff53c2f9e9f3e69fd0672323ebabafd1268976a5cec11be92a19aee7 $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; ` Remove-Item -Recurse -Force $env:BUILD_SRC\openssl\test -ErrorAction SilentlyContinue; ` ` 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 -ErrorAction SilentlyContinue; ` Remove-Item -Force -Recurse $env:BUILD_SRC\*.zip -ErrorAction SilentlyContinue; ` Remove-Item -Force -Recurse $env:BUILD_DEPS\*.tar.gz -ErrorAction SilentlyContinue; ` Remove-Item -Force -Recurse $env:BUILD_DEPS\*.zip -ErrorAction SilentlyContinue; FROM ${OS_BASE_IMAGE} 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") ...'; ` 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); ` ` $env:VS_DEVSHELL = (Get-ChildItem $env:VS_PATH -Recurse -File -Filter Microsoft.VisualStudio.DevShell.dll).FullName; ` [Environment]::SetEnvironmentVariable('VS_DEVSHELL', $env:VS_DEVSHELL, [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 $env:VS_DEVSHELL; ` Enter-VsDevShell -VsInstallPath $env:VS_PATH -SkipAutomaticLocation -DevCmdArguments """-arch=x64"""; ` ` 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 x64 ` -DZLIB_BUILD_TESTING=OFF ` -DZLIB_BUILD_SHARED=OFF ` -DZLIB_BUILD_STATIC=ON ` -DZLIB_BUILD_MINIZIP=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 $env:VS_DEVSHELL; ` 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-autoload-config ` no-apps ` no-docs ` no-dgram ` no-dtls1-method ` no-dtls1_2-method ` no-gost ` no-shared ` no-srp ` no-module ` no-makedepend ` no-tests ` no-ui-console ` no-winstore ` --api=1.1.0 ` no-deprecated ` --prefix=$env:BUILD_OUTPUT\openssl ` --openssldir=$env:BUILD_OUTPUT\openssl_ssl; ` nmake /S build_libs | Out-Null; ` nmake /S INSTALLDOCS=0 INSTALLHTML=0 install_dev; ` $ErrorActionPreference = 'Continue'; ` nmake /S clean 2>$null | Out-Null; ` Write-Host 'OpenSSL is ready...'; RUN Import-Module $env:VS_DEVSHELL; ` 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 ` -DBUILD_STATIC_LIBS=ON ` -DPCRE2_BUILD_PCRE2_8=ON ` -DPCRE2_BUILD_PCRE2_16=OFF ` -DPCRE2_BUILD_PCRE2_32=OFF ` -DPCRE2_BUILD_PCRE2GREP=OFF ` -DPCRE2_BUILD_TESTS=OFF ` -DPCRE2_DEBUG=OFF ` -DPCRE2_SUPPORT_JIT=OFF ` -DPCRE2_SUPPORT_UNICODE=ON ` -DINSTALL_MSVC_PDB=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 $env:VS_DEVSHELL; ` 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 $env:VS_DEVSHELL; ` 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_TESTING=OFF ` -DENABLE_CURL_MANUAL=OFF ` -DBUILD_LIBCURL_DOCS=OFF ` -DBUILD_MISC_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 ` -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG=ON ` -DUSE_WIN32_IDN=OFF ` -DZLIB_INCLUDE_DIR="""$env:BUILD_OUTPUT\zlib\include""" ` -DZLIB_LIBRARY="""$env:BUILD_OUTPUT\zlib\lib\zs.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;