| # 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. |
| |
| set(IMPALA_BASE_BUILD_CONTEXT_DIR |
| ${CMAKE_SOURCE_DIR}/docker/build_context |
| ) |
| |
| find_program(LSB_RELEASE_EXEC lsb_release) |
| execute_process(COMMAND ${LSB_RELEASE_EXEC} -is |
| OUTPUT_VARIABLE LSB_RELEASE_ID |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| execute_process(COMMAND ${LSB_RELEASE_EXEC} -rs |
| OUTPUT_VARIABLE LSB_RELEASE_VERSION |
| OUTPUT_STRIP_TRAILING_WHITESPACE |
| ) |
| |
| if(${LSB_RELEASE_ID} STREQUAL "Ubuntu" AND ${LSB_RELEASE_VERSION} STREQUAL "16.04") |
| set(DISTRO_BASE_IMAGE "ubuntu:16.04") |
| elseif(${LSB_RELEASE_ID} STREQUAL "Ubuntu" AND ${LSB_RELEASE_VERSION} STREQUAL "18.04") |
| set(DISTRO_BASE_IMAGE "ubuntu:18.04") |
| else() |
| set(DISTRO_BASE_IMAGE "UNSUPPORTED") |
| endif() |
| MESSAGE(STATUS "Picked docker base image based on host OS: ${DISTRO_BASE_IMAGE}") |
| |
| if (NOT ${DISTRO_BASE_IMAGE} STREQUAL "UNSUPPORTED") |
| # Add a target to build a base docker image for 'build_type'. 'build_context_args' are |
| # passed to the setup_build_context.py script. |
| function(add_base_image build_type build_context_args) |
| # Build context depends on daemons and frontend jars |
| # Sending the whole impala workspace including test binaries, testdata, etc |
| # to the docker daemon can be very expensive, so we create a build context |
| # with symlinks |
| add_custom_target(impala_base_build_context_${build_type} |
| COMMAND ${CMAKE_SOURCE_DIR}/docker/setup_build_context.py ${build_context_args} |
| DEPENDS daemons fe ${CMAKE_SOURCE_DIR}/docker/setup_build_context.py |
| COMMENT "Creating impala base build context build_type=${build_type}." |
| VERBATIM |
| ) |
| # Target for the base Impala image. |
| add_custom_target(impala_base_image_${build_type} |
| # Use tar with -h flag to assemble a tarball including all the symlinked files and |
| # directories in the build context. |
| COMMAND cd ${IMPALA_BASE_BUILD_CONTEXT_DIR}/${build_type} && tar cvh . | docker build -t impala_base_${build_type} --build-arg BASE_IMAGE=${DISTRO_BASE_IMAGE} - |
| DEPENDS impala_base_build_context_${build_type} ${CMAKE_SOURCE_DIR}/docker/impala_base/Dockerfile |
| DEPENDS ${CMAKE_SOURCE_DIR}/docker/daemon_entrypoint.sh |
| DEPENDS ${CMAKE_SOURCE_DIR}/bin/graceful_shutdown_backends.sh |
| COMMENT "Building Impala base docker image build_type=${build_type}." |
| VERBATIM |
| ) |
| endfunction() |
| add_base_image(release "") |
| add_base_image(debug "--debug-build") |
| |
| # Target to build all docker images. Dependencies are added for each docker image |
| # instantiated below. |
| add_custom_target(docker_images) |
| add_custom_target(docker_debug_images) |
| |
| set(daemon_image_names "") |
| |
| # Add a target with name 'target' to build a daemon image for the daemon with |
| # name 'daemon_name', e.g. "impalad_executor". The image is tagged as 'image_name'. |
| # 'build_type' should be debug or release and determines which base image is used. |
| function(add_daemon_docker_image target daemon_name image_name build_type) |
| set(build_dir ${CMAKE_SOURCE_DIR}/docker/${daemon_name}) |
| add_custom_target(${target} |
| # Supply the appropriate base image as an argument for the Dockerfile. |
| COMMAND cd ${build_dir} && docker build --build-arg BASE_IMAGE=impala_base_${build_type} -t ${image_name} . |
| DEPENDS impala_base_image_${build_type} ${build_dir}/Dockerfile |
| COMMENT "Building ${image_name} docker image." |
| VERBATIM |
| ) |
| set(daemon_image_names "${daemon_image_names} ${image_name}" PARENT_SCOPE) |
| endfunction() |
| |
| # Add debug and release docker image targets for the given daemon e.g. if called |
| # with "statestored", targets "statestored_image" and "statestored_debug_image" |
| # are added. |
| function(add_daemon_docker_images daemon_name) |
| set(release_image ${daemon_name}) |
| set(release_target ${daemon_name}_image) |
| set(debug_image ${daemon_name}_debug) |
| set(debug_target ${daemon_name}_debug_image) |
| add_daemon_docker_image(${release_target} ${daemon_name} ${release_image} release) |
| add_daemon_docker_image(${debug_target} ${daemon_name} ${debug_image} debug) |
| ADD_DEPENDENCIES(docker_images ${release_target}) |
| ADD_DEPENDENCIES(docker_debug_images ${debug_target}) |
| set(daemon_image_names "${daemon_image_names} ${release_image}" PARENT_SCOPE) |
| endfunction() |
| |
| # Stamp out image targets for all of the Impala daemons. |
| add_daemon_docker_images(impalad_coord_exec) |
| add_daemon_docker_images(impalad_coordinator) |
| add_daemon_docker_images(impalad_executor) |
| add_daemon_docker_images(catalogd) |
| add_daemon_docker_images(statestored) |
| |
| # Generate a text file with all of the release daemon images. |
| file(WRITE ${CMAKE_SOURCE_DIR}/docker/docker-images.txt "${daemon_image_names}") |
| endif() |
| |