core/Dockerfile
Rama master · réplica de lectura del repositorio original.
FROM debian:bookworm AS builder
ARG tag_name
ARG GRAAL_JDK_VERSION=25.0.2
ARG TARGETARCH
# Pinned cargo-deny version used to regenerate THIRD_PARTY_LICENSES.txt.
ARG CARGO_DENY_VERSION=0.19.8
ENV GOSU_VERSION=1.19-go1.27.3
ENV DEBIAN_FRONTEND=noninteractive
# 1) Base tools + Maven + build-essential (for native compilation)
# `git` is required by buildnumber-maven-plugin (core/pom.xml) at build time
# to embed the HEAD revision; keep it installed even though the sources now
# come from the build context rather than a `git clone`.
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
git curl wget gnupg2 ca-certificates lsb-release software-properties-common unzip maven build-essential \
&& rm -rf /var/lib/apt/lists/*
# 2) Install Rust
ENV HOME=/root
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --no-modify-path --profile minimal
ENV PATH="$HOME/.cargo/bin:$PATH"
RUN rustc --version --verbose
# 3) Download GraalVM CE archive + SHA256, arch-aware
RUN set -eux; \
: "${TARGETARCH:=amd64}"; \
case "$TARGETARCH" in \
amd64) ARCH_SUFFIX="linux-x64" ;; \
arm64) ARCH_SUFFIX="linux-aarch64" ;; \
*) echo "Unsupported TARGETARCH: $TARGETARCH" >&2; exit 1 ;; \
esac; \
echo "Building for TARGETARCH=${TARGETARCH}, using GraalVM suffix ${ARCH_SUFFIX}"; \
TAG="jdk-${GRAAL_JDK_VERSION}"; \
FILENAME="graalvm-community-jdk-${GRAAL_JDK_VERSION}_${ARCH_SUFFIX}_bin.tar.gz"; \
BASE_URL="https://github.com/graalvm/graalvm-ce-builds/releases/download/${TAG}"; \
mkdir -p /tmp/graalvm; \
cd /tmp/graalvm; \
curl -L -o "${FILENAME}" "${BASE_URL}/${FILENAME}"; \
curl -L -o "${FILENAME}.sha256" "${BASE_URL}/${FILENAME}.sha256"
# 4) Verify SHA256 and install GraalVM CE
RUN set -eux; \
: "${TARGETARCH:=amd64}"; \
case "$TARGETARCH" in \
amd64) ARCH_SUFFIX="linux-x64" ;; \
arm64) ARCH_SUFFIX="linux-aarch64" ;; \
*) echo "Unsupported TARGETARCH: $TARGETARCH" >&2; exit 1 ;; \
esac; \
cd /tmp/graalvm; \
FILENAME="graalvm-community-jdk-${GRAAL_JDK_VERSION}_${ARCH_SUFFIX}_bin.tar.gz"; \
# .sha256 contains only the hash, so wrap it with filename for sha256sum -c
HASH="$(cut -d ' ' -f1 "${FILENAME}.sha256")"; \
echo "${HASH} ${FILENAME}" | sha256sum -c -; \
INSTALL_DIR="/usr/lib/jvm/graalvm-community-jdk-${GRAAL_JDK_VERSION}"; \
mkdir -p "${INSTALL_DIR}"; \
tar -xzf "${FILENAME}" -C "${INSTALL_DIR}" --strip-components=1; \
rm -rf /tmp/graalvm
ENV JAVA_HOME=/usr/lib/jvm/graalvm-community-jdk-${GRAAL_JDK_VERSION}
ENV PATH="${JAVA_HOME}/bin:${PATH}"
RUN echo tag_name ${tag_name:-master}
WORKDIR /build/questdb
COPY . .
# Refresh the bundled Rust third-party license attributions (shipped in the
# distribution's legal/ dir and questdb.jar's META-INF) before packaging, so
# they match the crates linked into libquestdbr. Installs cargo-deny if absent.
RUN CARGO_DENY_VERSION="${CARGO_DENY_VERSION}" bash ci/generate_third_party_licenses.sh
# Auto-detect how the java-questdb-client dependency must be resolved.
# If core/pom.xml references a -SNAPSHOT client version, that artifact is not
# published to Maven Central, so we build it from the bundled java-questdb-client
# submodule by enabling the `local-client` Maven profile. For a released client
# version we resolve it from Maven Central (no extra profile).
# NOTE: for the SNAPSHOT path the submodule must be present in the build context
# (the docker-release pipeline checks it out via `submodules: true`) and its
# version must match questdb.client.version.
RUN set -eux; \
CLIENT_VERSION="$(sed -n 's/.*<questdb.client.version>\(.*\)<\/questdb.client.version>.*/\1/p' core/pom.xml | head -1)"; \
echo "questdb.client.version=${CLIENT_VERSION}"; \
CLIENT_PROFILE=""; \
case "${CLIENT_VERSION}" in \
*-SNAPSHOT) echo "SNAPSHOT client detected, activating local-client profile"; CLIENT_PROFILE=",local-client" ;; \
*) echo "Release client detected, resolving from Maven Central" ;; \
esac; \
mvn clean package -Djdk.lang.Process.launchMechanism=vfork -Dmaven.resolver.transport=wagon -Dmaven.wagon.httpconnectionManager.ttlSeconds=30 -DskipTests -P "build-web-console,build-binaries${CLIENT_PROFILE}"
WORKDIR /build/questdb/core/target
RUN tar xvfz questdb-*-rt-*.tar.gz
RUN rm questdb-*-rt-*.tar.gz
RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
wget -O "gosu-$dpkgArch" "https://github.com/questdb/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" && \
wget -O SHA256SUMS "https://github.com/questdb/gosu/releases/download/$GOSU_VERSION/SHA256SUMS" && \
grep "gosu-$dpkgArch\$" SHA256SUMS | sha256sum -c - && \
rm SHA256SUMS && \
mv "gosu-$dpkgArch" gosu && \
chmod +x gosu && \
./gosu --version && \
./gosu nobody true
##############################################################################
######################### Build for RedHat OpenShift #########################
##############################################################################
FROM registry.access.redhat.com/ubi10/ubi-minimal AS rhel
ARG tag_name
WORKDIR /app
COPY --from=builder /build/questdb/core/target/questdb-*-rt-* .
COPY core/docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
# Add license information
RUN mkdir /licenses
COPY core/LICENSE.txt /licenses
LABEL name=QuestDB \
vendor=QuestDB \
summary="Provides the latest release of QuestDB" \
description="QuestDB is an open source time-series database for fast ingest and SQL queries" \
version=${tag_name:-master} \
release=${tag_name:-master} \
maintainer=QuestDB \
url="https://github.com/questdb/questdb"
# Create questdb user and group
RUN microdnf install -y shadow-utils util-linux grep && \
groupadd -g 10001 questdb && \
useradd -u 10001 -g 10001 -d /var/lib/questdb -M -s /sbin/nologin questdb && \
microdnf remove -y shadow-utils && \
microdnf clean all && \
mkdir -p /var/lib/questdb && \
chown -R questdb:questdb /var/lib/questdb
USER questdb
WORKDIR /var/lib/questdb
# Make port 9000 available to the world outside this container
EXPOSE 9000/tcp
EXPOSE 8812/tcp
EXPOSE 9009/tcp
ENV DO_CHOWN="false"
ENTRYPOINT ["/docker-entrypoint.sh"]
##############################################################################
########################## General-use Docker build ##########################
##############################################################################
FROM quay.io/fedora/fedora-minimal:44 AS questdb
ARG tag_name
WORKDIR /app
COPY --from=builder /build/questdb/core/target/questdb-*-rt-* .
COPY --from=builder /build/questdb/core/target/gosu /usr/local/bin/gosu
COPY core/docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
# Create questdb user and group
RUN microdnf install -y shadow-utils util-linux grep && \
groupadd -g 10001 questdb && \
useradd -u 10001 -g 10001 -d /var/lib/questdb -M -s /sbin/nologin questdb && \
microdnf remove -y shadow-utils && \
microdnf clean all && \
mkdir -p /var/lib/questdb && \
chown -R questdb:questdb /var/lib/questdb
WORKDIR /var/lib/questdb
# Make port 9000 available to the world outside this container
EXPOSE 9000/tcp
EXPOSE 8812/tcp
EXPOSE 9009/tcp
#
# Run QuestDB when the container launches
#
# 'conf/log.conf' is a placeholder, it does not exist out of box
# which make logger use default configuration. However, when user configures
# a volume with something like:
#
# docker run -v "$(pwd):/var/lib/questdb/" questdb/questdb
#
# then one can create 'log.conf' in the 'conf' dir and override logger fully
#
ENTRYPOINT ["/docker-entrypoint.sh"]