From 7c2cb01aae5d14505489cd3aadee6e36d5e8139e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20Onofr=C3=A9?= Date: Sun, 22 Oct 2023 18:13:09 +0200 Subject: [PATCH] Add docker resources for ActiveMQ 5.x --- assembly/src/docker/Dockerfile | 40 +++++++ assembly/src/docker/README.md | 154 +++++++++++++++++++++++++ assembly/src/docker/build.sh | 133 +++++++++++++++++++++ assembly/src/docker/docker-compose.yml | 39 +++++++ 4 files changed, 366 insertions(+) create mode 100644 assembly/src/docker/Dockerfile create mode 100644 assembly/src/docker/README.md create mode 100644 assembly/src/docker/build.sh create mode 100644 assembly/src/docker/docker-compose.yml diff --git a/assembly/src/docker/Dockerfile b/assembly/src/docker/Dockerfile new file mode 100644 index 0000000000..683e5b5149 --- /dev/null +++ b/assembly/src/docker/Dockerfile @@ -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. +################################################################################ + +FROM eclipse-temurin:11-jre + +# ActiveMQ environment variables +ENV ACTIVEMQ_INSTALL_PATH /opt +ENV ACTIVEMQ_HOME $ACTIVEMQ_INSTALL_PATH/apache-activemq +ENV ACTIVEMQ_EXEC exec +ENV PATH $PATH:$ACTIVEMQ_HOME/bin +# Make the Web console accessible from outside the container +ENV ACTIVEMQ_OPTS $ACTIVEMQ_OPTS -Djetty.host=0.0.0.0 +#WORKDIR $ACTIVEMQ_HOME + +# activemq_dist can point to a directory or a tarball on the local system +ARG activemq_dist=NOT_SET + +# Install build dependencies and activemq +ADD $activemq_dist $ACTIVEMQ_INSTALL_PATH +RUN set -x && \ + cp -r $ACTIVEMQ_INSTALL_PATH/apache-activemq-* $ACTIVEMQ_HOME && \ + rm -r $ACTIVEMQ_INSTALL_PATH/apache-activemq-* + +EXPOSE 8161 61616 5672 61613 1883 61614 +CMD ["activemq", "console"] \ No newline at end of file diff --git a/assembly/src/docker/README.md b/assembly/src/docker/README.md new file mode 100644 index 0000000000..d76ddabc5e --- /dev/null +++ b/assembly/src/docker/README.md @@ -0,0 +1,154 @@ + +# Apache ActiveMQ docker + +## Installation + +Install the most recent stable version of docker +https://docs.docker.com/installation/ + +Install the most recent stable version of docker-compose +https://docs.docker.com/compose/install/ + +If you want to build multi-platform (OS/Arch) Docker images, then you must install +[`buildx`](https://docs.docker.com/buildx/working-with-buildx/). +On macOS, an easy way to install `buildx` is to install [Docker Desktop Edge](https://docs.docker.com/docker-for-mac/edge-release-notes/). + +## Build + +Images are based on the Docker official [Eclipse Temurin 11 JRE](https://hub.docker.com/_/eclipse-temurin/tags?page=1&name=11-jre) image. If you want to +build the ActiveMQ image you have the following choices: + +1. Create the docker image from a local distribution package +2. Create the docker image from an Apache ActiveMQ archive, for example (apache-activemq-5.18.1.tar.gz) +3. Create the docker image from a specific version of Apache ActiveMQ +4. Create the docker image from remote or local custom Apache ActiveMQ distribution + +If you run `build.sh` without arguments then you could see how to usage this command. + +```bash +Usage: + build.sh --from-local-dist [--archive ] [--image-name ] [--build-multi-platform ] + build.sh --from-release --activemq-version [--image-name ] [--build-multi-platform ] + build.sh --help + + If the --image-name flag is not used the built image name will be 'activemq'. + Check the supported build platforms; you can verify with this command: docker buildx ls + The supported platforms (OS/Arch) depend on the build's base image, in this case [eclipse-temurin:11-jre](https://hub.docker.com/_/eclipse-temurin). +``` + +To create the docker image from local distribution) you can execute the command +below. Remember that before you can successfully run this command, you must build +the project (for example with the command `mvn clean install -DskipTests`). + +```bash +./build.sh --from-local-dist +``` + +For create the docker image from the local dist version but with the archive, +you can execute the below command. Remember that before you can successfully run +this command. + +```bash +./build.sh --from-local-dist --archive ~/path/to/apache-activemq-5.18.1.tar.gz +``` + +You can also specify the image name with the `--image-name` flag, for example +(replacing the version, image name, and targets as appropriate): + +```bash +./build.sh --from-local-dist --archive ~/Downloads/apache-activemq-5.18.1.tar.gz --image-name myrepo/myamq:x.x.x +``` + +If you want to build the docker image for a specific version of ActiveMQ +you can run `build.sh` command in this way (replacing the version, image name, +and targets as appropriate): + +```bash +./build.sh --from-release --activemq-version 5.18.1 --image-name myrepo/myamq:x.x.x +``` + +If you want to build the container for a specific version of ActiveMQ and +specific version of the platform, and push the image to the Docker Hub repository, +you can use this command (replacing the version, image name, and targets as appropriate): + +```bash +./build.sh --from-release --activemq-version 5.18.1 --image-name myrepo/myamq:x.x.x \ + --build-multi-platform linux/arm64,linux/arm/v7,linux/amd64 +``` + +Below is the output you should get from running the previous command. + +``` +Downloading apache-activemq-5.18.1.tar.gz from https://downloads.apache.org/activemq/5.18.1/ +Checking if buildx installed... +Found buildx {github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7} on your docker system +Starting build of the docker image for the platform linux/arm64,linux/arm/v7,linux/amd64 +[+] Building 15.8s (16/16) FINISHED +... +``` + +## Run + +* Run ActiveMQ + +``` +docker-compose run activemq activemq +``` + +or + +``` +docker run --name activemq activemq activemq +``` + +* Run ActiveMQ as a daemon + +``` +docker-compose up +``` + +or + +``` +docker run --name activemq +``` + +* Kill ActiveMQ + +``` +docker-compose kill +``` + +or + +``` +docker kill activemq +``` + +### Ports + +* ActiveMQ web console on `8161` +* ActiveMQ tcp connector on `61616` +* ActiveMQ AMQP connector on `5672` +* ActiveMQ STOMP connector on `61613` +* ActiveMQ MQTT connector on `1883` +* ActiveMQ WS connector on `61614` + +Edit the `docker-compose.yml` file to edit port settings. \ No newline at end of file diff --git a/assembly/src/docker/build.sh b/assembly/src/docker/build.sh new file mode 100644 index 0000000000..3f30a7bbe0 --- /dev/null +++ b/assembly/src/docker/build.sh @@ -0,0 +1,133 @@ +#!/bin/sh + +################################################################################ +# 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. +################################################################################ + +usage() { + cat <] [--image-name ] [--build-multi-platform ] + build.sh --from-release --activemq-version [--image-name ] [--build-multi-platform ] + build.sh --help + + If the --image-name flag is not used the built image name will be 'activemq'. + Check the supported build platforms; you can verify with this command: docker buildx ls + The supported platforms (OS/Arch) depend on the build's base image, in this case [eclipse-temurin:11-jre](https://hub.docker.com/_/eclipse-temurin). + +HERE + exit 1 +} + +while [ $# -ge 1 ] +do +key="$1" + case $key in + --from-local-dist) + FROM_LOCAL="true" + ;; + --from-release) + FROM_RELEASE="true" + ;; + --image-name) + IMAGE_NAME="$2" + shift + ;; + --archive) + ARCHIVE="$2" + shift + ;; + --activemq-version) + ACTIVEMQ_VERSION="$2" + shift + ;; + --build-multi-platform) + BUILD_MULTI_PLATFORM="$2" + shift + ;; + --help) + usage + ;; + *) + # unknown option + ;; + esac + shift +done + +IMAGE_NAME=${IMAGE_NAME:-activemq} + +# TMPDIR must be contained within the working directory so it is part of the +# Docker context. (i.e. it can't be mktemp'd in /tmp) +TMPDIR=_TMP_ + +cleanup() { + rm -rf "${TMPDIR}" +} +trap cleanup EXIT + +mkdir -p "${TMPDIR}" + +if [ -n "${FROM_RELEASE}" ]; then + + [ -n "${ACTIVEMQ_VERSION}" ] || usage + + ACTIVEMQ_BASE_URL="https://dlcdn.apache.org/activemq/${ACTIVEMQ_VERSION}/" + ACTIVEMQ_DIST_FILE_NAME="apache-activemq-${ACTIVEMQ_VERSION}-bin.tar.gz" + CURL_OUTPUT="${TMPDIR}/${ACTIVEMQ_DIST_FILE_NAME}" + + echo "Downloading ${ACTIVEMQ_DIST_FILE_NAME} from ${ACTIVEMQ_BASE_URL}" + curl -s "${ACTIVEMQ_BASE_URL}${ACTIVEMQ_DIST_FILE_NAME}" --output "${CURL_OUTPUT}" + + ACTIVEMQ_DIST="${CURL_OUTPUT}" + +elif [ -n "${FROM_LOCAL}" ]; then + + if [ -n "${ARCHIVE}" ]; then + DIST_DIR=${ARCHIVE} + else + DIST_DIR="target/apache-activemq-*.tar.gz" + fi + ACTIVEMQ_DIST=${TMPDIR}/apache-activemq.tar.gz + echo "Using ActiveMQ dist: ${DIST_DIR}" + cp ${DIST_DIR} ${ACTIVEMQ_DIST} + +else + + usage + +fi + +if [ -n "${BUILD_MULTI_PLATFORM}" ]; then + echo "Checking if buildx installed..." + VERSION_BUILD_X=$(docker buildx version) > /dev/null 2>&1 + + if [ $? -eq 0 ]; then + echo "Found buildx {${VERSION_BUILD_X}} on your docker system" + echo "Starting build of the docker image for the platform ${BUILD_MULTI_PLATFORM}" + + BUILD_X="buildx" + BUILD_X_FLAG="--push" + BUILD_X_PLATFORM="--platform ${BUILD_MULTI_PLATFORM}" + else + echo "Error: buildx not installed with your docker system" + exit 2 + fi + +fi + +docker ${BUILD_X} build ${BUILD_X_PLATFORM} --build-arg activemq_dist="${ACTIVEMQ_DIST}" ${BUILD_X_FLAG} -t "${IMAGE_NAME}" . \ No newline at end of file diff --git a/assembly/src/docker/docker-compose.yml b/assembly/src/docker/docker-compose.yml new file mode 100644 index 0000000000..07072b168d --- /dev/null +++ b/assembly/src/docker/docker-compose.yml @@ -0,0 +1,39 @@ +################################################################################ +# 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. +################################################################################ + +version: "2.1" +services: + activemq: + image: ${ACTIVEMQ_DOCKER_IMAGE_NAME:-activemq} + expose: + - "61616" + - "5672" + - "61613" + - "1883" + - "61614" + - "8161" + ports: + - "8161:8161" + - "61616:61616" + - "5672:5672" + - "61613:61613" + - "1883:1883" + - "61614:61614" + command: activemq console + stdin_open: true + tty: true \ No newline at end of file