blob: 7e99ee5fcd31dc73bc3c4d4d8bedcd593f09149c [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# This docker file defines a multistage build that supports creating
# various docker images for Apache Kudu development.
#
# Note: When editing this file, please follow the best practices laid out here:
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices
#
# Note: This file uses the shared label namespace for common labels. See:
# http://label-schema.org/rc1/
#
# ---- Runtime ----
# Builds a base image that has all the runtime libraries for Kudu pre-installed.
#
ARG BASE_OS
FROM $BASE_OS as runtime
COPY ./docker/bootstrap-runtime-env.sh /
RUN ./bootstrap-runtime-env.sh && rm bootstrap-runtime-env.sh
# Common label arguments.
# VCS_REF is not specified to improve docker caching.
ARG DOCKERFILE
ARG MAINTAINER
ARG URL
ARG VCS_TYPE
ARG VCS_URL
ARG VERSION
LABEL org.label-schema.name="Apache Kudu Runtime Base" \
org.label-schema.description="A base image that has all the runtime \
libraries for Kudu pre-installed." \
# Common labels.
org.label-schema.dockerfile=$DOCKERFILE \
org.label-schema.maintainer=$MAINTAINER \
org.label-schema.url=$URL \
org.label-schema.vcs-type=$VCS_TYPE \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.version=$VERSION
#
# ---- Dev ----
# Builds a base image that has all the development libraries for Kudu pre-installed.
#
ARG BASE_OS
FROM $BASE_OS as dev
COPY ./docker/bootstrap-dev-env.sh /
RUN ./bootstrap-dev-env.sh && rm bootstrap-dev-env.sh
# Common label arguments.
# VCS_REF is not specified to improve docker caching.
ARG DOCKERFILE
ARG MAINTAINER
ARG URL
ARG VCS_TYPE
ARG VCS_URL
ARG VERSION
LABEL org.label-schema.name="Apache Kudu Development Base" \
org.label-schema.description="A base image that has all the development \
libraries for Kudu pre-installed." \
# Common labels.
org.label-schema.dockerfile=$DOCKERFILE \
org.label-schema.maintainer=$MAINTAINER \
org.label-schema.url=$URL \
org.label-schema.vcs-type=$VCS_TYPE \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.version=$VERSION
#
# ---- Thirdparty ----
# Builds an image that has Kudu's thirdparty dependencies built.
# This is done in its own stage so that docker can cache it and only
# run it when thirdparty has changes.
#
FROM dev AS thirdparty
WORKDIR /kudu
# We only copy the needed files for thirdparty so docker can handle caching.
COPY ./thirdparty thirdparty
COPY ./build-support/enable_devtoolset.sh \
./build-support/enable_devtoolset_inner.sh \
build-support/
RUN build-support/enable_devtoolset.sh \
thirdparty/build-if-necessary.sh \
# Remove the files left behind that we don't need.
# Remove all the source files except the hive, hadoop, and sentry sources
# which are pre-built and symlinked into the installed/common/opt directory.
&& find thirdparty/src/* -maxdepth 0 -type d \
\( ! -name 'hadoop-*' ! -name 'hive-*' ! -name 'apache-sentry-*' \) \
-prune -exec rm -rf {} \; \
# Remove all the build files except the llvm build which is symlinked into
# the clang-toolchain directory.
&& find thirdparty/build/* -maxdepth 0 -type d ! -name 'llvm-*' -prune -exec rm -rf {} \;
# Common label arguments.
# VCS_REF is not specified to improve docker caching.
ARG DOCKERFILE
ARG MAINTAINER
ARG URL
ARG VCS_REF
ARG VCS_TYPE
ARG VCS_URL
ARG VERSION
LABEL name="Apache Kudu Thirdparty" \
description="An image that has Kudu's thirdparty dependencies pre-built." \
# Common labels.
org.label-schema.dockerfile=$DOCKERFILE \
org.label-schema.maintainer=$MAINTAINER \
org.label-schema.url=$URL \
org.label-schema.vcs-type=$VCS_TYPE \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.version=$VERSION
#
# ---- Build ----
# Builds an image that has the Kudu source code pre-built.
# This is useful for generating a runtime image, but can also be a
# useful base development image.
#
FROM thirdparty AS build
ARG BUILD_TYPE=release
ARG LINK_TYPE=static
ARG STRIP=1
ARG PARALLEL=4
# This is a common label argument, but also used in the build invocation.
ARG VCS_REF
# Use the bash shell for all RUN commands.
SHELL ["/bin/bash", "-c"]
WORKDIR /kudu
# Copy the C++ build source.
# We copy the minimal source to optimize docker cache hits.
COPY ./build-support build-support
COPY ./docs/support docs/support
COPY ./cmake_modules cmake_modules
COPY ./examples/cpp examples/cpp
COPY ./java/kudu-hive/ java/kudu-hive/
COPY ./src src
COPY ./CMakeLists.txt ./version.txt ./
# Build the c++ code.
WORKDIR /kudu/build/$BUILD_TYPE
# Ensure we don't rebuild thirdparty. Instead let docker handle caching.
ENV NO_REBUILD_THIRDPARTY=1
RUN ../../build-support/enable_devtoolset.sh \
../../thirdparty/installed/common/bin/cmake \
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
-DKUDU_LINK=$LINK_TYPE \
-DKUDU_GIT_HASH=$VCS_REF \
# The release build is massive with tests built.
-DNO_TESTS=1 \
../.. \
&& make -j${PARALLEL} \
# Install the client libraries for the python build to use.
# TODO: Use custom install location when the python build can be configured to use it.
&& make install \
# Strip the binaries to reduce the images size.
&& if [ "$STRIP" == "1" ]; then find "bin" -name "kudu*" -type f -exec strip {} \;; fi \
# Strip the client libraries to reduce the images size
&& if [[ "$STRIP" == "1" ]]; then find "/usr/local" -name "libkudu*" -type f -exec strip {} \;; fi
# Copy the java build source.
COPY ./java /kudu/java
# Build the java code.
WORKDIR /kudu/java
RUN ./gradlew jar
# Copy the python build source.
COPY ./python /kudu/python
# Build the python code.
WORKDIR /kudu/python
RUN pip install -r requirements.txt \
&& python setup.py sdist
# Copy any remaining source files.
COPY . /kudu
# Common label arguments.
ARG DOCKERFILE
ARG MAINTAINER
ARG URL
ARG VCS_TYPE
ARG VCS_URL
ARG VERSION
LABEL name="Apache Kudu Build" \
description="An image that has the Kudu source code pre-built." \
org.apache.kudu.build.type=$BUILD_TYPE \
org.apache.kudu.build.link=$LINK_TYPE \
org.apache.kudu.build.stripped=$STRIP \
# Common labels.
org.label-schema.dockerfile=$DOCKERFILE \
org.label-schema.maintainer=$MAINTAINER \
org.label-schema.url=$URL \
org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-type=$VCS_TYPE \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.version=$VERSION
#
# ---- Kudu ----
# Builds a runtime image with the Kudu binaries pre-installed.
#
FROM runtime AS kudu
ARG UID=1000
ARG GID=1000
ARG INSTALL_DIR="/opt/kudu"
ARG DATA_DIR="/var/lib/kudu"
# Copy the binaries.
WORKDIR $INSTALL_DIR/bin
COPY --from=build \
/kudu/build/latest/bin/kudu \
/kudu/build/latest/bin/kudu-master \
/kudu/build/latest/bin/kudu-tserver \
./
# Add to the binaries to the path.
ENV PATH=$INSTALL_DIR/bin/:$PATH
WORKDIR $INSTALL_DIR
# Copy the web files.
COPY --from=build /kudu/www ./www
COPY ./docker/kudu-entrypoint.sh /
# Setup the kudu user and create the neccessary directories.
RUN groupadd -g ${GID} kudu || groupmod -n kudu $(getent group ${GID} | cut -d: -f1) \
&& useradd --shell /bin/bash -u ${UID} -g ${GID} -m kudu \
&& chown -R kudu:kudu ${INSTALL_DIR} \
&& mkdir -p ${DATA_DIR} && chown -R kudu:kudu ${DATA_DIR}
USER kudu
# Add the entrypoint.
ENTRYPOINT ["/kudu-entrypoint.sh"]
CMD ["help"]
# Common label arguments.
ARG DOCKERFILE
ARG MAINTAINER
ARG URL
ARG VCS_REF
ARG VCS_TYPE
ARG VCS_URL
ARG VERSION
LABEL name="Apache Kudu" \
description="An image with the Kudu binaries and clients pre-installed." \
org.apache.kudu.build.type=$BUILD_TYPE \
# Common labels.
org.label-schema.dockerfile=$DOCKERFILE \
org.label-schema.maintainer=$MAINTAINER \
org.label-schema.url=$URL \
org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-type=$VCS_TYPE \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.version=$VERSION