docker buildではdocker build -t TAG_NAME - < Dockerfile.centos6
みたく、STDIN経由でビルド出来るが、以下のようにハマってしまったのでメモしとく。
docker build - < Dockerfile
ってやると、何故かADDが効かない現象に遭遇した。
調べてみたらここでも言及されていた。
http://t.co/pTDMSKJWPT
— okumura takahiro (@hfm) 2015, 1月 27
https://t.co/SVKZhQp9tI の続き。
どうやら公式の説明によると、STDIN経由でのbuildは”no build context”という奴で、URLベースのADD操作しか出来ないらしい。
http://t.co/q2NDkuE1YM
— okumura takahiro (@hfm) 2015, 1月 27
https://t.co/I6V7fhQhcr の続き。
ちなみにこれは、複数のDockerfileを扱おうとして、`docker build - < Dockerfile.centos6`ってやろうとして遭遇した奴。
— okumura takahiro (@hfm) 2015, 1月 27
https://t.co/ka2JBEJunp の続き。
Dockerfile -> Dockerfile.centos6 みたいなsymlink使えば`docker build .`出来るので、その辺はシェルスクリプトなりでゴニョる感じでなんとかすることにする。
— okumura takahiro (@hfm) 2015, 1月 27
Dockerfile -> Dockerfile.centos5
みたいにsymlinkであれば、docker build .
で運用可能なことが分かった。
そこで、複数のDockerfileを扱うときは、以下のようにシェルスクリプトなどでラップすることにした。
dist="centos6"
ln -sf "Dockerfile.${dist}" Dockerfile
ちなみにこの現象に遭遇した背景には、インフラCIで複数の環境(CentOS5やら6やらSLやら)が必要で、distributionごとにDockerfileを用意しようとしてた、というものがある。
追記 (2015-01-27 22:37)
Docker 1.5になると、docker buildに-f
オプションが追加されるかもしれないらしい。
これはDockerfileの指定オプションらしく、上記の悩みを一気に解決してくれそう。
@hfm 1.5で解決しそうですけどね https://t.co/CgWtsW7Yem
— Taichi Nakashima ☕️ (@deeeet) 2015, 1月 27
@hfm すいません、こっちです https://t.co/WP8fV6qjS6
— Taichi Nakashima ☕️ (@deeeet) 2015, 1月 27
@deeeetさん教えてくれてありがとう!!
Dockerfileへの依存について思うこと
Dockerfileは分割不可能だったり、上記のようなハマりどころがあったり、割と微妙なツール(妙な制約を課せられたシェルスクリプトって感じ)なので、packerにでも乗り換えられないかなあとか考えてる。
必要なツールが増えるのと、packerの学習コストが気がかりなんだけど、Dockerfileのルールを覚えるコストと較べてどうなんだろう。
インフラCIを実現する上でのPacker
例えばインフラCIならこう出来るのではないか。
- packerのbuildersフェーズで基礎的なイメージを用意する
- 最低限のパッケージのSSHログイン可能な状態を構築する
- OSインストール直後ぐらいの状態のDocker IMAGEが完成する
- provisionersでpuppetやchefを適応させる
- ここで一回IMAGEをexportする、というかさせられると思う
- exportされたIMAGEにServerspecを流し込む
上記みたいな手順を考えると、1と2はpackerで可能だし、3はシェルスクリプト数行で済む。 まだ妄想段階なので色々見えていない (そもそもdockerに精通してないので実現可能かも不明) のだけど、実現できたら結構面白いかも?と思ってる。