⏰
Rundeckの公式DockerイメージをARM64対応させる
普段利用しているアプリや開発ツール類が一通りARM64
対応された為、Intel Mac
からM1 Mac
に乗り換えました。
開発環境のスペックが上がると気分も上がりますね。
しばらく経って、、、
RundeckをDockerで構築することになったのですが、公式が配布しているDockerイメージはAMD64
しか対応していませんでした。
一応、Docker Desktop for MacでもAMD64
のDockerイメージを起動することが出来るんですが、
起動速度が遅かった為、ARM64
対応したDockerイメージを自作することにしました。
ARM64
対応するのに必要だったこと
RundeckをRundeckのDockerfileを見てみると、Ubuntu内にJavaとツール類をインストールしていました。
Ubuntu、tini、remcoをARM64
対応してubuntu-baseを作り直せば、後はRundeckのコード類をコピーするだけで起動しそうです。
- ubuntu-baseのDockerfile
- RundeckのDockerfile
ubuntu
ARM64
環境でpullすれば自動的にARM64
のDockerイメージが取得されるので、特別な対応は必要ありません。
tini
releases/download
からARM64
対応した成果物を取得するように修正します。
念の為、どちらのアーキテクチャでも動作するようにしています。
修正前
修正後
# 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をビルドする環境を用意し、コードからクロスコンパイルするように修正します。
ビルド後の実行ファイルをコピーして利用します。
修正前
修正後
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