LoginSignup
9
11

More than 5 years have passed since last update.

Dockerfileを読んでみる(elasticsearch-docker)

Last updated at Posted at 2017-01-29

dockerとは

  • コンテナという仮想的な空間を提供して、その中でアプリケーションを実行できる
  • docker公式

Dockerfileとは

  • Dockerコンテナーの構成内容を書くみたい
  • Makefileみたいなイメージ

なんで読んだ?

  • Dockerはなんとなく使えていたが、どんな構成になっているかわかっていなかった
  • そのうちカスタムするんじゃね?知ってなきゃやばくね?って思った
  • どのように構成を指定しているかをちゃんと理解したほうが良いと思った

対象

ざっと見る


だめだ・・
1行ずつ愚直に調べながら読むしかねぇ・・・

FROM docker.elastic.co/elasticsearch/elasticsearch-alpine-base:latest
  • FROMは元となるDockerイメージを指定する命令文
  • elasticsearch-alpine-baseはAlpin LinuxをベースとしたElasticSearch
  • Alpin Linuxは軽量でセキュアなLinuxイメージ(Alpine Linux)
  • Alpin Linuxを使うとDockerイメージのサイズを減らせるらしい。(参考: Alpine Linux で Docker イメージを劇的に小さくする
  • つまり、イメージのサイズを小さくするためのベースを使っているよ、と
MAINTAINER Elastic Docker Team <docker@elastic.co>
  • MAINTAINERは生成するイメージの Author (作者)フィールドを指定します。(公式より)
  • カスタムするときは自分のアカウントとかに書き換えるかな
ARG ELASTIC_VERSION
ARG ES_DOWNLOAD_URL
ARG ES_JAVA_OPTS
  • ARGは実行時に受け取る引数
  • Makefileから実行するときにそれぞれ引数で指定している
  • ELASTIC_VERSION :バージョン
  • ES_DOWNLOAD_URL :Elasticsearchのダウンロード先
  • ES_JAVA_OPTS :検証環境用のパラメータっぽいけど、Makefileからの指定なし。(よくわからん)
ENV PATH /usr/share/elasticsearch/bin:$PATH
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
  • 環境変数の設定
  • PATHはElasticsearchのPATHを追加している
  • JAVA_HOMEはそのままjava homeの指定をする
WORKDIR /usr/share/elasticsearch
  • WORKDIRは命令実行時の作業ディレクトリの指定
# Download/extract defined ES version. busybox tar can't strip leading dir.
RUN wget ${ES_DOWNLOAD_URL}/elasticsearch-${ELASTIC_VERSION}.tar.gz && \
    EXPECTED_SHA=$(wget -O - ${ES_DOWNLOAD_URL}/elasticsearch-${ELASTIC_VERSION}.tar.gz.sha1) && \
    test $EXPECTED_SHA == $(sha1sum elasticsearch-${ELASTIC_VERSION}.tar.gz | awk '{print $1}') && \
    tar zxf elasticsearch-${ELASTIC_VERSION}.tar.gz && \
    chown -R elasticsearch:elasticsearch elasticsearch-${ELASTIC_VERSION} && \
    mv elasticsearch-${ELASTIC_VERSION}/* . && \
    rmdir elasticsearch-${ELASTIC_VERSION} && \
    rm elasticsearch-${ELASTIC_VERSION}.tar.gz

なげぇ・・・
1文ずつ見てみる

RUN wget ${ES_DOWNLOAD_URL}/elasticsearch-${ELASTIC_VERSION}.tar.gz
* RUNはコマンドを実行して、結果をコミットする
* 指定したURLからElasticsearchのtar.gzを取得して

EXPECTED_SHA=$(wget -O - ${ES_DOWNLOAD_URL}/elasticsearch-${ELASTIC_VERSION}.tar.gz.sha1)
* EXPECTED_SHA にチェックサムを格納し、

test $EXPECTED_SHA == $(sha1sum elasticsearch-${ELASTIC_VERSION}.tar.gz | awk '{print $1}')
* チェックサムを検証して、

tar zxf elasticsearch-${ELASTIC_VERSION}.tar.gz
* tar.gzを解凍し、

chown -R elasticsearch:elasticsearch elasticsearch-${ELASTIC_VERSION}
* 権限を付与して、

mv elasticsearch-${ELASTIC_VERSION}/* .
* 解凍したファイルをカレントに移動し、

rmdir elasticsearch-${ELASTIC_VERSION}
* 解凍したディレクトリを削除して、

rm elasticsearch-${ELASTIC_VERSION}.tar.gz
* tar.gzを削除する

なんだ・・・ダウンロードして配置してるだけじゃん

RUN set -ex && for esdirs in config data logs; do \
        mkdir -p "$esdirs"; \
        chown -R elasticsearch:elasticsearch "$esdirs"; \
    done
  • set -e で、0以外のステータスで終了した時に即終了する
  • set -x で、コマンドの変数などを展開した状態でコンソールに表示する
  • config, data, logs のディレクトリを作成して権限を変更する
USER elasticsearch
  • USERは命令実行時のユーザを指定する
  • elasticsearchユーザを指定する
# Install xpack
RUN eval ${ES_JAVA_OPTS:-} elasticsearch-plugin install --batch x-pack
  • Elasticsearchのプラグイン(x-pack)をインストールする
COPY elasticsearch.yml config/
COPY log4j2.properties config/
COPY bin/es-docker bin/es-docker
  • COPYはそのままコピー
  • 各ファイルをコピーする
USER root
  • rootユーザを指定する
RUN chown elasticsearch:elasticsearch config/elasticsearch.yml config/log4j2.properties bin/es-docker && \
    chmod 0750 bin/es-docker
  • 先程コピーしたファイルの権限を変更する
USER elasticsearch
  • elasticsearchユーザを指定する
CMD ["/bin/bash", "bin/es-docker"]
  • CMDはコンテナ実行時の処理をどの形式で行うか指定する
EXPOSE 9200 9300
  • EXPOSEはListenするポートを指定する

まとめ

  • Alpin Linuxを使って軽量なイメージを作っている
  • 通常のインストールコマンドとかもそのまま使えそう
  • 他にやってることとしては、Elastic公式からtar.gzをダウンロードしてきて配置しているだけだった
  • 1行ずつちゃんと読めば、むずかいしいことはしていない
  • カスタマイズも結構楽にできそう

プラグインとか追加したい場合は

  • 以下のように追加する
RUN elasticsearch-plugin install [プラグイン名]

参考

9
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11