Vapor builder docker image success run error not fount libswift_Concurrency.so

./Run: error while loading shared libraries: libswift_Concurrency.so: cannot open shared object file: No such file or directory

Can you share your Dockerfile and Package.swift to help locating the problem?

@stevapple
First of all thank you I first used Vapor new to create a template project, the compilation will report the following error

#18 819.4 [935/936] Compiling Vapor Application.swift
#18 819.7 remark: Incremental compilation has been disabled: it is not compatible with whole module optimization[937/938] Compiling Fluent FluentProvider+Concurrency.swift
#18 830.6 remark: Incremental compilation has been disabled: it is not compatible with whole module optimization[939/940] Compiling App TodoController.swift
#18 850.4 remark: Incremental compilation has been disabled: it is not compatible with whole module optimization[941/942] Compiling Run main.swift
#18 871.2 error: link command failed with exit code 254 (use -v to see invocation)
#18 871.2 clang-10: error: unable to execute command: Killed
#18 871.2 clang-10: error: linker command failed due to signal (use -v to see invocation)
#18 871.9 [942/943] Linking Run
------
failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c swift build -c release --static-swift-stdlib]: exit code: 1

When I remove the parameter --static-swift-stdlib it compiles successfully but doesn't run

Below is the automatically generated Dockerfile

# ================================
# Build image
# ================================
FROM swift:5.5-focal as build

# Install OS updates and, if needed, sqlite3
RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \
    && apt-get -q update \
    && apt-get -q dist-upgrade -y \
    && 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.
COPY ./Package.* ./
RUN swift package resolve

# Copy entire repo into container
COPY . .

# Build everything, with optimizations
RUN swift build -c release --static-swift-stdlib

# Switch to the staging area
WORKDIR /staging

# Copy main executable to staging area
RUN cp "$(swift build --package-path /build -c release --show-bin-path)/Run" ./

# 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/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

# Make sure all system packages are up to date.
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 && \
    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
WORKDIR /app

# Copy built executable and any staged resources from builder
COPY --from=build --chown=vapor:vapor /staging /app

# Ensure all further commands run as the vapor user
USER vapor:vapor

# Let Docker bind to port 8080
EXPOSE 8080

# Start the Vapor service when the image is run, default to listening on 8080 in production environment
ENTRYPOINT ["./Run"]
CMD ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]

My Package.swift

// swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "hello1",
    platforms: [
       .macOS(.v12)
    ],
    dependencies: [
        // πŸ’§ A server-side Swift web framework.
        .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
        .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"),
        .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0"),
    ],
    targets: [
        .target(
            name: "App",
            dependencies: [
                .product(name: "Fluent", package: "fluent"),
                .product(name: "FluentPostgresDriver", package: "fluent-postgres-driver"),
                .product(name: "Vapor", package: "vapor")
            ],
            swiftSettings: [
                // Enable better optimizations when building in Release configuration. Despite the use of
                // the `.unsafeFlags` construct required by SwiftPM, this flag is recommended for Release
                // builds. See <https://github.com/swift-server/guides/blob/main/docs/building.md#building-for-production> for details.
                .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release))
            ]
        ),
        .executableTarget(name: "Run", dependencies: [.target(name: "App")]),
        .testTarget(name: "AppTests", dependencies: [
            .target(name: "App"),
            .product(name: "XCTVapor", package: "vapor"),
        ])
    ]
)

--static-swift-stdlib is required to statically link Swift runtime libraries, but it will consume a lot more memory. It seems your builder ran out of memory, so it killed swift-build.

If you cannot statically link Swift libraries, you would need to copy the dynamic libraries along with Run:

RUN cp "$(swift build --package-path /build -c release --show-bin-path)/Run" ./
RUN ldd Run | grep swift | awk '{print $3}' | xargs cp -Lv -t .

@stevapple

Thanks I will try the solution you provided My current build system is running on macOS 12.2 with Xcode version 13.2.1. The maximum memory is 16G, and 11G memory has been used.

Given that you’re building inside a Docker container, you may go and check the memory settings in Docker Desktop. 8GB would be fairly enough IMO.

I'll go to the settings and try again

@stevapple

I have upgraded Docker's default 2G memory to 8G and the compilation has been completed. Thank you for helping me during your busy schedule on Sunday. Thank you very much.