[解決済み] [Solved] 失敗した `docker build` のファイルシステムを検査するにはどうしたらいいですか?
質問
開発プロセス用に新しい Docker イメージを構築しようとしています。
cpanm
を使用して、さまざまなプロジェクトのベースイメージとして多数のPerlモジュールをインストールします。
Dockerfileを開発しながら。
cpanm
は、一部のモジュールがきれいにインストールされなかったため、失敗コードを返します。
私は、このような場合、間違いなく
apt
をインストールする必要があります。
質問なのですが、どこに
/.cpanm/work
ディレクトリが出力されましたが、これはログを検査するためでしょうか?一般的なケースでは、どのように私は失敗したファイルシステムの検査することができます
docker build
コマンドを実行できますか?
モーニング編集
を実行した結果
find
を発見しました。
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
それとも、必要なものがすべて揃うまで、"bare" コンテナを構築して手動で実行したほうがいいのでしょうか?
解決方法は?
dockerが正常に実行されるたびに
RUN
コマンドを Dockerfile から取得します。
イメージファイルシステムに新しいレイヤー
がコミットされます。便利なことに、これらのレイヤーIDをイメージとして使用し、新しいコンテナを起動することができます。
以下のDockerfileを例にとります。
FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt
を作成し、それをビルドします。
$ docker build -t so-26220957 .
Sending build context to Docker daemon 47.62 kB
Step 1/3 : FROM busybox
---> 00f017a8c2a6
Step 2/3 : RUN echo 'foo' > /tmp/foo.txt
---> Running in 4dbd01ebf27f
---> 044e1532c690
Removing intermediate container 4dbd01ebf27f
Step 3/3 : RUN echo 'bar' >> /tmp/foo.txt
---> Running in 74d81cb9d2b1
---> 5bd8172529c1
Removing intermediate container 74d81cb9d2b1
Successfully built 5bd8172529c1
から新しいコンテナを起動できるようになりました。
00f017a8c2a6
,
044e1532c690
と
5bd8172529c1
:
$ docker run --rm 00f017a8c2a6 cat /tmp/foo.txt
cat: /tmp/foo.txt: No such file or directory
$ docker run --rm 044e1532c690 cat /tmp/foo.txt
foo
$ docker run --rm 5bd8172529c1 cat /tmp/foo.txt
foo
bar
もちろん、シェルを起動してファイルシステムを探検したり、コマンドを試したりすることもできます。
$ docker run --rm -it 044e1532c690 sh
/ # ls -l /tmp
total 4
-rw-r--r-- 1 root root 4 Mar 9 19:09 foo.txt
/ # cat /tmp/foo.txt
foo
Dockerfile コマンドのいずれかが失敗した場合、必要なのは 直前のレイヤーのID で作成したコンテナでシェルを実行します。
docker run --rm -it <id_last_working_layer> bash -il
コンテナに一度
- 失敗したコマンドを試し、問題を再現してください。
- その後、コマンドを修正し、テストします。
- 最後に、修正したコマンドでDockerfileを更新します。
どうしても、最後に動作したレイヤーからではなく、実際に失敗したレイヤーで実験する必要がある場合は ドリューの回答 .
関連
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerコンテナのシェルに入るにはどうしたらいいですか?
-
[解決済み] 古いDockerコンテナを削除する方法
-
[解決済み] Dockerでイメージのクリーンビルドを強制する方法
-
[解決済み】Dockerは仮想マシンとどう違うの?
-
[解決済み】Dockerコンテナのファイルシステムを調査する
-
[解決済み】ビルド中にDockerfileでホストボリュームをDockerコンテナにマウントする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Rのデバッグ。"負の添え字と混在できるのは0のみ"
-
[解決済み] pg_stat_activityの使い方は?
-
[解決済み] WinDbgでシンボルを設定する方法は?
-
[解決済み] 起動したURLと一致するWebサイトがIISにリストアップされない
-
[解決済み] Elixirで関数の呼び出し元をリストアップする方法は?
-
[解決済み] GDBで特定機能に踏み込む
-
[解決済み】Windowsの.exeを「デコンパイル」することは可能ですか?または少なくともアセンブリを表示することはできますか?
-
[解決済み】実行中のJavaプロセスにIntelliJ IDEAのデバッガをアタッチする。
-
[解決済み】Visual Studio C++で、メモリ割り当ての表現とは何ですか?
-
[解決済み】拡張機能のbackground.jsのコンソールやdevtoolsにアクセスする。