9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerfileのADDはurlをコピー元に指定すると自動解凍してくれない

Last updated at Posted at 2019-02-26

03/26追記

そもそもとしてADD自体使うのがあまりオススメできない。
アクセス先のコンテンツが冪等なら
wget gzip tarで十分というのが強い人の考え方っぽいです。
better docker image - Speaker Deck

RUN wgetにすることでcacheが効く

なるほど。

はじめに

ADDでremote urlを指定してtgz落として、そのまま展開してくれるよネーなんて思ってたらしてくれなかったので泣きながらRUNを書いた。

最終的なものはこれ

Dockerfile
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というものがる。

###ADDCOPYの違い
ざっくりと。
より深く知りたかったらこちらとか
[docker] COPY とADD の違いを試してみた - Qiita

COPY

Dockerfile
COPY
  • 指定したファイルやフォルダをコピーする
  • urlはコピー元に指定できないヨ!
  • 圧縮されていてもそのまま!

ADD

Dockerfile
ADD
  • 指定したファイルやフォルダをコピーする
  • remoteのファイル(url)もコピー元に指定できる!
  • コピー元のファイルが圧縮されていたらコンテナ内に自動解凍して配置!

ざっくりとした違いはこんなかんじ。
ADDでremoteの圧縮されたファイルを指定したらそのまま解凍してコンテナ内に設置できそう!
それができればwget && tar && rmとかナンセンスなRUNをしなくてすみそう!

-> できませんでした。

エラー発生してTwitterで嘆いてると友人から公式リファレンスを投げつけられる。

Resources from remote URLs are not decompressed.
要約: remoteのurlを指定した場合自動解凍はされません。

Dockerfile reference | Docker Documentation

かなしみ

最終的な形

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
Screenshot_2019-02-26 23.30.03_ryrodE.png

うん。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?