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 :)
コンテナ内の特定のユーザーで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
で実行します。