Jira Data Center Docker for M1 processor with 2 nodes and debug mode

In my previous article I showed how to create your own docker image with Atlassian Jira Data Center for M1 processors. But it is not enough for development of apps. We need to start 2 nodes and each node should be available for connecting in debug mode. I intended to modify my Dockerfile but then I found this repo which says that it can create an image of Jira Data Center for M1 processors. I tried it but it did not work for me. I made a couple of changes.

First of all I changed the base image in Dockerfile to

ARG BASE_IMAGE=arm64v8/adoptopenjdk:11.0.11_9-jdk-hotspot

And the file started to look like this

ARG BASE_IMAGE=arm64v8/adoptopenjdk:11.0.11_9-jdk-hotspot
FROM $BASE_IMAGE

ENV RUN_USER                                        jira
ENV RUN_GROUP                                       jira
ENV RUN_UID                                         2001
ENV RUN_GID                                         2001

# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
ENV JIRA_HOME                                       /var/atlassian/application-data/jira
ENV JIRA_INSTALL_DIR                                /opt/atlassian/jira

WORKDIR $JIRA_HOME

EXPOSE 8080

CMD ["/entrypoint.py"]
ENTRYPOINT ["/tini", "--"]

RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y --no-install-recommends fontconfig python3 python3-jinja2 \
    && apt-get clean autoclean && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*

ARG TINI_VERSION=v0.19.0
RUN arch=$(dpkg --print-architecture); \
    case "$arch" in \
       arm64) export ARCH="-arm64" ;; \
       *) export ARCH="" ;; \
    esac; \
    url="https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini${ARCH}" ; \
    curl "$url" -Lo /tini ; \
    chmod +x /tini

ARG MYSQL_DRIVER_VERSION=5.1.49
RUN export JIRA_LIB=$JIRA_INSTALL_DIR/lib                      \
    && mkdir -p $JIRA_LIB                                      \
    && export MYSQL_FILE_BASE=mysql-connector-java-$MYSQL_DRIVER_VERSION \
    && export MYSQL_FILE_TAR=$MYSQL_FILE_BASE.tar.gz           \
    && export MYSQL_FILE_BIN=$MYSQL_FILE_BASE-bin.jar          \
    && export MYSQL_DOWNLOAD_URL=https://dev.mysql.com/get/Downloads/Connector-J/$MYSQL_FILE_TAR \
    && rm -f $JIRA_LIB/mysql-connector-java*.jar               \
    && curl $MYSQL_DOWNLOAD_URL -Lo $MYSQL_FILE_TAR            \
    && tar xzf $MYSQL_FILE_TAR --strip=1                       \
    && cp $MYSQL_FILE_BIN $JIRA_LIB/$MYSQL_FILE_BIN

ARG JIRA_VERSION

# The link may change from version to version, check
# https://www.atlassian.com/ru/software/jira/download-archives
ARG DOWNLOAD_URL=https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-${JIRA_VERSION}.tar.gz

RUN groupadd --gid ${RUN_GID} ${RUN_GROUP} \
    && useradd --uid ${RUN_UID} --gid ${RUN_GID} --home-dir ${JIRA_HOME} --shell /bin/bash ${RUN_USER} \
    && echo PATH=$PATH > /etc/environment \
    \
    && mkdir -p                                     ${JIRA_INSTALL_DIR} \
    && curl -L --silent                             ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "${JIRA_INSTALL_DIR}" \
    && chmod -R "u=rwX,g=rX,o=rX"                   ${JIRA_INSTALL_DIR}/ \
    && chown -R root.                               ${JIRA_INSTALL_DIR}/ \
    && chown -R ${RUN_USER}:${RUN_GROUP}            ${JIRA_INSTALL_DIR}/logs \
    && chown -R ${RUN_USER}:${RUN_GROUP}            ${JIRA_INSTALL_DIR}/temp \
    && chown -R ${RUN_USER}:${RUN_GROUP}            ${JIRA_INSTALL_DIR}/work \
    \
    && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
    && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
    && sed -i -e 's/-XX:ReservedCodeCacheSize=\([0-9]\+[kmg]\)/-XX:ReservedCodeCacheSize=${JVM_RESERVED_CODE_CACHE_SIZE:=\1}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
    \
    && touch /etc/container_id \
    && chown ${RUN_USER}:${RUN_GROUP}               /etc/container_id \
    && chown -R ${RUN_USER}:${RUN_GROUP}            ${JIRA_HOME}

# Must be declared after setting perms
VOLUME ["${JIRA_HOME}"]

COPY components/entrypoint/                  /
COPY components/support/                     /opt/atlassian/support
COPY components/config/                      /opt/atlassian/etc/

Then I modified a bit the build-image.sh file

#!/bin/zsh

set -x -o errexit -o pipefail

REPO="arm64/jira-software"
JIRA_VERSION="9.2.0"
MYSQL_DRIVER_VERSION="5.1.49"
# tini is a small helper library for Docker containers https://github.com/krallin/tini
# It makes sense to update.
TINI_VERSION="v0.19.0"

docker build \
  --no-cache \
  -t "$REPO:$JIRA_VERSION-arm64" \
  --build-arg JIRA_VERSION="$JIRA_VERSION" \
  --build-arg MYSQL_DRIVER_VERSION="$MYSQL_DRIVER_VERSION" \
  --build-arg TINI_VERSION="$TINI_VERSION" \
  .

And after it I ran ./build-image.sh

After the image had been created, I ran the following docker-compose.yml file

version: '3'

services:
  jira_node_1:
    depends_on:
      - postgresql
    image: arm64/jira-software:9.2.0-arm64
    networks:
      - jiranet
    volumes:
      - /Users/alexm/projects/prometheus/jira/shared:/var/atlassian/application-data/jira/shared
    ports:
      - '8080:8080'
      - '8000:8000'
    environment:
      - 'ATL_JDBC_URL=jdbc:postgresql://postgresql:5432/jiradb'
      - 'ATL_JDBC_USER=jira'
      - 'ATL_JDBC_PASSWORD=jellyfish'
      - 'ATL_DB_DRIVER=org.postgresql.Driver'
      - 'ATL_DB_TYPE=postgres72'
      - 'JVM_MINIMUM_MEMORY=2048m'
      - 'JVM_MAXIMUM_MEMORY=4096m'
      - 'JVM_SUPPORT_RECOMMENDED_ARGS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000"'
      - 'CLUSTERED=true'
      - 'JIRA_NODE_ID=node_1'
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

  jira_node_2:
    depends_on:
      - postgresql
    image: arm64/jira-software:9.2.0-arm64
    networks:
      - jiranet
    volumes:
      - /Users/alexm/projects/prometheus/shared:/var/atlassian/application-data/jira/shared
    ports:
      - '8081:8080'
      - '8001:8000'
    environment:
      - 'ATL_JDBC_URL=jdbc:postgresql://postgresql:5432/jiradb'
      - 'ATL_JDBC_USER=jira'
      - 'ATL_JDBC_PASSWORD=jellyfish'
      - 'ATL_DB_DRIVER=org.postgresql.Driver'
      - 'ATL_DB_TYPE=postgres72'
      - 'JVM_MINIMUM_MEMORY=2048m'
      - 'JVM_MAXIMUM_MEMORY=4096m'
      - 'JVM_SUPPORT_RECOMMENDED_ARGS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000"'
      - 'CLUSTERED=true'
      - 'JIRA_NODE_ID=node_2'
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

  postgresql:
    image: postgres:9.5-alpine
    networks:
      - jiranet
    volumes:
      - postgresqldata:/var/lib/postgresql/data
    ports:
      - '5432:5432'
    environment:
      - 'POSTGRES_USER=jira'
      # CHANGE THE PASSWORD!
      - 'POSTGRES_PASSWORD=jellyfish'
      - 'POSTGRES_DB=jiradb'
      - 'POSTGRES_ENCODING=UNICODE'
      - 'POSTGRES_COLLATE=C'
      - 'POSTGRES_COLLATE_TYPE=C'
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

volumes:
  postgresqldata:
    external: false

networks:
  jiranet:
    driver: bridge

And as a result I had 2 nodes of Jira Software in debug mode. You can read more about this docker-compose.yml file in my previous article.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: