web-dev-qa-db-ja.com

各「exec」コマンドでDockerイメージのエントリポイントを実行するにはどうすればよいですか?

DockerspecでDockerfilesをテストしようとした後、私はついに 問題 正しく解決できませんでした。

問題は、Docker自体にあると思います。そのプロセスを理解していれば、エントリポイントは実行時にのみ実行されますが、コンテナが起動したままで「exec」コマンドを起動した場合、そうではありません再呼び出されました。

私はそれが望まれる行動だと思います。

しかし、エントリポイントがすべてのコマンドの前にある " gos "スクリプトである場合、それは問題です...


「myImage」には次のエントリポイントがあります:gosu 1000:1000 "$@"

起動した場合:docker run -it myImage id -u

出力は「1000」です。

コンテナを起動した場合:docker run -it myImage bash

このコンテナでは、id -uは「1000」を出力します。

しかし、このコンテナで新しいコマンドを開始すると、新しいシェルが開始され、エントリポイントが実行されないため、:docker exec CONTAINER_ID id -u

新しいシェルが「root」として開始されるため、「0」を出力します。


エントリポイントごとに実行する方法はありますか?または、シェルを開いて再利用しますか?

またはそれを行うためのより良い方法?

または、多分私は何も理解していませんか? ;)

ありがとう!


[〜#〜]編集[〜#〜]

ここで提案されているソリューションを読んだ後、問題はDockerの動作ではなく、Serverspecの動作にあることを理解しました。私の目標は、コマンドをdocker run引数として直接テストすることですが、Serverspecはコンテナーを開始し、docker execでコマンドをテストします。

したがって、最善の解決策は、Serverspecによって実行されるdocker runのstdoutを取得する方法を見つけることです。

しかし、私の個人的なユースケースでは、最善の解決策はおそらくGosuを使用せずに--user flag :)

9
Doubidou

コンテナ内の特定のユーザーでdocker execを実行することが目標である場合は、--userオプションを使用できます。

docker exec --user myuser container-name [... your command here]

毎回gosuを実行したい場合は、docker execを使用してコマンドとして指定できます。

docke exec container-name gosu 1000:1000 [your actual command here]

私の経験では、これを簡単に再利用できるものにカプセル化する最良の方法は、.shスクリプト(またはWindowsの.cmdファイル)を使用することです。

これをローカルフォルダのファイルにドロップします...たとえばgs

#! /bin/sh
docker exec container-name gosu 1000:1000 "$@"

chmod +x gsで実行権限を付与してから、ローカルフォルダーから./gsで実行します。

5
Derick Bailey