[AMQ-8149] Add tooling to create activemq docker image (including multi-platform support)

This commit is contained in:
JB Onofré 2023-06-21 11:47:55 +02:00
parent 52d70325ca
commit 85276d3476
4 changed files with 364 additions and 0 deletions

View File

@ -0,0 +1,38 @@
################################################################################
# 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
#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"]

View File

@ -0,0 +1,154 @@
<!--
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.
-->
# 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 <archive>] [--image-name <image>] [--build-multi-platform <comma-separated platforms>]
build.sh --from-release --activemq-version <x.x.x> [--image-name <image>] [--build-multi-platform <comma-separated platforms>]
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.

133
assembly/src/docker/build.sh Executable file
View File

@ -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 <<HERE
Usage:
build.sh --from-local-dist [--archive <archive>] [--image-name <image>] [--build-multi-platform <comma-separated platforms>]
build.sh --from-release --activemq-version <x.x.x> [--image-name <image>] [--build-multi-platform <comma-separated platforms>]
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}" .

View File

@ -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:-qctivemq}
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