スタッフブログ

 
NEWS

【初心者必見】Dockerコンテナのデフォルトプロセスとは


2023年3月5日

ファイルの説明は、前回の記事を参照ください。前回との違いは、ENTRYPOINT命令をコメントアウトしました。

コンテナを起動する

コンテナが立ち上がります。下記コマンドでプロセスを確認しましょう。

プロセスが立ち上がっています。ENTRYP0INT命令をコメントアウトしたのに・・・なぜでしょうか

プロセスの詳細を確認する

docker psコマンドの出力を確認します。

赤枠のCOMMAND行が、ENTRYPOINT命令で指定したコマンドです。”docker-entrypoint.sh”スクリプトが指定されています。

どこに書かれているでしょうか?

Dockerfile1行目のFROM命令に注目しましょう。node:18のベースイメージを指定しています。
このイメージはOSSです。ソースコードを確認しましょう。

node:18イメージのソースコードを確認する

行末2行を表示します。ソースコードの全てはこちらです。

ENTRYPOINT命令を確認できました。”docker-entrypoint.sh”が指定されています。つまり、疑問の1つ「デフォルトプロセスのENTROYPOINT命令はどこで指定されいているのか」の回答は、node:18のイメージで指定されているです。

docker-entrypoint.shスクリプトを確認する

疑問の1つは解決されました。ただし、「プロセスが起動し続けている理由」が解決されていません。そこで、”docker-entrypoint.sh”を確認しましょう。OSSなのでソースコードを確認できます。

行末のexec “$@”を紐解きます。

execコマンドは、現在のプロセスを指定されたプログラムに置き換えます。”$@”は、全てのコマンドラインの引数です。つまり、シェルスクリプト内で実行されたコマンドライン引数を、現在のプロセスに置き換えて実行するための構文です。

“$@”で指定されるものは

もう一度、node:18イメージのソースコードを確認しましょう。

CMD命令とはなんでしょうか。CMD命令とは、Dockerコンテナが実行されたときに実行されるコマンドを定義するために使用されます。詳細は割愛しますが、上のソースコードの場合docker-entrypoint.shnodeが実行されます。

つまり、コマンドライン引数に”node”が指定され、execコマンドで現在のプロセスをnodeコマンドに置き換えて実行します。

nodeコマンドとは

nodeコマンドは、REPL(Read-Eval-Print Loop)環境を提供します。つまり、nodeコマンドのプロセスは自動で停止しません。

ここでもう一つの疑問が解決しました。「プロセスが起動し続けている理由」の回答は、nodeコマンドのプロセスが起動しているからでした。

最後に

OSSのソースコードを読み解くことは勉強になりますね。

次回はなぜ、MLエンジニアを目指しているのかお話しします。

最後までお読みいただきありがとうございました。


-->
NEWS

Dockerコンテナのプロセスをめぐる旅


2023年2月26日

DockerfileのENTRYPOINT命令は、コンテナ起動時にそのコンテナのデフォルトプロセスとして実行されるコマンドを指定するために使用されます。
ここでは実行されるコマンドにnodeを指定しています。

docker-compose.ymlファイルのvolumesオプションは、ホストからコンテナへマウントするディレクトリを指定しています。
ここではsrcディレクトリを指定しています。つまり、srcディレクトリ配下に作成したファイルはコンテナへ同期されます。

 

Node.jsでJavaScriptファイルを実行する方法

nodeコマンドに続けてJavaScriptファイルのパスを指定します。

例えば、main.jsファイルを実行する場合は、下記コマンドです。

 

コンテナ起動時にJavaScriptファイルを実行する

ENTRYPOINTでnodeを指定しています。つまり、コンテナ起動時にnodeコマンドが実行されます。パラメータ(param)を渡す方法は以下です。

このコマンドは、nodeというコンテナイメージを起動し、ENTROYPOINTにparamを渡します。”run”に続く”node”とは、docker-compose.ymlの3行目のサービス名”node”に当たります。

JavaScriptファイルを実行する場合、下記のようにファイルを指定します。

 

実行中のDockerコンテナを確認する方法

 

Node.jsでJavaScriptファイルを実行して、コンテナのプロセスを確認する

3パターンに分けて実行します。実行直後にdocker ps でコンテナのプロセスを確認します。

 

標準出力1行

コンテナのプロセスを確認しましょう。
何も表示されません。

10秒スリープ

コンテナのプロセスを確認しましょう。
実行したコンテナのプロセスが確認できます。10秒後に確認すると、プロセスが確認できません。

無限ループ

コンテナのプロセスを確認しましょう。
実行したコンテナのプロセスが確認できます。ドッカーデーモンを停止しない限り確認できます。

最後に

コンテナのプロセスを確認しました。デフォルトプロセスは、DockerfileのENTRYPOINT命令で指定します。今回は、nodeコマンドです。
“node”は、JavaScriptコードを実行するためのコマンドです。

さて皆さん。コンテナを起動したら手動で停止するまで動いていませんか? なぜか気になりませんか?ENTRYPOINT命令を指定しなくても。この理由について次回説明します。

最後までお読みいただきありがとうございました。


-->
NEWS

[C言語]プロセス生成とメモリの仕組み


2022年11月8日

処理の流れ
1 プログラム実行
2 変数(n)に1を代入
3 10秒スリープ
4 子プロセス生成

・ 親プロセスの処理

変数(n)をインクリメント

・ 子プロセスの処理

10秒スリープ
変数(n)をインクリメント

watchコマンドでプロセスを監視しましょう。

プログラム実行前

watchコマンドが起動しています。

プログラム実行直後

親プロセスが実行しています。

子プロセス生成

プロセスが2つ起動しています。子プロセスと親プロセスが確認できます。

メモリの確認

変数nを追ってみます。
parentが親プロセス、childが子プロセスです。

子プロセスで変数nを2にインクリメントしているにも関わらず、親プロセスのインクリメントの値が3ではなく2です。
これは、子プロセスは親プロセスのメモリを共有しないからです。

変数nがなぜ子プロセスで宣言済みなの?
子プロセスは起動時に親プロセスのメモリ領域の内容を複製します。複製した内容を専用のメモリ領域に割り当て、起動後は独立して実行されます。

最後までお読みいただきありがとうございました。


-->