Dockerコンテナを起動していない/停止しているファイルを編集する方法


93

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

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

  • コンテナーからファイルをdockercpし、編集し、コピーして戻し、コンテナーを再起動します。

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

今、私はコンテナの開始プログラムを頻繁に中断します。中断する場合は、ノードスクリプトまたはPython Webサーバースクリプトのいずれかであり、どちらも通常、構文エラーで失敗します。

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

停止したコンテナー内のファイルを編集したり、停止したコンテナー内でファイルをcpしたり、シェルを開始したりするにはどうすればよいですか?このコンテナーを修正できるものは何ですか?

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

ホストからDockerコンテナファイルを編集する方法は?関連性があるように見えますが、時代遅れです。


これも回避策である可能性がありますstackoverflow.com/a/32353134/586754-まだより良い解決策を望んでいます。
アンドレアスレイフ2015

1
コンテナ内ではなくホスト上でファイルを編集できるように、ボリュームのマウントを検討する必要があるかもしれません。コードに満足したらdocker cp、コンテナにファイルを自由に追加できます(または新しいイメージを作成できます)
Thomasleveil 2015

はい、最初からこのような設定をしていなければ、少し遅れます。これは回復には効果がないと思います。
アンドレアスレイフ2015

多くの読者は、ファイルを編集するのではなく、表示することだけを望んでいます。このような場合、docker commitコマンドを使用して新しい画像を分割できます。name=$(docker commit); docker run -it $name /bin/shあなたがやりたいことをします。
Att Righ 2017年

停止したコンテナのファイルシステムは、最終的には比較的永続的であるように思われますか?
Webwoman 2018

回答:


138

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

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

(ファイルを修正してください)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

22
これは受け入れられた答えです。どういうわけか、CPが停止したコンテナで機能するとは思いませんでした。いいね!
プロキシモ2018

完璧です。コンテナーからファイルをコピーし(パスはわかっていました)、編集してから、コンテナーの同じ場所にコピーして戻しました。私のために働いた!ありがとう!
ナワズ

ファイルを削除する方法はありますか?
コドラン

1
@kodlan取得元にのみ表示されるUpperDir場合のみdocker container inspect、オーバーレイシステムが、上位層で削除された基になる構造内のファイルをどのように表すかを確認する必要があります。
Tim Baverstock

おかげで、これは私がmacOSのdockerで実行されているMySQLコンテナを修正するのに役立ちました。
mazedlx

60

私自身の質問に答える..それでも、より知識のある人からのより良い答えを望んでいます!

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で説明されているように、次のようなパスで構成jsonconfig.jsonを見つけることができます。

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

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

docker start -i (containername)

すぐに終了しないようにします。これで、コンテナを操作したり、後でアタッチしたりできます。

docker exec -ti (containername) /bin/bash

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

また、コンテナが多かれ少なかれ「失われた」場合にのみ、これらの対策にフォールバックする必要があるため、変更を加えると改善されます。


まだより良い答えを期待しているので、気軽に答えてください。「ansered」タグも移動します。
Andreas Reiff 2015年

2番目の方法を使用し、config.jsonファイルを編集するたびにファイルを強制的に上書きするために、Dockerサービスを再起動する必要がありました
Vitaly Isaev 2015

2
config.v2.jsonがあり、ゾンビコンテナーを起動するたびに、Path / EntryPointの更新が元に戻され、再び停止します。「dockercp」を使用してentrypoint.shスクリプトを更新し、bashを実行するだけで修正されました。
Curtis Yallop 2017

@CurtisYallop私も同じことを経験しています。どのように解決しましたか?
Brett McLain

1
@BrettMcLainホストで編集するのではなく、dockercpを使用しました。このように:エントリポイントスクリプトの場所を検索します: "docker inspect container_name | grepEntry"。スクリプトを取得します: "docker cp container_name:/entrypoint.sh./"。(編集)スクリプトをコンテナーに戻します: "docker cp entrypoint.sh container_name:/entrypoint.sh"。エントリポイントにbashを実行させるか、スリープループを実行することができます(例:「while :; do sleep 10; done」)。最初のスクリプト行は「#!/ bin / bash」である必要があります。
Curtis Yallop 2017

9

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

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


ディレクトリが見つかりましたが、すべてのファイルが含まれていませんでした。
aioobe 2018年

これはOverlayFSであるため、ファイルはこれらのディレクトリの1つにある必要があります。
TejasSarade18年

ディレクトリ名は「UpperDir」とは異なる場合があります。たとえば、私の場合はSourceです。しかし、それはうまくいきました!
Rajni Kewlani

0

停止したコンテナーを再起動しようとしていて、構成の誤りのためにコンテナーを変更する必要があるが、コンテナーが開始されない場合は、「dockercp」コマンドを使用して次の操作を実行できます(前の提案と同様)。この手順では、ファイルを削除したり、必要なその他の変更を行ったりできます。運が良ければ、以下の多くのステップをスキップできます。

  1. docker inspectを使用してエントリポイントを見つけます(一部のバージョンではPathと呼ばれています)
  2. dockerrunを使用してクローンを作成します
  3. docker exec -ti bashを使用してクローンを入力します(* nixコンテナーの場合)
  4. クローンを調べてエントリポイントファイルの場所を見つけます
  5. docker cpを使用して古いエントリポイントスクリプトをコピーします:./
  6. たとえば、新しいエントリポイントスクリプトを変更または作成します

    #!/bin/bash tail -f /etc/hosts

  7. スクリプトに実行権があることを確認してください
  8. docker cp ./を使用して古いエントリポイントを置き換えます:
  9. startを使用して古いコンテナを開始します
  10. 開始するまで手順6〜9をやり直します
  11. コンテナの問題を修正
  12. 必要に応じてエントリポイントを復元し、必要に応じて手順6〜9をやり直します
  13. 必要に応じてクローンを削除します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.