前段
dockerって超便利で今どき知らないとか自称ITエンジニアとしてもどうなの?という世界線で、dockerをよくわからずなんとなく使っていたが、ECSとかFargateとかついにDockerから逃れられなくなった青年が、広大なネットを一日さまよって得たDockerの知識をここに記す。
※つまり、ハチャメチャなことを書いている可能性があるということだ。気をつけてね。
とりあえずこれをやればいいと思った件
これすごく良かったような気がします。
いろんなサイト巡ってこれにたどり着いた。
Google翻訳でもたぶん読めるから英語だけど頑張れ!
その上で、今日の気ずきをまとめていく
COPYとVolumeについて
今日の朝はVolumeでソースコードマウントして作ったイメージをFargateでデプロイしたら503エラーがでた〜とか騒いでいたんですがこれは当たりまえだのクラッカーなお話でした。
基本的にDocker開発をするときはソースコードを何回も何回も何回も何回も変更するので
docker run -v /host/path:/container/path hoge
みたいな感じでホストのディレクトリをコンテナのディレクトリにマウントして開発をします。
こうしないと、コンテナの中でプログラムを書くか、ホストでソースコードを書き換えるたびにdocker buildしなくてはいけなくなるからです。
だかしかし、つまりこれはコンテナのなかにソースコードは入っていないということなのです。
当然イメージにソースコードは含まれていません。
そんなイメージをFargateで展開したってなんも出てこないのは当たり前です。
ということでどこかしらで公開するということになったら、これまでVolumeでマウントしていたファイルたちをイメージの中に内包することが必要になってきます。
その時に使うのがCOPYです。
COPY . /app/src/
みたいにDockerfileに書いて上げればイメージにソースコードが内包されます。
開発環境はVolumeでマウントすればいいのですが、デプロイするってなったらCOPYしなくちゃいけないよ。
とここで、僕は開発と本番でDockerfile2つ書かなくちゃいけないのかよめんどくさーって思いました。
次に繋がります。
検証と本番でかき分けるマルチステージドサービス
検証と本番のDockerfile分けるのめんどくせーって思っていたし、どうやら2016年とかは分けるしかなかったみたいなんだけど、今は「マルチステージドサービス」というものがあって、分けなくていいんだとさ。
FROM node:10.16.3 AS development
略
FROM node:10.16.3-slim AS production
略
このFROM ・ AS hoge
ってのがポイント。
このhoge
ってところを指定することで開発用とか本番用とか分けられるんだって。
指定はtarget
でやればいいらしいよ。
version: '3.7'
services:
chat:
build:
context: .
target: development
command: npx nodemon index.js
ports:
- '3000:3000'
volumes:
- .:/srv/chat
- chat_node_modules:/srv/chat/node_modules
上にtargetって書いてありますが、そこをASの後ろのワードにすればOK。
で多分これの本当の良さはここではないんだが、ぶっちゃけまだ良くわかってないのでなんとなく書くんだけれど
COPY --from=development --chown=root:root /srv/chat/node_modules ./node_modules
こういうことができるのですよ。
つまり、別のステージのビルド結果をコピーできるってことですね。
Dockerガリガリつかってないからなんとも言えないので詳しくはこのあたりを読むといいと思う。
https://qiita.com/minamijoyo/items/711704e85b45ff5d6405
以上
まとめるとたいしたことないな。