Dockerexecを使用してDockerコンテナでコマンドを実行する方法

提供:Dev Guides
移動先:案内検索

序章

Docker は、開発者がポータブルで一貫性のあるLinuxコンテナーを作成および管理するのに役立つコンテナー化ツールです。

コンテナを開発またはデプロイするときは、実行中のコンテナの内部を調べて、現在の状態を調べたり、問題をデバッグしたりする必要があります。 この目的のために、Dockerはdocker execコマンドを提供して、すでに実行されているコンテナーでプログラムを実行します。

このチュートリアルでは、docker execコマンドと、それを使用してコマンドを実行し、実行中のDockerコンテナーでインタラクティブシェルを取得する方法について学習します。

前提条件

このチュートリアルでは、Dockerが既にインストールされており、ユーザーがdockerを実行する権限を持っていることを前提としています。 root ユーザーとしてdockerを実行する必要がある場合は、このチュートリアルのコマンドの前にsudoを付けることを忘れないでください。

sudoアクセスなしでDockerを使用する方法の詳細については、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

コマンドの>> /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コンテナー内で対話型シェルを開始する必要がある場合、おそらくファイルシステムを探索したり、実行中のプロセスをデバッグしたりする場合は、-iフラグと-tフラグを指定してdocker execを使用します。

-iフラグは、コンテナーへの入力を開いたままにし、-tフラグは、シェルが接続できる疑似端末を作成します。 これらのフラグは、次のように組み合わせることができます。

docker exec -it container-name sh

これにより、指定されたコンテナでshシェルが実行され、基本的なシェルプロンプトが表示されます。 コンテナを終了するには、exitと入力し、ENTERを押します。

exit

コンテナイメージにbashなどのより高度なシェルが含まれている場合は、上記のshbashに置き換えることができます。

Dockerコンテナでの非対話型コマンドの実行

実行中のDockerコンテナー内でコマンドを実行する必要があるが、対話機能は必要ない場合は、フラグなしでdocker execコマンドを使用します。

docker exec container-name tail /var/log/date.log

このコマンドは、container-nameコンテナでtail /var/log/date.logを実行し、結果を出力します。 デフォルトでは、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

pwdコマンドは、作業ディレクトリが/tmpであることを確認しました。

Dockerコンテナで別のユーザーとしてコマンドを実行する

コンテナ内で別のユーザーとしてコマンドを実行するには、--userフラグを追加します。

docker exec --user guest container-name whoami

これは、 guest ユーザーを使用して、コンテナーでwhoamiコマンドを実行します。 whoamiコマンドは、現在のユーザーのユーザー名を出力します。

Outputguest

whoamiコマンドは、コンテナーの現在のユーザーがguestであることを確認します。

Dockerコンテナへの環境変数の受け渡し

実行するコマンドとともに、環境変数をコンテナに渡す必要がある場合があります。 -eフラグを使用すると、環境変数を指定できます。

docker exec -e TEST=sammy container-name env

このコマンドは、TEST環境変数をsammyと等しくなるように設定してから、コンテナー内でenvコマンドを実行します。 次に、envコマンドは、すべての環境変数を出力します。

OutputPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/root

TEST変数はsammyに設定されます。

複数の変数を設定するには、それぞれに対して-eフラグを繰り返します。

docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env

環境変数でいっぱいのファイルを渡したい場合は、--env-fileフラグを使用して渡すことができます。

まず、テキストエディタでファイルを作成します。 ここでnanoを使用して新しいファイルを開きますが、使い慣れた任意のエディターを使用できます。

nano .env

ファイル名として.envを使用しています。これは、これらの種類のファイルを使用してバージョン管理外の情報を管理するための一般的な標準です。

次のように、KEY=value変数を1行に1つずつファイルに書き込みます。

.env

TEST=sammy
ENVIRONMENT=prod

ファイルを保存して閉じます。 ファイルを保存してnanoを終了するには、CTRL+OENTERの順に押して保存し、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

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

Container is pausedエラーは、問題をかなりよく説明しています。 続行する前に、docker unpause container-nameでコンテナの一時停止を解除する必要があります。

結論

このチュートリアルでは、実行中のDockerコンテナーでコマンドを実行する方法と、実行時に使用できるいくつかのコマンドラインオプションについて学習しました。

Docker全般の詳細については、 Dockerタグページ 、Dockerチュートリアル、Docker関連のQ&Aページなどへのリンクがあります。

Dockerのインストールについては、 Ubuntu20.04にDockerをインストールして使用する方法をご覧ください。