web-dev-qa-db-ja.com

ドッカーコンテナーを停止/開始しないでファイルを編集する方法

複数のコンテナに分割されているアプリケーションのエラーを修正し、問題をデバッグしようとして、コンテナ内のファイルを頻繁に編集します。

  • 私は完全に怠zyでnanoをインストールし、コンテナで直接編集するか、

  • コンテナからファイルをドッキングし、編集し、コピーしてコンテナを再起動します

これらは、コンテナビルドの新しいコンテンツに到達する前の中間ステップであり、上記を実行するよりもかなり時間がかかります(もちろん中間/いじるだけです)。

今、私は頻繁にコンテナの開始プログラムを壊します。これは、破壊的なケースでは、ノードスクリプトまたはpython webserverスクリプトのいずれかであり、どちらも通常は構文エラーで失敗します。

それらのコンテナを保存する方法はありますか?それらは開始しないので、execでそれらを実行することはできません。したがって、それらは失われます。ビルド入力で問題のあるファイルを修正した後、rm/rmi/build/runルートに移動します。

停止したコンテナ内のファイルを編集するか、停止したコンテナ内でそれらをcpするかシェルを起動するには-このコンテナを修正できるものは何ですか?

(リモートコンピューターで作業し、ネットワーク構成を壊すことに少し似ているようです-接続はこの方法で「永久に」失われ、フォールバックがあればそれを使用する必要があります。)

ホストからDockerコンテナファイルを編集する方法 は適切に見えますが、古くなっています。

59
Andreas Reiff

自分の質問に答える..まだ知識のある人からのより良い答えを望んでいます!!

2つの可能性があります。

1)ホスト上のファイルシステムを直接編集します。これはやや危険であり、コンテナを完全に破壊する可能性があります。問題の原因によっては他のデータが破壊される可能性があります。

2)起動スクリプトを変更して、bashの起動、修正/編集を行った後、起動プログラムを目的のプログラムに再度変更するなど、失敗しないものに変更する(ノードまたはそれ以前のもの)。

詳細:

1)を使用して

docker ps

実行中のコンテナを見つけるか、

docker ps -a

すべてのコンテナ(停止したコンテナを含む)を見つける

docker inspect (containername)

最初の値の1つである「Id」を探します。

これは実装の詳細を含む部分であり、変更される可能性があります。この方法でコンテナを失う可能性があることに注意してください。

に行く

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

そこには、コンテナのベースとなるイメージに向けて変更されたすべてのファイルがあります。ファイルの上書き、ファイルの追加または編集ができます。

繰り返しますが、これはお勧めしません。

2) https://stackoverflow.com/a/32353134/586754 で説明されているように、設定json config.jsonは次のようなパスで見つけることができます

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

そこで、引数をeから変更できます。 g。 「nodejs app.js」を「/ bin/bash」に。次に、Dockerサービスを再起動して、コンテナを開始します(正しく起動することがわかります)。あなたが使用する必要があります

docker start -i (containername)

すぐに終了しないことを確認します。これで、コンテナを使用したり、後でアタッチしたりできます。

docker exec -ti (containername) /bin/bash

また、docker cpは、コンテナの外部で編集されたファイルをコピーするのにかなり役立ちます。

また、とにかくコンテナが多かれ少なかれ「失われた」場合にのみそれらの対策にフォールバックする必要があります。したがって、変更は改善になります。

49
Andreas Reiff

私が行った設定の変更が不適切であるために起動しないコンテナに問題がありました。停止したコンテナからファイルをコピーして編集することができました。何かのようなもの:

docker cp docker_web_1:/etc/Apache2/sites-enabled/Apache2.conf .

(ファイルを修正)

docker cp Apache.conf docker_web_1:/etc/Apache2/sites-enabled/Apache2.conf
56
tomurie

コンテナファイルシステムを直接編集できますが、それが良いアイデアかどうかはわかりません。最初に、コンテナのランタイムルートとして使用されるディレクトリのパスを見つける必要があります。 docker container inspect id/nameを実行します。 JSON出力でキーUpperDirを探します。

それがあなたのディレクトリです。

4
Tejas Sarade