Nodejsの環境をDockerで構築していたところ、コンテナのプロセスってどうなってるの?って疑問を抱き検証しました。
注意事項
Dockerを使ったことがある方向けです。
事前の準備
Dockerfileとdocker-compose.ymlを準備します。
1 2 3 4 |
FROM node:18 WORKDIR /src ENTRYPOINT ["node"] |
1 2 3 4 5 6 7 |
version: '3' services: node: build: . volumes: - ./src:/src |
DockerfileのENTRYPOINT命令は、コンテナ起動時にそのコンテナのデフォルトプロセスとして実行されるコマンドを指定するために使用されます。
ここでは実行されるコマンドにnodeを指定しています。
docker-compose.ymlファイルのvolumesオプションは、ホストからコンテナへマウントするディレクトリを指定しています。
ここではsrcディレクトリを指定しています。つまり、srcディレクトリ配下に作成したファイルはコンテナへ同期されます。
Node.jsでJavaScriptファイルを実行する方法
nodeコマンドに続けてJavaScriptファイルのパスを指定します。
1 2 |
node script.js |
例えば、main.jsファイルを実行する場合は、下記コマンドです。
1 2 |
node main.js |
コンテナ起動時にJavaScriptファイルを実行する
ENTRYPOINTでnodeを指定しています。つまり、コンテナ起動時にnodeコマンドが実行されます。パラメータ(param)を渡す方法は以下です。
1 2 |
docker-compose run node param |
このコマンドは、nodeというコンテナイメージを起動し、ENTROYPOINTにparamを渡します。”run”に続く”node”とは、docker-compose.ymlの3行目のサービス名”node”に当たります。
JavaScriptファイルを実行する場合、下記のようにファイルを指定します。
1 2 |
docker-compose run node script.js |
実行中のDockerコンテナを確認する方法
1 2 |
docker ps |
Node.jsでJavaScriptファイルを実行して、コンテナのプロセスを確認する
3パターンに分けて実行します。実行直後にdocker ps でコンテナのプロセスを確認します。
標準出力1行
1 2 |
console.log('Immediately finish!') |
コンテナのプロセスを確認しましょう。
何も表示されません。
10秒スリープ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * 指定秒、停止する * @param seconds * @returns {Promise} */ async function stop(seconds) { await new Promise(resolve => setTimeout(function () { console.log('finish function') resolve() }, seconds)); } stop(10000) |
コンテナのプロセスを確認しましょう。
実行したコンテナのプロセスが確認できます。10秒後に確認すると、プロセスが確認できません。
無限ループ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * whileループを使って無限に実行する * @returns {Promise} */ async function notFinishedProcess() { while (true) { console.log('The process is still running'); await new Promise(resolve => setTimeout(resolve, 5000)); } } notFinishedProcess() |
コンテナのプロセスを確認しましょう。
実行したコンテナのプロセスが確認できます。ドッカーデーモンを停止しない限り確認できます。
最後に
コンテナのプロセスを確認しました。デフォルトプロセスは、DockerfileのENTRYPOINT命令で指定します。今回は、nodeコマンドです。
“node”は、JavaScriptコードを実行するためのコマンドです。
さて皆さん。コンテナを起動したら手動で停止するまで動いていませんか? なぜか気になりませんか?ENTRYPOINT命令を指定しなくても。この理由について次回説明します。
最後までお読みいただきありがとうございました。