使用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镜像时极易出现这类兼容性问题,以下是针对性修复步骤:
调整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。
- 移除Dockerfile中
修复依赖等待逻辑
- 当前步骤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
- 当前步骤2的
检查环境变量注入完整性
- 进入容器验证
.env.testing文件内容是否正确:docker exec -it <container-id> cat /app/.env.testing - 若SIWA私钥包含换行符,直接用
echo写入会丢失格式,需改用printf或挂载文件的方式注入,避免因私钥格式错误导致启动崩溃。
- 进入容器验证
升级Swift版本
- Swift 5.5在arm64模拟环境中存在已知兼容性问题,尝试升级到Swift 5.6或更高版本的镜像,替换Dockerfile中的
swift:5.5-focal为swift:5.6-focal。
- Swift 5.5在arm64模拟环境中存在已知兼容性问题,尝试升级到Swift 5.6或更高版本的镜像,替换Dockerfile中的
内容的提问来源于stack exchange,提问作者Shawn Baek
相关产品推荐
相关产品推荐

