03/26追記
そもそもとしてADD自体使うのがあまりオススメできない。
アクセス先のコンテンツが冪等なら
wget gzip tar
で十分というのが強い人の考え方っぽいです。
better docker image - Speaker Deck
RUN wget
にすることでcacheが効く
なるほど。
はじめに
ADDでremote urlを指定してtgz落として、そのまま展開してくれるよネーなんて思ってたらしてくれなかったので泣きながらRUN
を書いた。
最終的なものはこれ
RUN mkdir example \
&& curl -sL http://example.com/release/1.0/example-bin-1.0.tgz \
| tar zx -C example --strip-components 1
rmとかは用いていないけどあんまり美しくない。。。
ADD | Dockerfile
Dockerfileを学びながら書いていたらADD
という物を知った
The ADD instruction copies new files, directories or remote file URLs from and adds them to the filesystem of the image at the path .
ADD | Docker Documentation
簡単にいうと指定したファイルやディレクトリをコンテナ内に追加する
インストラクション。
同じようなものにCOPY
というものがる。
###ADD
とCOPY
の違い
ざっくりと。
より深く知りたかったらこちらとか
[docker] COPY とADD の違いを試してみた - Qiita
COPY
COPY
- 指定したファイルやフォルダをコピーする
- urlはコピー元に指定できないヨ!
- 圧縮されていてもそのまま!
ADD
ADD
- 指定したファイルやフォルダをコピーする
- remoteのファイル(url)もコピー元に指定できる!
- コピー元のファイルが圧縮されていたらコンテナ内に自動解凍して配置!
ざっくりとした違いはこんなかんじ。
ADD
でremoteの圧縮されたファイルを指定したらそのまま解凍してコンテナ内に設置できそう!
それができればwget && tar && rm
とかナンセンスなRUN
をしなくてすみそう!
-> できませんでした。
エラー発生してTwitterで嘆いてると友人から公式リファレンスを投げつけられる。
Resources from remote URLs are not decompressed.
要約: remoteのurlを指定した場合自動解凍はされません。
かなしみ
最終的な形
RUN curl -sL http://example.com/release/1.0/example-bin-1.0.tgz \
| tar zx -C ./
# la
example-bin-1.0/
# tree example-bin-1.0
example-bin-1.0
├── bin
│ ├── example
│ ├── sample
│ └── answer
・
・
curlしたものをtarにパイプで渡すことでちょっとはマシなDockerfileになった。
ただこれだとexample-bin-1.0
というフォルダができてダサいので、
RUN mkdir example \
&& curl -sL http://example.com/release/1.0/example-bin-1.0.tgz \
| tar zx -C example --strip-components 1
tarのオプションでケアしてあげる。
これでmv example-bin-1.0 example
したかのような状態。
# la
example/
# tree example
example
├── bin
│ ├── example
│ ├── sample
│ └── answer
・
・
/tmpとかに落として,解凍して,リネームして,/tmpに保存したヤツ削除……という1連の動作を&&で繋ぐよりはスマートだけど、煮え切らないですね。
余談
remoteの圧縮ファイルをADD
したら展開されてしまうバージョンがあったらしくて、
リファレンスと挙動が違うとissueが立ってた。
Behaviour of ADD for remote tar balls changed with 17.06 · Issue #33849 · moby/moby
うん。