diff --git a/_common/docker.inc.sh b/_common/docker.inc.sh index c098650..b419b60 100644 --- a/_common/docker.inc.sh +++ b/_common/docker.inc.sh @@ -2,19 +2,21 @@ # # Keyman is copyright (C) SIL Global. MIT License. # -# Common docker functions for (generally PHP-based) containers +# Common container functions for (generally PHP-based) containers +# +# Support for Docker and Podman. # source _common/tests.inc.sh function get_docker_image_id() { local IMAGE_NAME=$1 - echo "$(docker images -q $IMAGE_NAME)" + echo "$($CONTAINER_ENGINE images -q $IMAGE_NAME)" } function get_docker_container_id() { local CONTAINER_NAME=$1 - echo "$(docker ps -a -q --filter ancestor=$CONTAINER_NAME)" + echo "$($CONTAINER_ENGINE ps -a -q --filter ancestor=$CONTAINER_NAME)" } function stop_docker_container() { @@ -23,7 +25,7 @@ function stop_docker_container() { local CONTAINER_ID=$(get_docker_container_id $CONTAINER_NAME) if [ ! -z "$CONTAINER_ID" ]; then - docker container stop $CONTAINER_ID + $CONTAINER_ENGINE container stop $CONTAINER_ID else builder_echo "No Docker container to stop" fi @@ -38,14 +40,14 @@ function clean_docker_container() { local CONTAINER_ID=$(get_docker_container_id $CONTAINER_NAME) if [ ! -z "$CONTAINER_ID" ]; then - docker container rm $CONTAINER_ID + $CONTAINER_ENGINE container rm $CONTAINER_ID else echo "No Docker container to clean" fi local IMAGE_ID=$(get_docker_image_id $IMAGE_NAME) if [ ! -z "$IMAGE_ID" ]; then - docker rmi $IMAGE_NAME + $CONTAINER_ENGINE rmi $IMAGE_NAME else echo "No Docker image to clean" fi @@ -61,21 +63,25 @@ function build_docker_container() { local IMAGE_NAME=$1 local CONTAINER_NAME=$2 local BUILDER_CONFIGURATION="release" + local FILE= local TARGET=. if [[ $# -ge 3 ]]; then BUILDER_CONFIGURATION=$3 fi if [[ $# -ge 4 ]]; then - TARGET="-f $4 ." + FILE="-f $4 " + elif [[ "${CONTAINER_ENGINE}" == "docker" ]]; then + FILE="-f Dockerfile " + elif [[ "${CONTAINER_ENGINE}" == "podman" ]]; then + FILE="-f Podmanfile " fi _verify_vendor_is_not_folder builder_echo "Building using $BUILDER_CONFIGURATION configuration" - # Download docker image. --mount option requires BuildKit - DOCKER_BUILDKIT=1 docker build -t $IMAGE_NAME --build-arg BUILDER_CONFIGURATION="${BUILDER_CONFIGURATION}" $TARGET + DOCKER_BUILDKIT=1 $CONTAINER_ENGINE build -t $IMAGE_NAME --build-arg BUILDER_CONFIGURATION="${BUILDER_CONFIGURATION}" $FILE $TARGET } function start_docker_container() { @@ -129,7 +135,7 @@ function start_docker_container() { ADD_HOST="--add-host host.docker.internal:host-gateway" fi - docker run --rm -d -p $PORT:80 -v "${DOCKER_BINDING}" \ + $CONTAINER_ENGINE run --rm -d -p $PORT:80 -v "${DOCKER_BINDING}" \ -e S_KEYMAN_COM=localhost:$PORT_S_KEYMAN_COM \ -e API_KEYMAN_COM=localhost:$PORT_API_KEYMAN_COM \ --name $CONTAINER_DESC \ @@ -144,7 +150,7 @@ function start_docker_container() { builder_die "Docker container appears to have failed to start in order to create link to vendor/" fi - docker exec -i $CONTAINER_ID sh -c "ln -s /var/www/vendor vendor && chown -R www-data:www-data vendor" + $CONTAINER_ENGINE exec -i $CONTAINER_ID sh -c "ln -s /var/www/vendor vendor && chown -R www-data:www-data vendor" fi # after starting container, we want to run an init script if it is present @@ -156,7 +162,7 @@ function start_docker_container() { cmd="./resources/init-container.sh ${BUILDER_CONFIGURATION}" builder_echo green "cmd is ${cmd}" - docker exec -i $CONTAINER_ID sh -c "${cmd}" + $CONTAINER_ENGINE exec -i $CONTAINER_ID sh -c "${cmd}" fi builder_echo green "Listening on http://$HOST:$PORT" @@ -210,3 +216,32 @@ function test_docker_container() { rm tier.txt return "$LINK_RESULT" } + + +# Returns 0 if the specified container engine is available, 1 otherwise +_is_container_engine() { + local engine="$1" + if command -v "$engine" >/dev/null 2>&1; then + return 0 + else + return 1 + fi +} + +_get_container_engine() { + export CONTAINER_ENGINE + if _is_container_engine "docker"; then + CONTAINER_ENGINE="docker" + elif _is_container_engine "podman"; then + CONTAINER_ENGINE="podman" + else + builder_die "No supported container engine found. Please install Docker or Podman to run containerized builds." + fi +} + +################################################################################ +# Final initialization +################################################################################ + +_get_container_engine +builder_echo "Using container engine: $CONTAINER_ENGINE"