dockerexecを使用してDockerコンテナでコマンドを実行する方法
序章
Docker は、開発者がポータブルで一貫性のあるLinuxコンテナーを作成および管理するのに役立つコンテナー化ツールです。
コンテナを開発またはデプロイするときは、実行中のコンテナの内部を調べて、現在の状態を調べたり、問題をデバッグしたりする必要があります。 この目的のために、Dockerは docker exec
すでに実行されているコンテナでプログラムを実行するコマンド。
このチュートリアルでは、 docker exec
コマンドと、それを使用してコマンドを実行し、実行中のDockerコンテナでインタラクティブシェルを取得する方法。
前提条件
このチュートリアルでは、Dockerが既にインストールされており、ユーザーに実行権限があることを前提としています。 docker
. 実行する必要がある場合 docker
root ユーザーとして、先頭に追加することを忘れないでください sudo
このチュートリアルのコマンドに。
なしでDockerを使用する方法の詳細については sudo
アクセスするには、Dockerチュートリアルのインストール方法のSudoを使用せずにDockerコマンドを実行するセクションを参照してください。
テストコンテナの開始
を使用するには docker exec
コマンドを実行するには、実行中のDockerコンテナが必要です。 コンテナがまだない場合は、次のコマンドでテストコンテナを開始します docker run
指図:
- docker run -d --name container-name alpine watch "date >> /var/log/date.log"
このコマンドは、公式アルパインイメージから新しいDockerコンテナを作成します。 これは、軽量で最小限のLinuxディストリビューションである AlpineLinuxを使用する人気のあるLinuxコンテナーイメージです。
を使用します -d
コンテナをターミナルからデタッチしてバックグラウンドで実行するには、フラグを立てます。 --name container-name
コンテナに名前を付けます container-name
. ここで好きな名前を選択するか、これを完全に省略して、Dockerに新しいコンテナーの一意の名前を自動的に生成させることができます。
次に alpine
、コンテナに使用するイメージを指定します。
そして最後に watch "date >> /var/log/date.log"
. これは、コンテナで実行するコマンドです。 watch
デフォルトでは2秒ごとに、指定したコマンドを繰り返し実行します。 そのコマンド watch
この場合に実行されます date >> /var/log/date.log
. date
次のように、現在の日付と時刻を出力します。
- OutputFri Jul 23 14:57:05 UTC 2021
The >> /var/log/date.log
コマンドの一部は、からの出力をリダイレクトします date
そしてそれをファイルに追加します /var/log/date.log
. 2秒ごとに新しい行がファイルに追加され、数秒後には次のようになります。
OutputFri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021
次のステップでは、Dockerコンテナーの名前を見つける方法を学習します。 これは、ターゲットにしているコンテナがすでにあるが、その名前がわからない場合に役立ちます。
Dockerコンテナの名前を見つける
提供する必要があります docker exec
使用するコンテナーの名前(またはコンテナーID)を使用します。 この情報は、 docker ps
指図:
- docker ps
このコマンドは、サーバー上で実行されているすべてのDockerコンテナーを一覧表示し、それらに関するいくつかの高レベルの情報を提供します。
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-name
この例では、コンテナIDと名前が強調表示されています。 あなたはどちらかを使って言うことができます docker exec
使用するコンテナ。
コンテナの名前を変更する場合は、 docker rename
指図:
- docker rename container-name new-name
次に、使用例をいくつか紹介します。 docker exec
実行中のDockerコンテナでコマンドを実行します。
Dockerコンテナでのインタラクティブシェルの実行
Dockerコンテナー内で対話型シェルを開始する必要がある場合、おそらくファイルシステムを探索したり、実行中のプロセスをデバッグしたりするために、 docker exec
とともに -i
と -t
フラグ。
The -i
フラグは、コンテナへの入力を開いたままにし、 -t
flagは、シェルが接続できる疑似端末を作成します。 これらのフラグは、次のように組み合わせることができます。
- docker exec -it container-name sh
これにより、 sh
指定されたコンテナ内のシェル。基本的なシェルプロンプトが表示されます。 コンテナを終了するには、次のように入力します exit
次にを押します ENTER
:
- exit
コンテナイメージに次のようなより高度なシェルが含まれている場合 bash
、あなたは置き換えることができます sh
と bash
その上。
Dockerコンテナでの非対話型コマンドの実行
実行中のDockerコンテナー内でコマンドを実行する必要があるが、対話性は必要ない場合は、 docker exec
フラグなしのコマンド:
- docker exec container-name tail /var/log/date.log
このコマンドは実行されます tail /var/log/date.log
に container-name
コンテナ、および結果を出力します。 デフォルトでは、 tail
コマンドは、ファイルの最後の10行を出力します。 最初のセクションで設定したデモコンテナを実行している場合は、次のように表示されます。
OutputMon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021
これは基本的に、Dockerコンテナのインタラクティブシェルを開くのと同じです(前の手順で行ったように) docker exec -it container-name sh
)そして実行します tail /var/log/date.log
指図。 ただし、このコマンドは、シェルを開いてコマンドを実行してからシェルを閉じるのではなく、疑似端末を開かずに1つのコマンドで同じ出力を返します。
Dockerコンテナの代替ディレクトリでコマンドを実行する
コンテナの特定のディレクトリでコマンドを実行するには、 --workdir
ディレクトリを指定するフラグ:
- docker exec --workdir /tmp container-name pwd
このコマンド例は、 /tmp
ディレクトリを作業ディレクトリとして実行し、 pwd
現在の作業ディレクトリを出力するコマンド:
Output/tmp
The pwd
コマンドは、作業ディレクトリが /tmp
.
Dockerコンテナで別のユーザーとしてコマンドを実行する
コンテナ内で別のユーザーとしてコマンドを実行するには、 --user
国旗:
- docker exec --user guest container-name whoami
これにより、guestユーザーを使用して whoami
コンテナ内のコマンド。 The whoami
コマンドは、現在のユーザーのユーザー名を出力します。
Outputguest
The whoami
コマンドは、コンテナの現在のユーザーがguestであることを確認します。
Dockerコンテナへの環境変数の受け渡し
実行するコマンドとともに、環境変数をコンテナに渡す必要がある場合があります。 The -e
フラグを使用すると、環境変数を指定できます。
- docker exec -e TEST=sammy container-name env
このコマンドは、 TEST
等しい環境変数 sammy
、次に実行します env
コンテナ内のコマンド。 The env
次に、コマンドはすべての環境変数を出力します。
OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/root
The TEST
変数はに設定されます sammy
.
複数の変数を設定するには、 -e
それぞれのフラグ:
- docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env
環境変数でいっぱいのファイルを渡したい場合は、 --env-file
国旗。
まず、テキストエディタでファイルを作成します。 新しいファイルを開きます nano
ここでは、使い慣れた任意のエディターを使用できます。
- nano .env
使用しています .env
ファイル名として、これはバージョン管理外の情報を管理するためにこれらの種類のファイルを使用するための一般的な標準です。
あなたの KEY=value
次のように、1行に1つずつファイルに変数を追加します。
TEST=sammy
ENVIRONMENT=prod
ファイルを保存して閉じます。 ファイルを保存して終了するには nano
、 押す CTRL+O
、 それから ENTER
保存してから CTRL+X
出る。
今実行します docker exec
コマンド、後に正しいファイル名を指定 --env-file
:
- docker exec --env-file .env container-name env
OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/root
ファイル内の2つの変数が設定されます。
複数のファイルを使用して複数のファイルを指定できます --env-file
フラグ。 ファイル内の変数が互いに重複している場合、コマンドの最後にリストされているファイルが前のファイルを上書きします。
一般的なエラー
使用する場合 docker exec
コマンドを実行すると、いくつかの一般的なエラーが発生する可能性があります。
Error: No such container: container-name
The No such container
エラーは、指定されたコンテナーが存在しないことを意味し、コンテナー名のスペルが間違っている可能性があります。 使用する docker ps
実行中のコンテナを一覧表示し、名前を再確認します。
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
これ not running
メッセージは、コンテナーが存在するが停止していることを意味します。 コンテナを開始できます docker start container-name
Error response from daemon: Container container-name is paused, unpause the container before exec
The Container is paused
エラーは問題をかなりよく説明します。 コンテナの一時停止を解除する必要があります docker unpause container-name
先に進む前に。
結論
このチュートリアルでは、実行中のDockerコンテナーでコマンドを実行する方法と、実行時に使用できるいくつかのコマンドラインオプションについて学習しました。
Docker全般の詳細については、 Dockerタグページ 、Dockerチュートリアル、Docker関連のQ&Aページなどへのリンクがあります。
Dockerのインストールについては、 Ubuntu20.04にDockerをインストールして使用する方法をご覧ください。