diff --git a/Dockerfile b/Dockerfile index 6407b1e..edbb805 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,29 +1,26 @@ # ================================ # Build image # ================================ -FROM swift:5.7-focal as build +FROM swift:5.9-jammy-slim AS build -RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \ - && apt-get -q update \ - && apt-get -q dist-upgrade -y \ - && apt-get install -y libsqlite3-dev nano \ - && rm -rf /var/lib/apt/lists/* +# Install OS updates +RUN apt-get -q update && \ + apt-get -q install -y ca-certificates tzdata libcurl4 && \ + rm -rf /var/lib/apt/lists/* # Set up a build area WORKDIR /build -# First just resolve dependencies. -# This creates a cached layer that can be reused -# as long as your Package.swift/Package.resolved -# files do not change. +# Resolve dependencies COPY ./Package.* ./ RUN swift package resolve # Copy entire repo into container COPY . . -# Build everything, with optimizations -RUN swift build -c release --static-swift-stdlib +# Build the project +RUN swift build -c release --static-swift-stdlib \ + -Xlinker -u -Xlinker _swift_backtrace_isThunkFunction # Switch to the staging area WORKDIR /staging @@ -31,60 +28,35 @@ WORKDIR /staging # Copy main executable to staging area RUN cp "$(swift build --package-path /build -c release --show-bin-path)/Main" ./ -# Copy resources bundled by SPM to staging area -RUN find -L "$(swift build --package-path /build -c release --show-bin-path)/" -regex '.*\.resources$' -exec cp -Ra {} ./ \; +# Copy resources if they exist +RUN [ -d /build/Public ] && cp -R /build/Public ./ || true -# Copy any resources from the public directory and views directory if the directories exist -# Ensure that by default, neither the directory nor any of its contents are writable. -RUN [ -d /build/Public ] && { mv /build/Cert ./Cert && chmod -R a-w ./Cert; } || true -RUN [ -d /build/Public ] && { mv /build/Public ./Public && chmod -R a-w ./Public; } || true -RUN [ -d /build/Resources ] && { mv /build/Resources ./Resources && chmod -R a-w ./Resources; } || true # ================================ # Run image # ================================ -FROM ubuntu:focal +FROM swift:5.9-jammy-slim -# Make sure all system packages are up to date, and install only essential packages. -RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \ - && apt-get -q update \ - && apt-get -q dist-upgrade -y \ - && apt-get -q install -y \ - ca-certificates \ - tzdata \ - libcurl4 \ +# Install required packages +RUN apt-get -q update && \ + apt-get -q install -y ca-certificates tzdata libcurl4 && \ + rm -rf /var/lib/apt/lists/* -# If your app or its dependencies import FoundationXML, also install `libxml2`. - # libxml2 \ - && rm -r /var/lib/apt/lists/* - -# Create a vapor user and group with /app as its home directory -RUN useradd --user-group --create-home --system --skel /dev/null --home-dir /app vapor - -# Switch to the new home directory +# Create a vapor user and set work directory +RUN useradd --user-group --create-home --system --home-dir /app vapor WORKDIR /app -# Copy built executable and any staged resources from builder +# Copy built artifacts COPY --from=build --chown=vapor:vapor /staging /app COPY --from=build --chown=vapor:vapor /build/.build/release /app -# Uncomment the next line if you need to load resources from the `Public` directory -#COPY --from=build --chown=vapor:vapor /build/Public /app/Public -# Copy dotenv files -#COPY --from=build --chown=vapor:vapor /build/.env /app/.env -#COPY --from=build --chown=vapor:vapor /build/.env.production /app/.env.production -#COPY --from=build --chown=vapor:vapor /build/.env.development /app/.env.development -#COPY --from=build --chown=vapor:vapor /build/.env.test /app/.env.test -# Uncomment the next line if you need to load resources from the `Public` directory -#COPY --from=build --chown=vapor:vapor /build/Public /app/Public -# Uncomment the next line if you need to load resources from the `Resources` directory -#COPY --from=build --chown=vapor:vapor /build/Resources /app/Resources +# Set environment for crash reporter and defaults +ENV SWIFT_ROOT=/usr \ + SWIFT_BACKTRACE=enable=yes,sanitize=yes,threads=all,images=all,interactive=no -# Ensure all further commands run as the vapor user +# Use vapor user USER vapor:vapor -# Let Docker bind to port 8080 +# Expose port and set entrypoint EXPOSE 8080 - -# Start the Vapor service when the image is run, default to listening on 8080 in production environment ENTRYPOINT ["./Main"] CMD ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"] diff --git a/Package.swift b/Package.swift index 867b59b..478e55c 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7 +// swift-tools-version:5.9 import PackageDescription let package = Package(