65 lines
2.6 KiB
Docker
65 lines
2.6 KiB
Docker
# Use Go 1.22 Alpine as the base image for building the application
|
||
FROM golang:1.22-alpine AS builder
|
||
|
||
# Install git, build tools and dependencies for Quirc
|
||
RUN apk add --no-cache git ca-certificates build-base make gcc musl-dev pkgconfig
|
||
|
||
# Build and install Quirc library (static library)
|
||
RUN cd /tmp && \
|
||
git clone --depth 1 https://github.com/dlbeer/quirc.git && \
|
||
cd quirc && \
|
||
sed -i 's/\$(shell pkg-config --cflags sdl 2>&1)/\$(shell pkg-config --cflags sdl 2>\/dev\/null || true)/g' Makefile && \
|
||
sed -i 's/\$(shell pkg-config --libs sdl)/\$(shell pkg-config --libs sdl 2>\/dev\/null || true)/g' Makefile && \
|
||
sed -i 's/\$(shell pkg-config --cflags opencv4 2>&1)/\$(shell pkg-config --cflags opencv4 2>\/dev\/null || true)/g' Makefile && \
|
||
sed -i 's/\$(shell pkg-config --libs opencv4)/\$(shell pkg-config --libs opencv4 2>\/dev\/null || true)/g' Makefile && \
|
||
make libquirc.a && \
|
||
mkdir -p /usr/local/lib /usr/local/include && \
|
||
cp libquirc.a /usr/local/lib/ && \
|
||
cp lib/quirc.h /usr/local/include/ && \
|
||
ls -la /usr/local/lib/libquirc.a /usr/local/include/quirc.h && \
|
||
rm -rf /tmp/quirc
|
||
|
||
# Define the base directory for the application as an environment variable
|
||
ENV SERVER_DIR=/openim-server
|
||
ENV CGO_ENABLED=1
|
||
|
||
# Set the working directory inside the container based on the environment variable
|
||
WORKDIR $SERVER_DIR
|
||
|
||
# Copy protocol directory
|
||
COPY protocol /protocol
|
||
|
||
# Copy current directory
|
||
COPY . .
|
||
|
||
RUN go mod tidy
|
||
|
||
# Build with static linking for Quirc (静态链接,运行时无需库文件)
|
||
# 使用 -ldflags 强制静态链接 Quirc 库和数学库
|
||
# 注意:Alpine Linux 使用 musl libc,需要静态链接数学库
|
||
RUN go build -tags cgo \
|
||
-ldflags '-linkmode external -extldflags "-static -L/usr/local/lib -lquirc -lm"' \
|
||
-o _output/openim-rpc-msg ./cmd/openim-rpc/openim-rpc-msg && \
|
||
echo "构建完成,验证二进制文件..." && \
|
||
file _output/openim-rpc-msg && \
|
||
ldd _output/openim-rpc-msg 2>&1 | head -5 || echo "静态链接验证:二进制文件不依赖动态库(这是正常的)"
|
||
|
||
|
||
# Using Alpine Linux for the final image
|
||
FROM alpine:latest
|
||
|
||
# Install necessary packages, such as bash
|
||
RUN apk add --no-cache bash
|
||
|
||
# Set the environment and work directory
|
||
ENV SERVER_DIR=/openim-server
|
||
WORKDIR $SERVER_DIR
|
||
|
||
|
||
# Copy the compiled binaries and mage from the builder image to the final image
|
||
COPY --from=builder $SERVER_DIR/_output $SERVER_DIR/_output
|
||
# COPY --from=builder $SERVER_DIR/config $SERVER_DIR/config
|
||
|
||
# Set the command to run when the container starts
|
||
ENTRYPOINT ["sh", "-c", "_output/openim-rpc-msg"]
|