# syntax=docker/dockerfile:1 # 分阶段构建存储和四个程序,运行镜像不包含编译器。 ARG DEBIAN_MIRROR=http://mirrors.tencentyun.com ARG BASE_REGISTRY=docker.io FROM ${BASE_REGISTRY}/library/rust:1-bookworm@sha256:e12566d5abc17a0da741628782cdb504b68b8961f5bfcf677936bf3e8b32de29 AS storage ARG CARGO_REGISTRY=sparse+https://rsproxy.cn/index/ ENV CARGO_BUILD_JOBS=1 CARGO_HTTP_TIMEOUT=30 WORKDIR /build/chusql-core/storage COPY chusql-core/storage/Cargo.toml chusql-core/storage/Cargo.lock ./ COPY chusql-core/storage/src ./src RUN --mount=type=cache,target=/usr/local/cargo/registry \ cargo --config 'source.crates-io.replace-with="build-mirror"' \ --config "source.build-mirror.registry=\"${CARGO_REGISTRY}\"" \ build --release --locked --jobs 1 FROM ${BASE_REGISTRY}/library/haskell:9.10.3-slim-bookworm@sha256:4f1f62fec9cea4cbb03e885c9ad45642609cadd3897b1e64a7f61d0862b575b1 AS haskell ARG DEBIAN_MIRROR RUN sed -i "s|http://deb.debian.org|${DEBIAN_MIRROR}|g" /etc/apt/sources.list.d/debian.sources \ && apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=30 update \ && apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=30 install -y --no-install-recommends libgmp-dev zlib1g-dev \ && rm -rf /var/lib/apt/lists/* ENV LD_LIBRARY_PATH=/build/chusql-core/storage/target/release \ GHCRTS=-M1536m WORKDIR /build COPY --from=storage /build/chusql-core/storage/target/release/libchusql_core_storage.so ./chusql-core/storage/target/release/ COPY chusql-core/model ./chusql-core/model COPY chusql-core/engine ./chusql-core/engine COPY chusql-interface ./chusql-interface COPY chusql-bootstrap ./chusql-bootstrap COPY chusql-server ./chusql-server COPY chusql-web ./chusql-web COPY chusql-cli ./chusql-cli RUN --mount=type=cache,target=/root/.stack \ stack --stack-yaml chusql-cli/stack.yaml --system-ghc --no-install-ghc \ build --fast --jobs 1 --ghc-options=-j1 --copy-bins --local-bin-path /out/bin \ chusql-server:exe:chusql-server chusql-bootstrap:exe:csql-bootstrap \ chusql-web:exe:chusql-web chusql-cli:exe:csql FROM ${BASE_REGISTRY}/library/debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587 AS runtime ARG DEBIAN_MIRROR RUN sed -i "s|http://deb.debian.org|${DEBIAN_MIRROR}|g" /etc/apt/sources.list.d/debian.sources \ && apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=30 update \ && apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=30 install -y --no-install-recommends \ ca-certificates libgmp10 libnuma1 libffi8 libtinfo6 zlib1g curl netcat-openbsd \ && rm -rf /var/lib/apt/lists/* \ && groupadd --gid 10001 chusql \ && useradd --uid 10001 --gid chusql --create-home chusql \ && install -d -o chusql -g chusql /var/lib/chusql /var/log/chusql /opt/chusql/resources WORKDIR /opt/chusql COPY --from=haskell /out/bin/ ./bin/ COPY --from=storage /build/chusql-core/storage/target/release/libchusql_core_storage.so ./bin/ COPY chusql-web/static ./static COPY docker/server.toml docker/web.toml /etc/chusql/ COPY --chmod=755 docker/entrypoint.sh docker/healthcheck.sh /usr/local/bin/ ENV PATH=/opt/chusql/bin:${PATH} \ LD_LIBRARY_PATH=/opt/chusql/bin \ LANG=C.UTF-8 \ CHUSQL_ADMIN_USER=root USER 10001:10001 EXPOSE 7777 7778 HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=5 \ CMD ["healthcheck.sh", "server"] ENTRYPOINT ["entrypoint.sh"] CMD ["server"]