Build libvips from source in Dockerfile (#30571)
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							a66f6e1005
						
					
				
				
					commit
					179f7b11ba
				
			
							
								
								
									
										81
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								Dockerfile
									
									
									
									
									
								
							@@ -48,8 +48,6 @@ ENV \
 | 
			
		||||
# Apply Mastodon version information
 | 
			
		||||
  MASTODON_VERSION_PRERELEASE="${MASTODON_VERSION_PRERELEASE}" \
 | 
			
		||||
  MASTODON_VERSION_METADATA="${MASTODON_VERSION_METADATA}" \
 | 
			
		||||
# Enable libvips
 | 
			
		||||
  MASTODON_USE_LIBVIPS=true \
 | 
			
		||||
# Apply Mastodon static files and YJIT options
 | 
			
		||||
  RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES} \
 | 
			
		||||
  RUBY_YJIT_ENABLE=${RUBY_YJIT_ENABLE} \
 | 
			
		||||
@@ -67,7 +65,9 @@ ENV \
 | 
			
		||||
  DEBIAN_FRONTEND="noninteractive" \
 | 
			
		||||
  PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" \
 | 
			
		||||
# Optimize jemalloc 5.x performance
 | 
			
		||||
  MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0"
 | 
			
		||||
  MALLOC_CONF="narenas:2,background_thread:true,thp:never,dirty_decay_ms:1000,muzzy_decay_ms:0" \
 | 
			
		||||
# Enable libvips, should not be changed
 | 
			
		||||
  MASTODON_USE_LIBVIPS=true
 | 
			
		||||
 | 
			
		||||
# Set default shell used for running commands
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-c"]
 | 
			
		||||
@@ -104,7 +104,6 @@ RUN \
 | 
			
		||||
    curl \
 | 
			
		||||
    ffmpeg \
 | 
			
		||||
    file \
 | 
			
		||||
    libvips42 \
 | 
			
		||||
    libjemalloc2 \
 | 
			
		||||
    patchelf \
 | 
			
		||||
    procps \
 | 
			
		||||
@@ -138,18 +137,31 @@ RUN \
 | 
			
		||||
--mount=type=cache,id=apt-lib-${TARGETPLATFORM},target=/var/lib/apt,sharing=locked \
 | 
			
		||||
# Install build tools and bundler dependencies from APT
 | 
			
		||||
  apt-get install -y --no-install-recommends \
 | 
			
		||||
    g++ \
 | 
			
		||||
    gcc \
 | 
			
		||||
    build-essential \
 | 
			
		||||
    git \
 | 
			
		||||
    libgdbm-dev \
 | 
			
		||||
    libglib2.0-dev \
 | 
			
		||||
    libgmp-dev \
 | 
			
		||||
    libicu-dev \
 | 
			
		||||
    libidn-dev \
 | 
			
		||||
    libpq-dev \
 | 
			
		||||
    libssl-dev \
 | 
			
		||||
    make \
 | 
			
		||||
    meson \
 | 
			
		||||
    pkg-config \
 | 
			
		||||
    shared-mime-info \
 | 
			
		||||
    zlib1g-dev \
 | 
			
		||||
	# libvips components
 | 
			
		||||
    libcgif-dev \
 | 
			
		||||
    libexif-dev \
 | 
			
		||||
    libexpat1-dev \
 | 
			
		||||
    libgirepository1.0-dev \
 | 
			
		||||
    libheif-dev \
 | 
			
		||||
    libimagequant-dev \
 | 
			
		||||
    libjpeg62-turbo-dev \
 | 
			
		||||
    liblcms2-dev \
 | 
			
		||||
    liborc-dev \
 | 
			
		||||
    libspng-dev \
 | 
			
		||||
    libtiff-dev \
 | 
			
		||||
    libwebp-dev \
 | 
			
		||||
  ;
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
@@ -158,6 +170,26 @@ RUN \
 | 
			
		||||
  corepack enable; \
 | 
			
		||||
  corepack prepare --activate;
 | 
			
		||||
 | 
			
		||||
# Create temporary libvips specific build layer from build layer
 | 
			
		||||
FROM build as libvips
 | 
			
		||||
 | 
			
		||||
# libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"]
 | 
			
		||||
# renovate: datasource=github-releases depName=libvips packageName=libvips/libvips
 | 
			
		||||
ARG VIPS_VERSION=8.15.2
 | 
			
		||||
# libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"]
 | 
			
		||||
ARG VIPS_URL=https://github.com/libvips/libvips/releases/download
 | 
			
		||||
 | 
			
		||||
WORKDIR /usr/local/libvips/src
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
  curl -sSL -o vips-${VIPS_VERSION}.tar.xz ${VIPS_URL}/v${VIPS_VERSION}/vips-${VIPS_VERSION}.tar.xz; \
 | 
			
		||||
  tar xf vips-${VIPS_VERSION}.tar.xz; \
 | 
			
		||||
  cd vips-${VIPS_VERSION}; \
 | 
			
		||||
  meson setup build --prefix /usr/local/libvips --libdir=lib -Ddeprecated=false -Dintrospection=disabled -Dmodules=disabled -Dexamples=false; \
 | 
			
		||||
  cd build; \
 | 
			
		||||
  ninja; \
 | 
			
		||||
  ninja install;
 | 
			
		||||
 | 
			
		||||
# Create temporary bundler specific build layer from build layer
 | 
			
		||||
FROM build as bundler
 | 
			
		||||
 | 
			
		||||
@@ -207,10 +239,14 @@ COPY . /opt/mastodon/
 | 
			
		||||
COPY --from=yarn /opt/mastodon /opt/mastodon/
 | 
			
		||||
COPY --from=bundler /opt/mastodon /opt/mastodon/
 | 
			
		||||
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
 | 
			
		||||
# Copy libvips components to layer for precompiler
 | 
			
		||||
COPY --from=libvips /usr/local/libvips/bin /usr/local/bin
 | 
			
		||||
COPY --from=libvips /usr/local/libvips/lib /usr/local/lib
 | 
			
		||||
 | 
			
		||||
ARG TARGETPLATFORM
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
  ldconfig; \
 | 
			
		||||
# Use Ruby on Rails to create Mastodon assets
 | 
			
		||||
  SECRET_KEY_BASE_DUMMY=1 \
 | 
			
		||||
  bundle exec rails assets:precompile; \
 | 
			
		||||
@@ -232,12 +268,27 @@ RUN \
 | 
			
		||||
--mount=type=cache,id=yarn-cache-${TARGETPLATFORM},target=/usr/local/share/.cache/yarn,sharing=locked \
 | 
			
		||||
# Apt update install non-dev versions of necessary components
 | 
			
		||||
  apt-get install -y --no-install-recommends \
 | 
			
		||||
    libssl3 \
 | 
			
		||||
    libpq5 \
 | 
			
		||||
    libexpat1 \
 | 
			
		||||
    libglib2.0-0 \
 | 
			
		||||
    libicu72 \
 | 
			
		||||
    libidn12 \
 | 
			
		||||
    libpq5 \
 | 
			
		||||
    libreadline8 \
 | 
			
		||||
    libssl3 \
 | 
			
		||||
    libyaml-0-2 \
 | 
			
		||||
  # libvips components
 | 
			
		||||
    libcgif0 \
 | 
			
		||||
    libexif12 \
 | 
			
		||||
    libheif1 \
 | 
			
		||||
    libimagequant0 \
 | 
			
		||||
    libjpeg62-turbo \
 | 
			
		||||
    liblcms2-2 \
 | 
			
		||||
    liborc-0.4-0 \
 | 
			
		||||
    libspng0 \
 | 
			
		||||
    libtiff6 \
 | 
			
		||||
    libwebp7 \
 | 
			
		||||
    libwebpdemux2 \
 | 
			
		||||
    libwebpmux3 \
 | 
			
		||||
  ;
 | 
			
		||||
 | 
			
		||||
# Copy Mastodon sources into final layer
 | 
			
		||||
@@ -248,9 +299,17 @@ COPY --from=precompiler /opt/mastodon/public/packs /opt/mastodon/public/packs
 | 
			
		||||
COPY --from=precompiler /opt/mastodon/public/assets /opt/mastodon/public/assets
 | 
			
		||||
# Copy bundler components to layer
 | 
			
		||||
COPY --from=bundler /usr/local/bundle/ /usr/local/bundle/
 | 
			
		||||
# Copy libvips components to layer
 | 
			
		||||
COPY --from=libvips /usr/local/libvips/bin /usr/local/bin
 | 
			
		||||
COPY --from=libvips /usr/local/libvips/lib /usr/local/lib
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
# Precompile bootsnap code for faster Rails startup
 | 
			
		||||
  ldconfig; \
 | 
			
		||||
# Smoketest media processors
 | 
			
		||||
  vips -v;
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
  # Precompile bootsnap code for faster Rails startup
 | 
			
		||||
  bundle exec bootsnap precompile --gemfile app/ lib/;
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user