2017-07-29 12 views
0

DockerがDockerファイルでコマンドを実行する方法と、コンテナを起動した後に手動でコマンドを実行する方法の違いがあるようです。これは、あなたが始めることができる種類のシェル、すなわち、私がDockerfileと対話していないシェルと、対話型のシェルとを対話型のものとしたもの(docker run -it <some-img-id>のようなもの)のためです。Dockerファイルと全く同じようにDocker cmdsを実行するには

Dockerコンテナで実行中のコマンドをデバッグして、コマンドがDockerfileから実行されるように正しく実行するにはどうすればよいですか? run cmdに/bin/bash --noprofileを追加するだけで十分ですか?あるいは、Dockerfileから起動したときに環境に関して異なることはありますか?

+0

です。これには一般的な回答はありません。質問している**具体的な**コマンドが必要です。他者に自分自身の違いを見せる方法を示す[mcve]も同様に役立ちます。 –

+0

... 'COPY'のようなコマンドは、Dockerの内部で完全に実装されています。シェルにはまったく呼び出されません。 'RUN'とkinにはさまざまなモードがあります。文字型の引数リストを配列として渡すと、どこにもシェルがありません。 –

答えて

1

あなたが経験しているのは、シェルのための動作です。ほとんどの場合、bashシェルの使用に慣れています。だから、一般的に、私たちは以下の方法で既存のコンテナ

docker exec -it <containerid> bash 

については

新しいコンテナの

docker run -it <imageid> bash 

をコマンドを実行しようとしていました。しかし、我々は内部RUNディレクティブを使用して、いくつかのコマンドを指定する場合Dockerファイル

RUN echo Testing 

これは/bin/sh -c 'echo Testing'と同じです。したがって、両方のシェルが異なるので、特定の相違を期待することができます。

ドッカー1.12で

以上あなたがSHELLという名前Dockerfileディレクティブを持っている、これはあなたがこれはRUNコマンドはbash -c 'echo Testing'として実行されることになるだろうSHELL

SHELL ["/bin/bash", "-c"] 
RUN echo Testing 

デフォルトに上書きすることができます。 SHELL指令の詳細については、here

1

短い答え1:あなたがいない場合は

docker --entrypoint "/bin/sh -c" -u root <image> cmd 

短い答え2:

にDockerfileが、これをUSERSHELLコマンドを使用しない場合Dockerは、ビルド後にイメージを圧縮または圧縮し、Dockerfileコマンドごとにイメージレイヤーを作成します。あなたは--->と、各ステップの終わりにdocker buildの出力でそれらを見ることができます:

Step 2/8 : WORKDIR /usr/src/app 
    ---> 5a5964bed25d # <== THIS IS IMAGE ID OF STEP 2 
Removing intermediate container b2bc9558e499 
Step 3/8 : RUN something 
    ---> f6e90f0a06e2 # <== THIS IS IMAGE ID OF STEP 3 
Removing intermediate container b2bc9558e499 

画像IDを探しデバッグするRUNステップは(たとえば、あなたが上記にデバッグステップ3にしたい直前に、ステップ2の画像IDを取る)。それからちょうどそのイメージでコマンドを実行します。

docker run -it 5a5964bed25d cmd 

長い答え1:

をあなたが実際にdocker run [image] cmdドッカーを実行すると、このようにcmdを開始します。

  • は、デフォルトエントリポイントを実行しますcmdを引数として指定します。 Entrypointは、DockerfileのENTRYPOINTコマンドによってビルドされたイメージに保存されます。つまり、cmdmy-appであり、エントリポイントが/bin/sh -cの場合、/bin/sh -c my-appを実行します。
  • がcommulative画像のDockerfileからすべてのENVコマンドからの環境変数でそれを開始しDockerfileで最後USERコマンドで定義された画像のデフォルトのユーザーIDとそれを開始し

docker buildが実行されますDockerfile RUNは、Dockerfileのその時点(行)に存在していた値でのみ、全く同じです。

正確には、実行ラインの前にENVsとlast USERコマンドの値をとり、docker runコマンドの値を使用する必要があります。

ほとんどの一般的な画像では、エントリポイントとして/bin/sh -cまたは/bin/bash -cがあり、ほとんどの場合、rootユーザーで動作します。したがって、docker --entrypoint "/bin/bash -c" -u root <image> cmdで十分でしょう。

関連する問題