尝试阅读Dockerfile(elasticsearch-docker版本)
docker是什么
-
- コンテナという仮想的な空間を提供して、その中でアプリケーションを実行できる
- docker公式
Dockerfile是什么?
-
- Dockerコンテナーの構成内容を書くみたい
- Makefileみたいなイメージ
你为什么读了它?
目标
-
- elastic公式の、Elasticsearchコンテナ
-
- ちょっと使うことがあったので
- elastic/elasticsearch-docker
草草地看一下
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
真让人扔掉。。。
逐句来看
运行 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)
预计的SHA值存储在EXPECTED_SHA变量中,并从${ES_DOWNLOAD_URL}/elasticsearch-${ELASTIC_VERSION}.tar.gz.sha1获取。
对比 $EXPECTED_SHA 和 $(sha1sum elasticsearch-${ELASTIC_VERSION}.tar.gz | awk ‘{print $1}’) 的值是否相等
只需一种做法:
解压tar.gz文件:tar zxf elasticsearch-${ELASTIC_VERSION}.tar.gz
将elasticsearch-${ELASTIC_VERSION}的所有者和组设置为elasticsearch:elasticsearch。
* 将解压缩的文件移动到当前位置中。
删除解压缩的文件夹 elasticsearch-${ELASTIC_VERSION}
删除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 [プラグイン名]
请提供以下内容的中文翻译:
Reference
- Dockerfile リファレンス