[Dockerfile] Upgrade debian base image to version 10

Debian8 is too old to build LLVM project, the version
of GCC, CMake and python are lower than the requirements:
https://llvm.org/docs/GettingStarted.html#software

Debian10 is the earliest release that has software
packages that meet the above requirements.

Reviewed By: sammccall

Differential Revision: https://reviews.llvm.org/D120826
This commit is contained in:
Xiaodong Liu 2022-03-23 15:25:21 +00:00 committed by Ben Shi
parent 0fcff69bcb
commit 9580f95488
3 changed files with 23 additions and 36 deletions

View File

@ -9,7 +9,7 @@ You can find a number of sources to build docker images with LLVM components in
images for their own use, or as a starting point for someone who wants to write images for their own use, or as a starting point for someone who wants to write
their own Dockerfiles. their own Dockerfiles.
We currently provide Dockerfiles with ``debian8`` and ``nvidia-cuda`` base images. We currently provide Dockerfiles with ``debian10`` and ``nvidia-cuda`` base images.
We also provide an ``example`` image, which contains placeholders that one would need We also provide an ``example`` image, which contains placeholders that one would need
to fill out in order to produce Dockerfiles for a new docker image. to fill out in order to produce Dockerfiles for a new docker image.
@ -72,13 +72,13 @@ checkout from git and provide a list of CMake arguments to use during when
building LLVM inside docker container. building LLVM inside docker container.
Here's a very simple example of getting a docker image with clang binary, Here's a very simple example of getting a docker image with clang binary,
compiled by the system compiler in the debian8 image: compiled by the system compiler in the debian10 image:
.. code-block:: bash .. code-block:: bash
./llvm/utils/docker/build_docker_image.sh \ ./llvm/utils/docker/build_docker_image.sh \
--source debian8 \ --source debian10 \
--docker-repository clang-debian8 --docker-tag "staging" \ --docker-repository clang-debian10 --docker-tag "staging" \
-p clang -i install-clang -i install-clang-resource-headers \ -p clang -i install-clang -i install-clang-resource-headers \
-- \ -- \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_BUILD_TYPE=Release
@ -93,22 +93,22 @@ this command will do that:
# LLVM_TARGETS_TO_BUILD=Native is to reduce stage1 compile time. # LLVM_TARGETS_TO_BUILD=Native is to reduce stage1 compile time.
# Options, starting with BOOTSTRAP_* are passed to stage2 cmake invocation. # Options, starting with BOOTSTRAP_* are passed to stage2 cmake invocation.
./build_docker_image.sh \ ./build_docker_image.sh \
--source debian8 \ --source debian10 \
--docker-repository clang-debian8 --docker-tag "staging" \ --docker-repository clang-debian10 --docker-tag "staging" \
-p clang -i stage2-install-clang -i stage2-install-clang-resource-headers \ -p clang -i stage2-install-clang -i stage2-install-clang-resource-headers \
-- \ -- \
-DLLVM_TARGETS_TO_BUILD=Native -DCMAKE_BUILD_TYPE=Release \ -DLLVM_TARGETS_TO_BUILD=Native -DCMAKE_BUILD_TYPE=Release \
-DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \ -DBOOTSTRAP_CMAKE_BUILD_TYPE=Release \
-DCLANG_ENABLE_BOOTSTRAP=ON -DCLANG_BOOTSTRAP_TARGETS="install-clang;install-clang-resource-headers" -DCLANG_ENABLE_BOOTSTRAP=ON -DCLANG_BOOTSTRAP_TARGETS="install-clang;install-clang-resource-headers"
This will produce a new image ``clang-debian8:staging`` from the latest This will produce a new image ``clang-debian10:staging`` from the latest
upstream revision. upstream revision.
After the image is built you can run bash inside a container based on your image After the image is built you can run bash inside a container based on your image
like this: like this:
.. code-block:: bash .. code-block:: bash
docker run -ti clang-debian8:staging bash docker run -ti clang-debian10:staging bash
Now you can run bash commands as you normally would: Now you can run bash commands as you normally would:
@ -130,14 +130,14 @@ Now you can run bash commands as you normally would:
Which image should I choose? Which image should I choose?
============================ ============================
We currently provide two images: debian8-based and nvidia-cuda-based. They We currently provide two images: Debian10-based and nvidia-cuda-based. They
differ in the base image that they use, i.e. they have a different set of differ in the base image that they use, i.e. they have a different set of
preinstalled binaries. Debian8 is very minimal, nvidia-cuda is larger, but has preinstalled binaries. Debian8 is very minimal, nvidia-cuda is larger, but has
preinstalled CUDA libraries and allows to access a GPU, installed on your preinstalled CUDA libraries and allows to access a GPU, installed on your
machine. machine.
If you need a minimal linux distribution with only clang and libstdc++ included, If you need a minimal linux distribution with only clang and libstdc++ included,
you should try debian8-based image. you should try Debian10-based image.
If you want to use CUDA libraries and have access to a GPU on your machine, If you want to use CUDA libraries and have access to a GPU on your machine,
you should choose nvidia-cuda-based image and use `nvidia-docker you should choose nvidia-cuda-based image and use `nvidia-docker
@ -150,7 +150,7 @@ If you have a different use-case, you could create your own image based on
``example/`` folder. ``example/`` folder.
Any docker image can be built and run using only the docker binary, i.e. you can Any docker image can be built and run using only the docker binary, i.e. you can
run debian8 build on Fedora or any other Linux distribution. You don't need to run debian10 build on Fedora or any other Linux distribution. You don't need to
install CMake, compilers or any other clang dependencies. It is all handled install CMake, compilers or any other clang dependencies. It is all handled
during the build process inside Docker's isolated environment. during the build process inside Docker's isolated environment.
@ -158,12 +158,12 @@ Stable build
============ ============
If you want a somewhat recent and somewhat stable build, use the If you want a somewhat recent and somewhat stable build, use the
``branches/google/stable`` branch, i.e. the following command will produce a ``branches/google/stable`` branch, i.e. the following command will produce a
debian8-based image using the latest ``google/stable`` sources for you: Debian10-based image using the latest ``google/stable`` sources for you:
.. code-block:: bash .. code-block:: bash
./llvm/utils/docker/build_docker_image.sh \ ./llvm/utils/docker/build_docker_image.sh \
-s debian8 --d clang-debian8 -t "staging" \ -s debian10 --d clang-debian10 -t "staging" \
--branch branches/google/stable \ --branch branches/google/stable \
-p clang -i install-clang -i install-clang-resource-headers \ -p clang -i install-clang -i install-clang-resource-headers \
-- \ -- \

View File

@ -23,7 +23,7 @@ Available options:
General: General:
-h|--help show this help message -h|--help show this help message
Docker-specific: Docker-specific:
-s|--source image source dir (i.e. debian8, nvidia-cuda, etc) -s|--source image source dir (i.e. debian10, nvidia-cuda, etc)
-d|--docker-repository docker repository for the image -d|--docker-repository docker repository for the image
-t|--docker-tag docker tag for the image -t|--docker-tag docker tag for the image
Checkout arguments: Checkout arguments:
@ -54,18 +54,18 @@ Required options: --source and --docker-repository, at least one
All options after '--' are passed to CMake invocation. All options after '--' are passed to CMake invocation.
For example, running: For example, running:
$ build_docker_image.sh -s debian8 -d mydocker/debian8-clang -t latest \ $ build_docker_image.sh -s debian10 -d mydocker/debian10-clang -t latest \
-p clang -i install-clang -i install-clang-resource-headers -p clang -i install-clang -i install-clang-resource-headers
will produce two docker images: will produce two docker images:
mydocker/debian8-clang-build:latest - an intermediate image used to compile mydocker/debian10-clang-build:latest - an intermediate image used to compile
clang. clang.
mydocker/clang-debian8:latest - a small image with preinstalled clang. mydocker/clang-debian10:latest - a small image with preinstalled clang.
Please note that this example produces a not very useful installation, since it Please note that this example produces a not very useful installation, since it
doesn't override CMake defaults, which produces a Debug and non-boostrapped doesn't override CMake defaults, which produces a Debug and non-boostrapped
version of clang. version of clang.
To get a 2-stage clang build, you could use this command: To get a 2-stage clang build, you could use this command:
$ ./build_docker_image.sh -s debian8 -d mydocker/clang-debian8 -t "latest" \ $ ./build_docker_image.sh -s debian10 -d mydocker/clang-debian10 -t "latest" \
-p clang -i stage2-install-clang -i stage2-install-clang-resource-headers \ -p clang -i stage2-install-clang -i stage2-install-clang-resource-headers \
-- \ -- \
-DLLVM_TARGETS_TO_BUILD=Native -DCMAKE_BUILD_TYPE=Release \ -DLLVM_TARGETS_TO_BUILD=Native -DCMAKE_BUILD_TYPE=Release \

View File

@ -1,4 +1,4 @@
#===- llvm/utils/docker/debian8/build/Dockerfile -------------------------===// #===- llvm/utils/docker/debian10/build/Dockerfile -------------------------===//
# #
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information. # See https://llvm.org/LICENSE.txt for license information.
@ -6,7 +6,7 @@
# #
#===----------------------------------------------------------------------===// #===----------------------------------------------------------------------===//
# Stage 1. Check out LLVM source code and run the build. # Stage 1. Check out LLVM source code and run the build.
FROM launcher.gcr.io/google/debian8:latest as builder FROM launcher.gcr.io/google/debian10:latest as builder
LABEL maintainer "LLVM Developers" LABEL maintainer "LLVM Developers"
# Install build dependencies of llvm. # Install build dependencies of llvm.
# First, Update the apt's source list and include the sources of the packages. # First, Update the apt's source list and include the sources of the packages.
@ -15,7 +15,7 @@ RUN grep deb /etc/apt/sources.list | \
# Install compiler, python and subversion. # Install compiler, python and subversion.
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y --no-install-recommends ca-certificates gnupg \ apt-get install -y --no-install-recommends ca-certificates gnupg \
build-essential python wget subversion unzip && \ build-essential cmake make python3 zlib1g wget subversion unzip && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# Install a newer ninja release. It seems the older version in the debian repos # Install a newer ninja release. It seems the older version in the debian repos
# randomly crashes when compiling llvm. # randomly crashes when compiling llvm.
@ -24,19 +24,6 @@ RUN wget "https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-li
| sha256sum -c && \ | sha256sum -c && \
unzip ninja-linux.zip -d /usr/local/bin && \ unzip ninja-linux.zip -d /usr/local/bin && \
rm ninja-linux.zip rm ninja-linux.zip
# Import public key required for verifying signature of cmake download.
RUN gpg --keyserver hkp://pgp.mit.edu --recv 0x2D2CEF1034921684
# Download, verify and install cmake version that can compile clang into /usr/local.
# (Version in debian8 repos is is too old)
RUN mkdir /tmp/cmake-install && cd /tmp/cmake-install && \
wget "https://cmake.org/files/v3.7/cmake-3.7.2-SHA-256.txt.asc" && \
wget "https://cmake.org/files/v3.7/cmake-3.7.2-SHA-256.txt" && \
gpg --verify cmake-3.7.2-SHA-256.txt.asc cmake-3.7.2-SHA-256.txt && \
wget "https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz" && \
( grep "cmake-3.7.2-Linux-x86_64.tar.gz" cmake-3.7.2-SHA-256.txt | \
sha256sum -c - ) && \
tar xzf cmake-3.7.2-Linux-x86_64.tar.gz -C /usr/local --strip-components=1 && \
cd / && rm -rf /tmp/cmake-install
ADD checksums /tmp/checksums ADD checksums /tmp/checksums
ADD scripts /tmp/scripts ADD scripts /tmp/scripts
@ -50,11 +37,11 @@ RUN /tmp/scripts/build_install_llvm.sh --to /tmp/clang-install ${buildscript_arg
# Stage 2. Produce a minimal release image with build results. # Stage 2. Produce a minimal release image with build results.
FROM launcher.gcr.io/google/debian8:latest FROM launcher.gcr.io/google/debian10:latest
LABEL maintainer "LLVM Developers" LABEL maintainer "LLVM Developers"
# Install packages for minimal useful image. # Install packages for minimal useful image.
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y --no-install-recommends libstdc++-4.9-dev binutils && \ apt-get install -y --no-install-recommends libstdc++-7-dev binutils && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# Copy build results of stage 1 to /usr/local. # Copy build results of stage 1 to /usr/local.
COPY --from=builder /tmp/clang-install/ /usr/local/ COPY --from=builder /tmp/clang-install/ /usr/local/