Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Pinot base build/runtime image support for Amazon Corretto and MS OpenJDK #10422

Merged
merged 1 commit into from
Mar 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/build-pinot-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: docker/setup-qemu-action@v1
- uses: docker/setup-qemu-action@v2
name: Set up QEMU
- uses: docker/setup-buildx-action@v1
- uses: docker/setup-buildx-action@v2
name: Set up Docker Buildx
- uses: actions/checkout@v3
- name: Build and push the Docker image
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/build-presto-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: docker/setup-qemu-action@v1
- uses: docker/setup-qemu-action@v2
name: Set up QEMU
- uses: docker/setup-buildx-action@v1
- uses: docker/setup-buildx-action@v2
name: Set up Docker Buildx
- uses: actions/checkout@v3
- name: Build and push the Docker image
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/build-superset-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: docker/setup-qemu-action@v1
- uses: docker/setup-qemu-action@v2
name: Set up QEMU
- uses: docker/setup-buildx-action@v1
- uses: docker/setup-buildx-action@v2
name: Set up Docker Buildx
- uses: actions/checkout@v3
- name: Build and push the Docker image
Expand Down
34 changes: 12 additions & 22 deletions docker/images/pinot-base/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,42 +23,32 @@

This is the base docker image to build [Apache Pinot](https://github.com/apache/pinot).

## How to build a docker image
## Build and publish the docker image

Arguments:
Here is
the [Github Action task](https://github.com/apachepinot/pinot-fork/actions/workflows/build-pinot-docker-base-image.yml)
to build and publish pinot base docker images.

`JAVA_VERSION`: The Java Build and Runtime image version. Default is `11`
This task can be triggered manually to build the cross platform(amd64 and arm64v8) base image.

`OPENJDK_IMAGE`: Base image to use for Pinot build and runtime, e.g. `arm64v8/openjdk`. Default is `openjdk`.
The build shell is:

Usage:
For Amazon Corretto 11:

```SHELL
docker build -t apachepinot/pinot-base-build:openjdk11 --no-cache --network=host --build-arg JAVA_VERSION=11 -f pinot-base-build/Dockerfile .
docker buildx build --no-cache --platform=linux/arm64,linux/amd64 --file pinot-base-build/amazoncorretto.dockerfile --tag apachepinot/pinot-base-build:11-amazoncorretto --push .
```

```SHELL
docker build -t apachepinot/pinot-base-runtime:openjdk11 --no-cache --network=host --build-arg JAVA_VERSION=11 -f pinot-base-runtime/Dockerfile .
docker buildx build --no-cache --platform=linux/arm64,linux/amd64 --file pinot-base-runtime/amazoncorretto.dockerfile --tag apachepinot/pinot-base-runtime:11-amazoncorretto --push .
```

Note that if you are not on arm64 machine, you can still build the image by turning on the experimental feature of docker, and add `--platform linux/arm64` into the `docker build ...` script, e.g.

```SHELL
docker build -t apachepinot/pinot-base-build:openjdk11-arm64v8 --platform linux/arm64 --no-cache --network=host --build-arg JAVA_VERSION=11 --build-arg OPENJDK_IMAGE=arm64v8/openjdk -f pinot-base-build/Dockerfile .
```
For MS OpenJDK, the build shell is:

```SHELL
docker build -t apachepinot/pinot-base-runtime:openjdk11-arm64v8 --platform linux/arm64 --no-cache --network=host --build-arg JAVA_VERSION=11 --build-arg OPENJDK_IMAGE=arm64v8/openjdk -f pinot-base-runtime/Dockerfile .
docker buildx build --no-cache --platform=linux/arm64,linux/amd64 --file pinot-base-build/amazoncorretto.dockerfile --tag apachepinot/pinot-base-build:11-ms-openjdk --push .
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a typo? I would expect that for MS OpenJDK we should use ms-openjdk.dockerfile as base image.

```

## Publish the docker image

Here is the [Github Action task](https://github.com/apachepinot/pinot-fork/actions/workflows/build-pinot-docker-base-image.yml) to build and publish pinot base docker images.

This task can be triggered manually to build the cross platform(amd64 and arm64v8) base image.

The build shell is:

```SHELL
docker buildx build --no-cache --platform=linux/arm64,linux/amd64 --file Dockerfile --tag apachepinot/pinot-base-build:openjdk11 --push .
docker buildx build --no-cache --platform=linux/arm64,linux/amd64 --file pinot-base-runtime/amazoncorretto.dockerfile --tag apachepinot/pinot-base-runtime:11-ms-openjdk --push .
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#
# 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.
#
FROM debian:buster-slim

ARG version=11.0.18.10-1
# In addition to installing the Amazon corretto, we also install
# fontconfig. The folks who manage the docker hub's
# official image library have found that font management
# is a common usecase, and painpoint, and have
# recommended that Java images include font support.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why don't we install the same in ms or openjdk versions?

#
# See:
# https://github.com/docker-library/official-images/blob/master/test/tests/java-uimanager-font/container.java

LABEL [email protected]

RUN set -eux \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
curl ca-certificates gnupg software-properties-common fontconfig java-common vim wget git automake bison flex g++ libboost-all-dev libevent-dev libssl-dev libtool make pkg-config\
&& curl -fL https://apt.corretto.aws/corretto.key | apt-key add - \
&& add-apt-repository 'deb https://apt.corretto.aws stable main' \
&& mkdir -p /usr/share/man/man1 || true \
&& apt-get update \
&& apt-get install -y java-11-amazon-corretto-jdk=1:$version \
&& rm -rf /var/lib/apt/lists/*

ENV LANG C.UTF-8
ENV JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto

# install maven
RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
&& wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz -P /tmp \
&& tar -xzf /tmp/apache-maven-*.tar.gz -C /usr/share/maven --strip-components=1 \
&& rm -f /tmp/apache-maven-*.tar.gz \
&& ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG /opt/.m2

# install thrift
RUN wget http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz -O /tmp/thrift-0.12.0.tar.gz && \
tar xfz /tmp/thrift-0.12.0.tar.gz --directory /tmp && \
base_dir=`pwd` && \
cd /tmp/thrift-0.12.0 && \
./configure --with-cpp=no --with-c_glib=no --with-java=yes --with-python=no --with-ruby=no --with-erlang=no --with-go=no --with-nodejs=no --with-php=no && \
make install

CMD ["-help"]
48 changes: 48 additions & 0 deletions docker/images/pinot-base/pinot-base-build/ms-openjdk.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#
# 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.
#
ARG JAVA_VERSION=11
ARG JDK_IMAGE=mcr.microsoft.com/openjdk/jdk
FROM ${JDK_IMAGE}:${JAVA_VERSION}-ubuntu AS pinot_build_env
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ms-openjdk.dockerfile and openjdk.dockerfile are just the same except for these two lines:

ARG JDK_IMAGE=openjdk
FROM ${JDK_IMAGE}:${JAVA_VERSION} AS pinot_build_env
ARG JDK_IMAGE=mcr.microsoft.com/openjdk/jdk
FROM ${JDK_IMAGE}:${JAVA_VERSION}-ubuntu AS pinot_build_env

The differences with amazoncoretto.dockerfile are not that large if we also include fontconfig. Shouldn't be enough to have a single dockerfile base image (same with runtime) where FROM is build from docker args?


LABEL [email protected]

# extra dependency for running launcher
RUN apt-get update && \
apt-get install -y --no-install-recommends vim wget curl git automake bison flex g++ libboost-all-dev libevent-dev \
libssl-dev libtool make pkg-config && \
rm -rf /var/lib/apt/lists/*

# install maven
RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
&& wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz -P /tmp \
&& tar -xzf /tmp/apache-maven-*.tar.gz -C /usr/share/maven --strip-components=1 \
&& rm -f /tmp/apache-maven-*.tar.gz \
&& ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG /opt/.m2

# install thrift
RUN wget http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz -O /tmp/thrift-0.12.0.tar.gz && \
tar xfz /tmp/thrift-0.12.0.tar.gz --directory /tmp && \
base_dir=`pwd` && \
cd /tmp/thrift-0.12.0 && \
./configure --with-cpp=no --with-c_glib=no --with-java=yes --with-python=no --with-ruby=no --with-erlang=no --with-go=no --with-nodejs=no --with-php=no && \
make install

CMD ["-help"]
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
# under the License.
#
ARG JAVA_VERSION=11
ARG OPENJDK_IMAGE=openjdk
FROM ${OPENJDK_IMAGE}:${JAVA_VERSION} AS pinot_build_env
ARG JDK_IMAGE=openjdk
FROM ${JDK_IMAGE}:${JAVA_VERSION} AS pinot_build_env

LABEL [email protected]

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#
# 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.
#
ARG JAVA_VERSION=11
ARG JDK_IMAGE=amazoncorretto

FROM ${JDK_IMAGE}:${JAVA_VERSION}-al2-jdk
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the only image that doesn't derive from ubuntu. I don't mind to use alpine images (although I've never like the hype on alpine docker images, the base image should be cached in the node anyway), but having to choose between alpine or ubuntu depending on the vendor doesn't sound good.

I mean, I would prefer to have a dockerfile for ubuntu, a dockerfile for alpine and choose the meta-base (either corretto, ms or whatever) based on docker ARGs. Otherwise we will see a combinatorial explosion of different dockerfiles depending on the openjdk distribution and the linux distribution


LABEL [email protected]

RUN yum update -y && \
yum groupinstall 'Development Tools' -y && \
yum install -y procps vim less wget curl git python sysstat perf && \
yum clean all

RUN case `uname -m` in \
x86_64) arch=x64; ;; \
aarch64) arch=arm64; ;; \
*) echo "platform=$(uname -m) un-supported, exit ..."; exit 1; ;; \
esac \
&& mkdir -p /usr/local/lib/async-profiler \
&& curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v2.5.1/async-profiler-2.5.1-linux-${arch}.tar.gz | tar -xz --strip-components 1 -C /usr/local/lib/async-profiler \
&& ln -s /usr/local/lib/async-profiler/profiler.sh /usr/local/bin/async-profiler

CMD ["bash"]
40 changes: 40 additions & 0 deletions docker/images/pinot-base/pinot-base-runtime/ms-openjdk.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#
# 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.
#

ARG JAVA_VERSION=11
ARG JDK_IMAGE=mcr.microsoft.com/openjdk/jdk

FROM ${JDK_IMAGE}:${JAVA_VERSION}-ubuntu

LABEL [email protected]

RUN apt-get update && \
apt-get install -y --no-install-recommends vim less wget curl git python sysstat procps linux-tools-generic && \
rm -rf /var/lib/apt/lists/*

RUN case `uname -m` in \
x86_64) arch=x64; ;; \
aarch64) arch=arm64; ;; \
*) echo "platform=$(uname -m) un-supported, exit ..."; exit 1; ;; \
esac \
&& mkdir -p /usr/local/lib/async-profiler \
&& curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v2.5.1/async-profiler-2.5.1-linux-${arch}.tar.gz | tar -xz --strip-components 1 -C /usr/local/lib/async-profiler \
&& ln -s /usr/local/lib/async-profiler/profiler.sh /usr/local/bin/async-profiler

CMD ["bash"]
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
# under the License.
#
ARG JAVA_VERSION=11
ARG OPENJDK_IMAGE=openjdk
ARG JDK_IMAGE=openjdk

FROM ${OPENJDK_IMAGE}:${JAVA_VERSION}-jdk-slim
FROM ${JDK_IMAGE}:${JAVA_VERSION}-jdk-slim

LABEL [email protected]

Expand Down