DockerコンテナにおけるコマンドとARGSのより近い観察


今日、私たちは、私たちがコンテナを回転させるとき、私たちがどのように我々自身のプロセスを実行するためにDockerのコマンドとARGSを利用できるかを見ています.あなたが自分のイメージを作成することなく、ワンオフタスクを実行する場合は、これは有用かもしれない.
bashコマンドを実行したいと思います.何がこれを行う最も簡単な方法ですか?BusyBox、Ubuntu、Debianのような軽量画像を使用してコンテナを回転させるだけで?例えば、Debianをベースイメージとしましょう.
docker run debian echo hello
私たちは“こんにちは”を期待します.もしコンテナが動いているかどうかを確認したらどうなるでしょうか?

容器が止まった.コンテナはVMと比較してオペレーティングシステムをホストすることを意味しません.DebianまたはUbuntuのような基本的なコンテナを実行すると、docker run debianしかし、nginxやredisのような場合には、シャットダウンしない限り実行し続けるか、何らかの理由でクラッシュします.どうやって起こるの?

フードの下で


これらのファイル(Debianを除いて)の上で簡略化されたバージョンであることに注意してください.

これらのファイルの各々は、それらが何らかのコマンドを実行するように指示する下でDockerfile命令を定義します.Debianの場合、それはちょうどシェルではなく、プロセスではないCMDを発行します.あなたがすでに発見されるならば、両方のbashRedis Dockerfileは、彼らのプロセスを回転させる定義を持ちます- Redis ServerとNGinxウェブサーバ.

NGINX命令


あなたはどのように1つのコンテナをスピンするときに実行するコマンドをカスタマイズする方法について疑問に思うだろう.コンテナを起動するときにコマンドを指定する1つの方法は、コンテナーを実行するときに実行可能ファイルの名前を発行することです.例えば、
docker run debian echo hello-world
コンテナの状態をチェックすると、コンテナが停止したことがわかります.これを永久にできますか.そうです、コンテナが動作するとき、我々の望ましい状態を指定するためにDockerfileを持っている必要があります.
私たちがDockerfileでCMD命令を使うと言います、Docker docsに従ってこれを指定する3つの方法があります.
  • CMD ( exec形式、これは好ましい形式です)
  • CMD ["executable","param1","param2"](entrypointへのデフォルトパラメタとして)
  • CMD ["param1","param2"](貝殻)
  • 💡 There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.


    Test1.Dockerfile
    FROM debian
    CMD ["printf", "Hello from Test1"]
    
    どうやって印刷されるのかを動的に定義できますか?ここでの1つの警告は、私たちがコマンドラインARGSを通過するなら、私たちが設定した既存のCMD命令に追加されません.Dockerはコマンドとして実行しようとすると我々のCMD命令が置き換えられます.これをテストしましょう.
    あなたがCMD command param1 param2を実行するならば、それは「開始されたコンテナプロセスを引き起こします:exec :「こんにちは」:実行可能ファイルは$ path : unknownで見つかりません」エラーです.

    以下のようにコマンドを渡すことができます.

    Docker run test 1 hello命令


    引数を指定する必要があるように、常に実行するために何かを指定できます.test 2という別のファイルを作りましょう.Dockerfile.
    Test2.Dockerfile
    FROM debian
    ENTRYPOINT ["printf", "Hello from %s\n"]
    CMD ["Test2"]
    
    docker run test1 printf helloの命令は、私たちがそこで指定したものは、コンテナが起動したときに実行する必要があることをDockerに言います.言い換えると、引数を渡すなら、それらはentrypointとしてそこで指定したものに追加されます.
    docker build -t test -f Test2.Dockerfile .
    
    これを実行するならば、我々は以下を得ます.

    クール!我々がパラメータで現在通過するならば、それはピックアップされて、我々が3号線で持っていたENTRYPOINT命令に代わります;しかし、私たちがentrypointで定義したように、それはまだ出力を示します.これは、コンテナ当たり1つのCMD命令だけがあるので、意味をなす.

    あなたは、それが取り替えられるならば、CMDを持つ目的が何であるかについて考えています?デフォルト値を指定するときに便利です.
    複数の引数を指定するとどうなりますか?

    ここで何が幸せ?以下のコメントで私に知らせてください😊

    結論


    この記事では、我々はコマンドとargsを通過するときに我々は、それらをスピンコンテナに見た.次の記事では、これをKubernetesポッド定義と比較し、どのようにして同じことができるかを把握します.

    参考文献


    https://docs.docker.com/engine/reference/builder/