こんにちは。まゆみです。
Dockerについての記事をシリーズで書いています。
今までの記事では、Webアプリのソースコードや、コードの実行に必要な開発環境を含めてDockerizeする方法を書いてきました。(下の図で言えば、左側のようなContainer)
今回の記事では、『必要な開発環境のみ』 をDockerizeする方法を書いていきます。
また、そのように開発環境のみを整えるContainerを作ることがどのような場面で役立つのかということも合わせて書いていきます
今回の記事では、『node.js』を使った環境構築を例に出して記事を書いていますが、node.js以外でアプリを作る時も応用できる内容になっていると思います。
私自身、Laravelは使った事がないのですが、Laravelって環境構築だけでも色んな工程があってかなり面倒くさいみたいですね。
色々なところに応用していただければ嬉しいです。
ではさっそく始めていきますね。
どうして開発環境のみのContainerを作るのか?
Containerの最大のメリットの1つは、あなたが作ったDockerfileを人に渡すことができ、人それぞれどんな環境を使っていたとしてもすぐに開発環境が整うことですよね。
ローカル環境にnodeがインストールされていない人もすぐに開発環境が整うように、ローカルではなく、Contianerで開発環境を整える方法があれば、何かと便利ですよね。
Containerの中でnpm を初期化する方法
では、ローカルではなく、『Containerの中』でnpm を初期化して、package.json を作ってみます。
2つやり方があるので順番に説明していきますね。
①初回Containerを実行するとき
まだrunしたことがない、初めてのイメージをrunする時は、実行するときに下記のようなコマンドで実行してみてください。
docker run -it <Image> <上書きしたいコマンド>
コマンドの最後に<上書きしたいコマンド>をつけて実行する事で、 の方が代わりに実行/font>されます。
今回は、『node』というイメージのデフォルトのコマンドを『npm init』に上書きして実行してみましょう。
ローカル環境でnpm initをする時を思い出してもらえば分かると思いますが、npm init と打ち込むと、package.jsonに書き込む内容に沿った質問(?)がされますよね。
質問の答えをターミナルに書いて返したいので『-itオプション』もつけて実行します(-itオプションを付けて実行するとターミナルにコマンドなどを打ちこむことができます)
具体的なコマンドは下記のようになります
docker run -it node npm init
実行結果は下のようになります
実行中のContainerに重ねてコマンドを実行したいとき
今、イメージnodeでrunさせた実行中のContainerがあるとします(docker ps -aで表示させた時STATUSがUPになっているContainerのことです。)
そのContainerに『後から』コマンドを上書きして実行させたい時はrun の代わりに『exec』を使います。
docker exec -it <ContainerID or Name> npm init
Dockerfile を書く
では、次にあなた自身のイメージを作るためのDockerfileを書いていきましょう
FROM node:14-alpine
WORKDIR /app
ベースとなるイメージは、nodeのイメージのなかの軽量のバージョンの物を選びます
その後WORKDIR /appを書き、Container内のどこでコマンドを実行するのか指定します
バインドマウントをする
Dockerfileを上記のように書いた後、バインドマウントをしてContainerを実行してみます
docker run -it -v $(pwd):/app <Image> npm init
バインドマウントをして実行する事で、Container内で作ったものが、ローカルホストに反映されます。
上記のように実行した後に、ローカル側を見てみるとpackage.jsonを見ることができます
このように、Dockerにnodeの開発環境を整えることで、
ローカルホスト側にnodeがインストールされていなくても
ローカル側で開発を進めていくことができます。
まとめ
今回の記事はこの辺で締めくくらせていただきます。
お役に立てれば幸いです。