Edited at

DockerfileでPATHを通す時はRUNではなくENVを使おう

More than 3 years have passed since last update.

ある時Dockerfile内でPATHを通したいと思い、テストコンテナで以下のコマンドを実行して正しい環境になっていることを確認していました。

やりたかったことはCentOS6.7にopenjdk1.8をインストールしている環境にScala-2.11.7をインストールするということです。

OpenJDK1.8が入っているコンテナに手動でScalaをインストール

wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz

tar xvzf scala-2.11.7.tgz
mkdir /usr/local/scala
mv scala-2.11.7 /usr/local/scala
export PATH=$PATH:/usr/local/scala/scala-2.11.7/bin

これを実行した後に

which scala



scala

を実行してもちゃんと起動することが確認出来ました。




buildに失敗したDockerfile

FROM takashioshikawa/java8

WORKDIR /tmp

RUN wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
RUN tar xvzf scala-2.11.7.tgz
RUN mkdir /usr/local/scala
RUN mv scala-2.11.7 /usr/local/scala
RUN export PATH=$PATH:/usr/local/scala/scala-2.11.7/bin
RUN echo $PATH

RUN which scala

CMD /bin/bash

このDockerfileを使って

docker build -t takashioshikawa/scala-2.11.7 .

を実行すると

RUN echo $PATH

でexportしたはずのPATHが追加されておらず

which scala

でエラーが帰ってきました。




buildに成功したDockerfile



そこで調べてみると

http://stackoverflow.com/questions/27093612/in-a-dockerfile-how-to-update-path-environment-variable

http://inokara.hateblo.jp/entry/2013/12/28/121828

DockerfileのPATHはRUNではなくENVで通すことを知りDockerfileを書き換えました。

FROM takashioshikawa/java8

WORKDIR /tmp

RUN wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
RUN tar xvzf scala-2.11.7.tgz
RUN mkdir /usr/local/scala
RUN mv scala-2.11.7 /usr/local/scala
ENV PATH $PATH:/usr/local/scala/scala-2.11.7/bin
RUN echo $PATH

RUN which scala

CMD /bin/bash

RUN export PATH=$PATH:/usr/local/scala/scala-2.11.7/bin



ENV PATH $PATH:/usr/local/scala/scala-2.11.7/bin

に変更しただけです。

これでビルドが通るようになり

docker --rm -it --name testscala takashioshikawa/scala-2.11.7

でコンテナを立ち上げてwhichしてみるとちゃんとScalaが使えるようになりました。

地味にハマるとこがあるのでどんどんハマって知見を貯めていきたいですね、以上です。