Dockerfileを書いていて詰まったところなど。
WORKDIR は ADD には効かない
公式ドキュメントにちゃんと書いてあるが、WORKDIR
が効くのはRUN
CMD
ENTRYPOINT
のみ。
下記のように書いても/var/app
には配置されません。
Dockerfile
WORKDIR /var/app
ADD Gemfile.local ./
WORKDIR のバグ
下記のように記載しても、WORKDIR
のディレクティブで環境変数が効かない。
Dockerfile
ENV APP_PATH /var/app
WORKDIR ${APP_PATH}
RUN bundle install
これはバグのようで、修正されるまでは直接書くしか無さそう。
Dockerfile
WORKDIR /var/app
RUN bundle install
EXPOSE のバグ
下記のように記載しても、EXPOSE
のディレクティブで環境変数が効かない。
これもバグっぽい。
Dockerfile
ENV PORT 80
EXPOSE ${PORT}
実行順序について
Dockerfileにかかれている内容は一行毎にコンテナに入り実行されているみたいなので、下記のような書き方だと上手く実行されない。
Dockerfile
RUN /etc/init.d/mysqld start
RUN mysqladmin -u root password "password"
RUN /etc/init.d/mysqld stop
これは1行目でmysqlを実行したあとに状態を保存し、再度立ち上げたコンテナ上で2行目が実行されているから。(たぶん)
なので、以下のようにまとめて書けばOK。(見難いので改行しています)
Dockerfile
RUN /etc/init.d/mysqld start && \
mysqladmin -u root password "password" && \
/etc/init.d/mysqld stop
RUN の上限
dockerのv0.7.2以降における、AUFXの積み上げ可能なRUNの上限は 127 みたいです。
参考:stackoverflow
なので、&&
とかで節約するのはいいことです。