From d3188d2dd13a8366c606fcdd4b2380fc6641869e Mon Sep 17 00:00:00 2001 From: chrislu Date: Thu, 6 Nov 2025 22:53:51 -0800 Subject: [PATCH] fix docker --- test/foundationdb/Dockerfile.build.arm64 | 104 +++++++++++++++++++++ test/foundationdb/README.md | 24 ++++- test/foundationdb/docker-compose.arm64.yml | 7 +- test/foundationdb/docker-compose.yml | 24 ++--- 4 files changed, 145 insertions(+), 14 deletions(-) create mode 100644 test/foundationdb/Dockerfile.build.arm64 diff --git a/test/foundationdb/Dockerfile.build.arm64 b/test/foundationdb/Dockerfile.build.arm64 new file mode 100644 index 000000000..1afbcd369 --- /dev/null +++ b/test/foundationdb/Dockerfile.build.arm64 @@ -0,0 +1,104 @@ +# Multi-stage Dockerfile to build SeaweedFS with FoundationDB support for ARM64 +FROM --platform=linux/arm64 golang:1.24-bookworm AS builder + +ARG FOUNDATIONDB_VERSION=7.1.0 +ENV FOUNDATIONDB_VERSION=${FOUNDATIONDB_VERSION} + +# Install build dependencies +RUN apt-get update && apt-get install -y \ + build-essential \ + cmake \ + git \ + python3 \ + wget \ + ninja-build \ + libboost-dev \ + libboost-system-dev \ + libboost-filesystem-dev \ + libssl-dev \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Build FoundationDB client libraries from source (ARM64) +WORKDIR /tmp +RUN git clone https://github.com/apple/foundationdb.git && \ + cd foundationdb && \ + git checkout release-7.1 && \ + mkdir build && \ + cd build && \ + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_JAVA_BINDING=OFF \ + -DBUILD_CSHARP_BINDING=OFF \ + -DBUILD_PYTHON_BINDING=OFF \ + -DBUILD_RUBY_BINDING=OFF \ + .. && \ + ninja -j$(nproc) fdb_c && \ + echo "🔍 Verifying FoundationDB build..." && \ + ls -la lib/ && \ + ls -la bindings/c/ + +# Install FoundationDB client libraries +RUN cp /tmp/foundationdb/build/lib/libfdb_c.so /usr/lib/ && \ + cp /tmp/foundationdb/bindings/c/foundationdb/fdb_c.h /usr/include/ && \ + mkdir -p /usr/include/foundationdb && \ + cp /tmp/foundationdb/bindings/c/foundationdb/fdb_c_options.g.h /usr/include/foundationdb/ && \ + ldconfig && \ + echo "✅ FoundationDB client libraries installed" + +# Set up Go environment for CGO +ENV CGO_ENABLED=1 +ENV GOOS=linux +ENV GOARCH=arm64 +ENV CGO_CFLAGS="-I/usr/include -I/usr/include/foundationdb" +ENV CGO_LDFLAGS="-L/usr/lib -lfdb_c" + +# Create work directory +WORKDIR /build + +# Copy source code +COPY . . + +# Download Go dependencies +RUN go mod download + +# Build SeaweedFS with FoundationDB support +RUN echo "🔨 Building SeaweedFS with FoundationDB support for ARM64..." && \ + echo "🔍 Debugging: Checking headers before build..." && \ + find /usr -name "fdb_c.h" -type f 2>/dev/null && \ + ls -la /usr/include/foundationdb/ 2>/dev/null && \ + ls -la /usr/lib/libfdb_c* 2>/dev/null && \ + echo "CGO_CFLAGS: $CGO_CFLAGS" && \ + echo "CGO_LDFLAGS: $CGO_LDFLAGS" && \ + go build -tags foundationdb -ldflags="-w -s" -o ./weed/weed ./weed && \ + chmod +x ./weed/weed && \ + echo "✅ Build successful!" && \ + ./weed/weed version + +# Runtime stage +FROM --platform=linux/arm64 ubuntu:22.04 + +# Install runtime dependencies +RUN apt-get update && apt-get install -y \ + ca-certificates \ + libssl3 \ + && rm -rf /var/lib/apt/lists/* + +# Copy FoundationDB client library from builder +COPY --from=builder /usr/lib/libfdb_c.so /usr/lib/ +RUN ldconfig + +# Copy SeaweedFS binary +COPY --from=builder /build/weed/weed /usr/local/bin/weed + +# Create runtime directories +RUN mkdir -p /var/fdb/config /data + +# Verify binary works +RUN weed version + +# Expose SeaweedFS ports +EXPOSE 9333 19333 8888 8333 18888 + +# Default command +CMD ["weed", "version"] + diff --git a/test/foundationdb/README.md b/test/foundationdb/README.md index 4f17df26e..fdc2c666b 100644 --- a/test/foundationdb/README.md +++ b/test/foundationdb/README.md @@ -38,10 +38,12 @@ make test-emulated # Test with x86 emulation **🍎 For M1/M2/M3 Mac users:** FoundationDB's official Docker images are AMD64-only. We provide three solutions: -- **Native ARM64** (`make setup-arm64`) - Builds FoundationDB from source (10-15 min setup, the best performance) +- **Native ARM64** (`make setup-arm64`) - Builds FoundationDB and SeaweedFS from source for ARM64 (10-15 min setup, the best performance) - **x86 Emulation** (`make setup-emulated`) - Uses Docker emulation (fast setup, slower runtime) - **Mock Testing** (`make test-mock`) - No FoundationDB needed (instant, tests logic only) +The ARM64 setup automatically builds both FoundationDB and SeaweedFS from source using `docker-compose.arm64.yml` and dedicated ARM64 Dockerfiles. No pre-built images required! + 📖 **Detailed Guide:** See [README.ARM64.md](README.ARM64.md) for complete ARM64 documentation. ## Test Environment @@ -93,6 +95,26 @@ export WEED_FOUNDATIONDB_API_VERSION=740 export WEED_FOUNDATIONDB_TIMEOUT=10s ``` +#### Docker Compose Environment Variables + +The `docker-compose.yml` file supports the following optional environment variables with sensible defaults: + +```bash +# FoundationDB image (default: foundationdb/foundationdb:7.1.61) +export FOUNDATIONDB_IMAGE=foundationdb/foundationdb:7.1.61 + +# FoundationDB port (default: 4500) +export FDB_PORT=4500 + +# FoundationDB cluster file contents (default: docker:docker@fdb1:4500,fdb2:4500,fdb3:4500) +export FDB_CLUSTER_FILE_CONTENTS="docker:docker@fdb1:4500,fdb2:4500,fdb3:4500" + +# SeaweedFS image (default: chrislusf/seaweedfs:latest) +export SEAWEEDFS_IMAGE=chrislusf/seaweedfs:latest +``` + +**Note:** These variables are optional. If not set, the docker-compose will use the default values shown above, allowing `docker-compose up` to work out-of-the-box without any `.env` file or manual configuration. + ### Docker Compose Configuration The `docker-compose.yml` sets up: diff --git a/test/foundationdb/docker-compose.arm64.yml b/test/foundationdb/docker-compose.arm64.yml index 5b0854485..9c8f091e9 100644 --- a/test/foundationdb/docker-compose.arm64.yml +++ b/test/foundationdb/docker-compose.arm64.yml @@ -135,7 +135,12 @@ services: # SeaweedFS service with FoundationDB filer seaweedfs: - image: chrislusf/seaweedfs:local + build: + context: ../.. + dockerfile: test/foundationdb/Dockerfile.build.arm64 + platforms: + - linux/arm64 + platform: linux/arm64 ports: - "9333:9333" - "19333:19333" diff --git a/test/foundationdb/docker-compose.yml b/test/foundationdb/docker-compose.yml index a1d14ea04..a1257d5c9 100644 --- a/test/foundationdb/docker-compose.yml +++ b/test/foundationdb/docker-compose.yml @@ -1,12 +1,12 @@ services: fdb1: - image: $FOUNDATIONDB_IMAGE + image: ${FOUNDATIONDB_IMAGE:-foundationdb/foundationdb:7.1.61} environment: - FDB_CLUSTER_FILE_CONTENTS - FDB_NETWORKING_MODE=container - - FDB_COORDINATOR_PORT=$FDB_PORT - - FDB_PORT=$FDB_PORT + - FDB_COORDINATOR_PORT=${FDB_PORT:-4500} + - FDB_PORT=${FDB_PORT:-4500} networks: - fdb_network healthcheck: @@ -16,12 +16,12 @@ services: retries: 60 fdb2: - image: $FOUNDATIONDB_IMAGE + image: ${FOUNDATIONDB_IMAGE:-foundationdb/foundationdb:7.1.61} environment: - FDB_CLUSTER_FILE_CONTENTS - FDB_NETWORKING_MODE=container - - FDB_COORDINATOR_PORT=$FDB_PORT - - FDB_PORT=$FDB_PORT + - FDB_COORDINATOR_PORT=${FDB_PORT:-4500} + - FDB_PORT=${FDB_PORT:-4500} networks: - fdb_network healthcheck: @@ -31,12 +31,12 @@ services: retries: 60 fdb3: - image: $FOUNDATIONDB_IMAGE + image: ${FOUNDATIONDB_IMAGE:-foundationdb/foundationdb:7.1.61} environment: - FDB_CLUSTER_FILE_CONTENTS - FDB_NETWORKING_MODE=container - - FDB_COORDINATOR_PORT=$FDB_PORT - - FDB_PORT=$FDB_PORT + - FDB_COORDINATOR_PORT=${FDB_PORT:-4500} + - FDB_PORT=${FDB_PORT:-4500} networks: - fdb_network healthcheck: @@ -47,7 +47,7 @@ services: # Initialize and configure the database fdb-init: - image: $FOUNDATIONDB_IMAGE + image: ${FOUNDATIONDB_IMAGE:-foundationdb/foundationdb:7.1.61} configs: - target: /var/fdb/config/fdb.cluster source: fdb.cluster @@ -89,7 +89,7 @@ services: # SeaweedFS service with FoundationDB filer seaweedfs: - image: $SEAWEEDFS_IMAGE + image: ${SEAWEEDFS_IMAGE:-chrislusf/seaweedfs:latest} depends_on: fdb-init: condition: service_completed_successfully @@ -121,7 +121,7 @@ services: configs: fdb.cluster: content: | - $FDB_CLUSTER_FILE_CONTENTS + ${FDB_CLUSTER_FILE_CONTENTS:-docker:docker@fdb1:4500,fdb2:4500,fdb3:4500} networks: fdb_network: