Dockerfile 眺めていると、1つのRUN命令で複数の処理を記載する際に2通りの記載があります。
下記のpythonイメージのDockerfileの例だと、
①処理を && で繋げるだけのパターン
# make some useful symlinks that are expected to exist
RUN cd /usr/local/bin \
&& ln -s idle3 idle \
&& ln -s pydoc3 pydoc \
&& ln -s python3 python \
&& ln -s python3-config python-config
②set -ex で開始して && で繋げるパターン
RUN set -ex \
\
&& wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" \
&& wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" \
&& export GNUPGHOME="$(mktemp -d)" \
・
・
・
&& ldconfig \
\
&& python3 --version
どう使いわけるんでしょうか?
①処理を && で繋げるだけのパターン
こちらについては、シェルの && 演算子で繋げていって、
処理が成功(exit 0)すれば順次処理していく形か。
②set -ex で開始して && で繋げるパターン
こちらについても、処理成功で次処理を実行していきたいという意図は同じ。
set の -x オプションはデバッグ用途?長いRUN命令書いている際に便利なのだろうか。
set の -e オプションは non-zero で終了した際に停止したい場合。
ん? && で事足りるのでは?
RUN 失敗すれば docker build も停止するので、Dockerfileの1つのRUN命令内においてのでの set -e 有無は意味をなさない気がする。
好みの問題?
https://stackoverflow.com/questions/47143319/what-does-set-x-do-in-dockerfile
https://stackoverflow.com/questions/50319492/difference-between-and-set-ex-in-dockerfiles