You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker Compose本地部署Vapor App时遇Signal 4错误求助

部署Vapor应用Docker时遇到Signal 4错误排查

问题背景

本地直接运行Vapor应用正常,但通过docker-compose部署时,步骤3启动应用报错:Received signal 4. Backtrace:。步骤1(构建Docker镜像)、步骤2(启动依赖服务)执行正常,Swift编译器已成功完成应用构建。

环境信息

  • MacBook M1 Pro 14英寸 2021款
  • 32GB 内存

错误截图

错误截图

相关配置文件

执行脚本

#!/bin/bash
echo "Step 1: Build Docker"
docker-compose -f local-docker-compose.yml build
echo "Step 2: Start dependencies"
docker-compose -f local-docker-compose.yml run --rm
echo "Step 3: Start Vapor App"
docker-compose -f local-docker-compose.yml up myapp-beta

local.Dockerfile

# Build image
FROM --platform=linux/x86-64 swift:5.5-focal as build

RUN apt-get update -y \
    && apt-get install -y libsqlite3-dev

WORKDIR /build

COPY . .

RUN swift build \
    --enable-test-discovery \
    -c release \
    -Xswiftc -g


# Run image
FROM --platform=linux/x86-64 swift:5.5-focal-slim

RUN useradd --user-group --create-home --home-dir /app vapor

WORKDIR /app

COPY --from=build --chown=vapor:vapor /build/.build/release /app
COPY --from=build --chown=vapor:vapor /build/Public /app/Public

# ARS RDS Environment ARG
ARG AWS_RDS_HOST
ARG AWS_RDS_PORT
ARG AWS_RDS_USER
ARG AWS_RDS_PASS
ARG AWS_RDS_DB

# SignInWithApple Environment ARG
ARG SIWA_ID
ARG SIWA_REDIRECT_URL
ARG SIWA_JWK_ID
ARG SIWA_PRIVATE_KEY
ARG SIWA_TEAM_ID
ARG SIWA_APP_BUNDLE_ID

# Set Environment
RUN echo "SIWA_ID=${SIWA_ID}" > .env.testing
RUN echo "SIWA_REDIRECT_URL=${SIWA_REDIRECT_URL}" >> .env.testing
RUN echo "SIWA_JWK_ID=${SIWA_JWK_ID}" >> .env.testing
RUN echo "SIWA_PRIVATE_KEY=${SIWA_PRIVATE_KEY}" >> .env.testing
RUN echo "SIWA_TEAM_ID=${SIWA_TEAM_ID}" >> .env.testing
RUN echo "SIWA_APP_BUNDLE_ID=${SIWA_APP_BUNDLE_ID}" >> .env.testing

RUN echo "DB_HOST=${AWS_RDS_HOST}" >> .env.testing
RUN echo "DB_PORT=${AWS_RDS_PORT}" >> .env.testing
RUN echo "DB_USER=${AWS_RDS_USER}" >> .env.testing
RUN echo "DB_PASS=${AWS_RDS_PASS}" >> .env.testing
RUN echo "DB_NAME=${AWS_RDS_DB}" >> .env.testing

USER vapor

EXPOSE 8080

ENTRYPOINT ["./Run"]
CMD ["serve", "--env", "local", "--hostname", "0.0.0.0", "--port", "8080"]

local-docker-compose.yml

version: '3.7'
services:
  myapp-beta:
    depends_on:
      - postgres
    build:
      context: .
      args:
        AWS_RDS_HOST: postgres
        AWS_RDS_PORT: 5432
        AWS_RDS_USER: test
        AWS_RDS_PASS: test1228!1
        AWS_RDS_DB: myapp_db
        SIWA_ID: com.beta.myapp.service
        SIWA_REDIRECT_URL: localhost:8080
        SIWA_JWK_ID: JLJKLXXXX
        SIWA_PRIVATE_KEY: xxxxxxx
        SIWA_TEAM_ID: 9DFSXXXX
        SIWA_APP_BUNDLE_ID: com.beta.myapp
      dockerfile: local.Dockerfile
    ports:
      - '8080:8080'

  postgres:
    image: postgres
    environment:
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test1228!1
      POSTGRES_DB: myapp_db

  start_dependencies:
    image: dadarek/wait-for-dependencies
    depends_on:
      - postgres
    command: postgres:5432

排查思路与解决方法

Signal 4对应SIGILL(非法指令),在M1芯片Mac上运行x86-64镜像时极易出现这类兼容性问题,以下是针对性修复步骤:

  1. 调整Docker镜像平台适配

    • 移除Dockerfile中--platform=linux/x86-64指定,改用官方支持arm64的Swift镜像,修改Dockerfile开头:
      # Build image
      FROM swift:5.5-focal as build
      # Run image
      FROM swift:5.5-focal-slim
      
    • 若必须使用x86-64镜像,需开启Docker Desktop的Rosetta模拟:打开Docker设置 -> Features in development -> 勾选"Use Rosetta for x86/amd64 emulation on Apple Silicon",重启Docker。
  2. 修复依赖等待逻辑

    • 当前步骤2的docker-compose run --rm未指定服务名,实际不会执行start_dependencies的等待逻辑,导致Postgres未完全就绪时Vapor应用就尝试连接,可能触发异常。修改脚本步骤2:
      echo "Step 2: Start dependencies"
      docker-compose -f local-docker-compose.yml run --rm start_dependencies
      
  3. 检查环境变量注入完整性

    • 进入容器验证.env.testing文件内容是否正确:
      docker exec -it <container-id> cat /app/.env.testing
      
    • 若SIWA私钥包含换行符,直接用echo写入会丢失格式,需改用printf或挂载文件的方式注入,避免因私钥格式错误导致启动崩溃。
  4. 升级Swift版本

    • Swift 5.5在arm64模拟环境中存在已知兼容性问题,尝试升级到Swift 5.6或更高版本的镜像,替换Dockerfile中的swift:5.5-focal为swift:5.6-focal。

内容的提问来源于stack exchange,提问作者Shawn Baek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:27:28