Skip to content

Instantly share code, notes, and snippets.

@yeahdongcn
Created September 19, 2025 00:56
Show Gist options
  • Save yeahdongcn/f57a37bfadcb0a607a6b0e5e710cbef2 to your computer and use it in GitHub Desktop.
Save yeahdongcn/f57a37bfadcb0a607a6b0e5e710cbef2 to your computer and use it in GitHub Desktop.
VULKAN SDK
ARG UBUNTU_VERSION=22.04
ARG DOCKERHUB_REGISTRY=docker.io/library
# ---------- Stage 1: Build Vulkan SDK ----------
FROM --platform=linux/arm64 ${DOCKERHUB_REGISTRY}/ubuntu:${UBUNTU_VERSION} AS builder
ENV DEBIAN_FRONTEND=noninteractive
# Install build tools and dependencies
RUN apt update && apt install -y --no-install-recommends \
build-essential cmake ninja-build git python3-pip curl pkg-config \
libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev \
ca-certificates && \
apt clean && rm -rf /var/lib/apt/lists/*
WORKDIR /vulkan
ARG VULKAN_BRANCH=vulkan-sdk-1.4.321
ARG SHADERC_COMMIT=a298b382ea7af052b549c08a799a56e9ec4bf471
# Build Vulkan-Headers
RUN git clone --branch ${VULKAN_BRANCH} --depth 1 https://github.com/KhronosGroup/Vulkan-Headers.git && \
cmake -S Vulkan-Headers -B Vulkan-Headers/build -DCMAKE_INSTALL_PREFIX=/opt/vulkan -DCMAKE_BUILD_TYPE=Release && \
cmake --build Vulkan-Headers/build -j $(nproc) && \
cmake --install Vulkan-Headers/build
# Build Vulkan-Loader
RUN git clone --branch ${VULKAN_BRANCH} --depth 1 https://github.com/KhronosGroup/Vulkan-Loader.git && \
cmake -S Vulkan-Loader -B Vulkan-Loader/build \
-DCMAKE_INSTALL_PREFIX=/opt/vulkan \
-DVULKAN_HEADERS_INSTALL_DIR=/opt/vulkan \
-DCMAKE_BUILD_TYPE=Release && \
cmake --build Vulkan-Loader/build -j $(nproc) && \
cmake --install Vulkan-Loader/build
# Build glslang (required by shaderc)
RUN git clone --branch ${VULKAN_BRANCH} --depth 1 https://github.com/KhronosGroup/glslang.git && \
cd glslang && python3 update_glslang_sources.py && cd .. && \
cmake -S glslang -B glslang/build -DCMAKE_INSTALL_PREFIX=/opt/vulkan -DCMAKE_BUILD_TYPE=Release && \
cmake --build glslang/build -j $(nproc) && \
cmake --install glslang/build
# Build shaderc and glslc
RUN git clone https://github.com/google/shaderc.git && \
cd shaderc && git checkout ${SHADERC_COMMIT} && \
python3 utils/git-sync-deps && cd .. && \
cmake -S shaderc -B shaderc/build -G Ninja \
-DCMAKE_INSTALL_PREFIX=/opt/vulkan \
-DSHADERC_SKIP_TESTS=ON \
-DCMAKE_BUILD_TYPE=Release && \
cmake --build shaderc/build -j $(nproc) && \
cmake --install shaderc/build
# ---------- Stage 2: Final Development Image ----------
FROM ${DOCKERHUB_REGISTRY}/ubuntu:${UBUNTU_VERSION}
ENV DEBIAN_FRONTEND=noninteractive
# Install development dependencies
RUN apt update && apt install -y --no-install-recommends \
libxcb-xinput0 libxcb-xinerama0 libxcb-cursor-dev \
build-essential ca-certificates ccache curl git libcurl4-openssl-dev \
&& apt clean && rm -rf /var/lib/apt/lists/*
# Copy Vulkan SDK from builder stage
COPY --from=builder /opt/vulkan /opt/vulkan
# Set environment variables
ENV VULKAN_SDK=/opt/vulkan
ENV PATH=$VULKAN_SDK/bin:$PATH
ENV LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
ENV CMAKE_PREFIX_PATH=$VULKAN_SDK:$CMAKE_PREFIX_PATH
ENV PKG_CONFIG_PATH=$VULKAN_SDK/lib/pkgconfig:$PKG_CONFIG_PATH
FROM --platform=linux/amd64 ${DOCKERHUB_REGISTRY}/ubuntu:${UBUNTU_VERSION} AS amd64
ENV DEBIAN_FRONTEND=noninteractive
# Install development dependencies
RUN apt update && apt install -y --no-install-recommends \
wget xz-utils \
libxcb-xinput0 libxcb-xinerama0 libxcb-cursor-dev \
build-essential ca-certificates ccache curl git libcurl4-openssl-dev \
&& apt clean && rm -rf /var/lib/apt/lists/*
# https://packages.lunarg.com/
# Deprecation Notice:
# LunarG will discontinue updating the Ubuntu Packages to newer SDK releases after the month of May, 2025.
# The Linux tarball should be used instead to keep up to date with Vulkan SDK releases.
ARG VULKAN_VERSION=1.4.321.1
RUN wget -qO /tmp/vulkan-sdk.tar.xz https://sdk.lunarg.com/sdk/download/${VULKAN_VERSION}/linux/vulkan-sdk-linux-x86_64-${VULKAN_VERSION}.tar.xz && \
mkdir -p /opt/vulkan && \
tar -xf /tmp/vulkan-sdk.tar.xz -C /tmp --strip-components=1 && \
mv /tmp/x86_64/* /opt/vulkan/ && \
rm -rf /tmp/*
# Set environment variables
ENV VULKAN_SDK=/opt/vulkan
ENV PATH=$VULKAN_SDK/bin:$PATH
ENV LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
ENV CMAKE_PREFIX_PATH=$VULKAN_SDK:$CMAKE_PREFIX_PATH
ENV PKG_CONFIG_PATH=$VULKAN_SDK/lib/pkgconfig:$PKG_CONFIG_PATH
@yeahdongcn
Copy link
Author

REGISTRY          ?= docker.io/library
IMAGE              = $(REGISTRY)/vulkan-sdk
VULKAN_VERSION     = 1.4.321.1
BUILD_ARGS_AMD64   = --platform linux/amd64 --target amd64 --build-arg VULKAN_VERSION=$(VULKAN_VERSION)
BUILD_ARGS_ARM64   = --platform linux/arm64 --target arm64 \
	--build-arg VULKAN_BRANCH=vulkan-sdk-1.4.321 \
	--build-arg SHADERC_COMMIT=3362e24c42ab5bf7ad32c0fec64b0a0ddeb2fda1
COMMON_BUILD_FLAGS = --progress=plain --provenance=false --sbom=false -f Dockerfile.vulkan

.DEFAULT_GOAL := build-manifest

.PHONY: build-amd64
build-amd64:
	@docker buildx build \
		$(BUILD_ARGS_AMD64) $(COMMON_BUILD_FLAGS) \
		--tag $(IMAGE):$(VULKAN_VERSION)-amd64 \
		--push .

.PHONY: build-arm64
build-arm64:
	@docker buildx build \
		$(BUILD_ARGS_ARM64) $(COMMON_BUILD_FLAGS) \
		--tag $(IMAGE):$(VULKAN_VERSION)-arm64 \
		--push .

.PHONY: build-manifest
build-manifest: build-amd64 build-arm64
	@docker manifest rm $(IMAGE):$(VULKAN_VERSION) 2>/dev/null || true;
	@docker manifest create $(IMAGE):$(VULKAN_VERSION) \
		$(IMAGE):$(VULKAN_VERSION)-arm64 \
		$(IMAGE):$(VULKAN_VERSION)-amd64
	@docker manifest push $(IMAGE):$(VULKAN_VERSION)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment