Rundeckの公式DockerイメージをARM64対応させる

2022/12/29に公開

普段利用しているアプリや開発ツール類が一通りARM64対応された為、Intel MacからM1 Macに乗り換えました。

開発環境のスペックが上がると気分も上がりますね。

しばらく経って、、、

RundeckをDockerで構築することになったのですが、公式が配布しているDockerイメージはAMD64しか対応していませんでした。

rundeck docker image

一応、Docker Desktop for MacでもAMD64のDockerイメージを起動することが出来るんですが、
起動速度が遅かった為、ARM64対応したDockerイメージを自作することにしました。

https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/apple-silicon/

RundeckをARM64対応するのに必要だったこと

RundeckのDockerfileを見てみると、Ubuntu内にJavaとツール類をインストールしていました。

Ubuntu、tini、remcoをARM64対応してubuntu-baseを作り直せば、後はRundeckのコード類をコピーするだけで起動しそうです。

  • ubuntu-baseのDockerfile
    • ubuntu:20.04ARM64対応されてるので、切り替える必要有り
    • tini
      • AMD64ARM64対応されているので、ARM64に切り替える必要有り
    • remco
      • AMD64対応のみだったが、Go製なのでクロスコンパイルすればARM64対応可能
  • RundeckのDockerfile

ubuntu

ARM64環境でpullすれば自動的にARM64のDockerイメージが取得されるので、特別な対応は必要ありません。

tini

releases/downloadからARM64対応した成果物を取得するように修正します。
念の為、どちらのアーキテクチャでも動作するようにしています。

修正前

https://github.com/rundeck/rundeck/blob/v4.8.0/docker/ubuntu-base/Dockerfile#L34-L40

修正後

# Add Tini
ENV TINI_VERSION v0.19.0
RUN ARCH=$(dpkg --print-architecture) && \
    wget -q https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${ARCH} -O /tini && \
    wget -q https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${ARCH}.asc -O /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \
 && gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini

remco

ARM64対応した成果物が無い為、新たにGolangをビルドする環境を用意し、コードからクロスコンパイルするように修正します。
ビルド後の実行ファイルをコピーして利用します。

修正前

https://github.com/rundeck/rundeck/blob/v4.8.0/docker/ubuntu-base/Dockerfile#L42-L47

修正後

FROM golang:buster AS remco

WORKDIR /src

ENV REMCO_VERSION 0.12.3
RUN wget https://github.com/HeavyHorst/remco/archive/refs/tags/v$REMCO_VERSION.tar.gz && \
    tar -zxvf v$REMCO_VERSION.tar.gz && \
    cd remco-$REMCO_VERSION && \
    make GOARCH=`go env GOARCH` && \
    cp -pf bin/remco /src
COPY --from=remco /src/remco /usr/local/bin/remco

Dockerfile

下記がARM64対応したRundeckのDockerイメージです。

##################################################
# remcoのARM64対応
##################################################

FROM golang:buster AS remco

WORKDIR /src

ENV REMCO_VERSION 0.12.3
RUN wget https://github.com/HeavyHorst/remco/archive/refs/tags/v$REMCO_VERSION.tar.gz && \
    tar -zxvf v$REMCO_VERSION.tar.gz && \
    cd remco-$REMCO_VERSION && \
    make GOARCH=`go env GOARCH` && \
    cp -pf bin/remco /src


##################################################
# RundeckのベースイメージをARM64対応
##################################################

# Build base container
######################
FROM ubuntu:20.04 AS ubuntu-base

ENV DEBIAN_FRONTEND noninteractive
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

## BASH
RUN echo "dash dash/sh boolean false" | debconf-set-selections \
    && dpkg-reconfigure dash

## General package configuration
RUN set -euxo pipefail \
    && sed -i -e 's#http://\(archive\|security\)#mirror://mirrors#' -e 's#/ubuntu/#/mirrors.txt#' /etc/apt/sources.list \
    && apt-get -y update && apt-get upgrade -y && apt-get -y --no-install-recommends install \
        acl \
        curl \
        gnupg2 \
        ssh-client \
        sudo \
        openjdk-11-jdk-headless \
        uuid-runtime \
        wget \
        unzip \
    && rm -rf /var/lib/apt/lists/* \
    # Setup rundeck user
    && adduser --gid 0 --shell /bin/bash --home /home/rundeck --gecos "" --disabled-password rundeck \
    && chmod 0775 /home/rundeck \
    && passwd -d rundeck \
    && addgroup rundeck sudo \
    && chmod g+w /etc/passwd

# Add Tini
ENV TINI_VERSION v0.19.0
RUN ARCH=$(dpkg --print-architecture) && \
    wget -q https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${ARCH} -O /tini && \
    wget -q https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${ARCH}.asc -O /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \
 && gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini

COPY --from=remco /src/remco /usr/local/bin/remco

WORKDIR /home/rundeck


##################################################
# Rundeckの公式Dockerイメージ
##################################################

FROM rundeck/rundeck:4.8.0 AS rundeck-base


##################################################
# ARM64対応されたRundeckのDockerイメージ
##################################################

FROM ubuntu-base

# Update image apt packages
USER root
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get clean

USER rundeck

# Rundeck本体から生成物をコピーする
COPY --from=rundeck-base --chown=rundeck:root /home/rundeck/docker-lib/ /home/rundeck/docker-lib/
COPY --from=rundeck-base --chown=rundeck:root /home/rundeck/etc/ /home/rundeck/etc/
COPY --from=rundeck-base --chown=rundeck:root /home/rundeck/server/ /home/rundeck/server/
COPY --from=rundeck-base --chown=rundeck:root /home/rundeck/user-assets/ /home/rundeck/user-assets/
COPY --from=rundeck-base --chown=rundeck:root /home/rundeck/var/ /home/rundeck/var/
COPY --from=rundeck-base --chown=rundeck:root /home/rundeck/rundeck.war /home/rundeck/rundeck.war
COPY --from=rundeck-base --chown=rundeck:root /etc/remco/ /etc/remco/

ENTRYPOINT [ "/tini", "--", "./entrypoint.sh" ]

最後に

Dockerイメージを自作するのは良いんですが、どこかで時間があればremcoとRundeckをARM64対応するPR投げたいと思ってます。

やる元気出るかは、その時の気分次第!

Discussion