Kibanaのarm64向けコンテナイメージを作ってGitHub Container Registryに登録。Raspberry Pi 4(64bit)でDocker ComposeしてElastic Stackを起動する

arm64向けKibanaのコンテナイメージを公開してみました。よければご利用ください。

`ghcr.io/moritalous/ghcr/kibana-arm64`



* Elasticsearchのコンテナイメージは`7.9.1`からarm64向けも提供されるようになった（[Docker @ Elastic](https://www.docker.elastic.co/)）
* 2020/9/5現在、Kibanaのarm64向けコンテナイメージはまだ提供されていない
* @Y-Shikase さんの[Raspberry Pi 4Bのdocker上でElastic Stack 7.6.0/7.7.x/7.8.0/7.9.0 を動かす](https://qiita.com/Y-Shikase/items/d162805aebb3a1a8447f)によると、ちょっと手を入れるとarm64でもKibanaが動きそう
* ElasticsearchやKibanaのDockerfileを[GitHub](https://github.com/elastic/dockerfiles)で発見
* 上手に組み合わせればarm64向けコンテナイメージが作れそう
* GitHub Container Registryというものも始まったようなのでやってみよう（@zembutsuさんの[GitHub Container Registry(ghcr.io)にDockerイメージをpushする手順](https://qiita.com/zembutsu/items/1effae6c39ceae3c3d0a)）
* docker-composeは[公式のもの](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html)を参照

# arm64向けDockerfile

Kibanaはリリースファイルには、Node.jsの実行バイナリがまるごと含まれており、これがx64向けのものなのでarm64では動きません。
ですので、Node.jsの実行バイナリ（/usr/share/kibana/node以下）をarm64のものに差し替えます。

また、`dumb-init`もarm64版に変更します。

元にしたのはGitHubで公開されている公式のDockerfileです。


```diff
#
# ** THIS IS AN AUTO-GENERATED FILE **
#

################################################################################
# Build stage 0
# Extract Kibana and make various file manipulations.
################################################################################
FROM centos:7 AS prep_files
# Add tar and gzip
RUN yum update -y && yum install -y tar gzip && yum clean all
RUN cd /opt && curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.9.1-linux-x86_64.tar.gz && cd -
RUN mkdir /usr/share/kibana
WORKDIR /usr/share/kibana
RUN tar --strip-components=1 -zxf /opt/kibana-7.9.1-linux-x86_64.tar.gz
+ 
+ RUN cd /opt && curl --retry 8 -s -L -O https://nodejs.org/dist/v10.22.0/node-+v10.22.0-linux-arm64.tar.gz && cd -
+ RUN rm -rf /usr/share/kibana/node
+ RUN mkdir /usr/share/kibana/node
+ RUN cd /usr/share/kibana/node && tar --strip-components=1 -zxf /opt/node-v10.22.0-linux-arm64.tar.gz && cd -

# Ensure that group permissions are the same as user permissions.
# This will help when relying on GID-0 to run Kibana, rather than UID-1000.
# OpenShift does this, for example.
# REF: https://docs.openshift.org/latest/creating_images/guidelines.html
RUN chmod -R g=u /usr/share/kibana
RUN find /usr/share/kibana -type d -exec chmod g+s {} \;

################################################################################
# Build stage 1
# Copy prepared files from the previous stage and complete the image.
################################################################################
FROM centos:7
EXPOSE 5601

# Add Reporting dependencies.
RUN yum update -y && yum install -y fontconfig freetype shadow-utils && yum clean all

# Add an init process, check the checksum to make sure it's a match
- RUN curl -L -o /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64
- RUN echo "37f2c1f0372a45554f1b89924fbb134fc24c3756efaedf11e07f599494e0eff9  /usr/local/bin/dumb-init" | sha256sum -c -
+ RUN curl -L -o /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_arm64
+ RUN echo "45b1bbf56cc03edda81e4220535a025bfe3ed6e93562222b9be4471005b3eeb3  /usr/local/bin/dumb-init" | sha256sum -c -
RUN chmod +x /usr/local/bin/dumb-init


# Bring in Kibana from the initial stage.
COPY --from=prep_files --chown=1000:0 /usr/share/kibana /usr/share/kibana
WORKDIR /usr/share/kibana
RUN ln -s /usr/share/kibana /opt/kibana

ENV ELASTIC_CONTAINER true
ENV PATH=/usr/share/kibana/bin:$PATH

# Set some Kibana configuration defaults.
COPY --chown=1000:0 config/kibana.yml /usr/share/kibana/config/kibana.yml

# Add the launcher/wrapper script. It knows how to interpret environment
# variables and translate them to Kibana CLI options.
COPY --chown=1000:0 bin/kibana-docker /usr/local/bin/

# Ensure gid 0 write permissions for OpenShift.
RUN chmod g+ws /usr/share/kibana && find /usr/share/kibana -gid 0 -and -not -perm /g+w -exec chmod g+w {} \;

# Remove the suid bit everywhere to mitigate "Stack Clash"
RUN find / -xdev -perm -4000 -exec chmod u-s {} +

# Provide a non-root user to run the process.
RUN groupadd --gid 1000 kibana && useradd --uid 1000 --gid 1000 --home-dir /usr/share/kibana --no-create-home kibana
USER kibana

LABEL org.label-schema.schema-version="1.0" org.label-schema.vendor="Elastic" org.label-schema.name="kibana" org.label-schema.version="7.9.1" org.label-schema.url="https://www.elastic.co/products/kibana" org.label-schema.vcs-url="https://github.com/elastic/kibana" org.label-schema.license="Elastic License" org.label-schema.usage="https://www.elastic.co/guide/en/kibana/index.html" org.label-schema.build-date="2020-09-01T22:38:56.015Z" license="Elastic License"

ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]

CMD ["/usr/local/bin/kibana-docker"]
```

ビルドします

```console
docker build -t moritalous/kibana-arm64:7.9.1 .
```

イメージ確認

```console
$ docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
moritalous/kibana-arm64                         7.9.1               96c8b0365e7e        About an hour ago   1.29GB
$ 
```

# GitHub Container Registryに登録する
公式の手順に従います。

ログインして

```console
cat TOKEN.txt | docker login ghcr.io -u [USERNAME] --password-stdin
```

タグ付けして

```console
docker tag 96c8b0365e7e ghcr.io/moritalous/ghcr/kibana-arm64:7.9.1
```

プッシュ

```console
docker push ghcr.io/moritalous/ghcr/kibana-arm64
```

# Docker Compose

https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html
をほぼそのまま利用します。違うのはKibanaのコンテナイメージが`ghcr.io/moritalous/ghcr/kibana-arm64:7.9.1`となるだけです。

以下の設定も忘れずに。

```console
sysctl -w vm.max_map_count=262144
```

https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html