Dockerコンテナーにシェルした後、ファイルを編集するにはどうすればよいですか?


518

私は正常にDockerコンテナに砲撃しました:

docker exec -i -t 69f1711a205e bash

今私はファイルを編集する必要があり、中にエディタはありません:

root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#

ファイルを編集するにはどうすればよいですか?


@Opal私はconfluent / postgres-bw:0.1を使用
Igor Barinov

2
@Opal apt-get install vimは動作します。ありがとう!
イゴールバリノフ2015年

3
ではDockerfile、apt-get installコマンドを作成してインクルードし、独自のコンテナを生成してみませんか?Dockerコンテナは、あなたのやり方ではなく、このように設計されています。
BMW

1
docker

回答:


725

コメントのように、デフォルトのエディターセットはありません-奇妙です- $EDITOR環境変数は空です。次の方法でコンテナにログインできます。

docker exec -it <container> bash

そして実行します:

apt-get update
apt-get install vim

または、次のDockerfileを使用します。

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

Dockerイメージは最小限にトリミングされて配信されるため、出荷されたコンテナにはエディタはインストールされません。手動でインストールする必要があるのはそのためです。

編集

また、トピックに関する私の投稿を読むことをお勧めします。


3
必要なのはボリュームのマウントです:docs.docker.com/userguide/dockervolumes
Opal

16
これを行うには、rootとしてログインする必要がありましたdocker exec -u 0 -it container_name bash
Eng.Fouad

34
dockerと同様vim-tinyに、おそらく代わりにインストールする方が良いでしょう。
ライナス

2
おそらく、接続する各コンテナーにエディターをインストールするのではなく、Dockerホストマシンに一度だけインストールすることを検討できます。他のコメンテーターが述べたように、ボリュームをマウントできるため、マウントされるファイルを編集したり、コンテナーデータ自体に移動してファイルを編集したりできます/var/lib/docker/
Pitt

4
コンテナーの1つの構成をtrueからfalseに変更したかっただけです。apt-getコンテナー内の権限の問題により機能していなかったので、試してみましたsed -i 's/texttobechanged/textwanted/g' filename。それは私のために働いた。
Amreesh Tyagi 2018

421

いくつかの小さな変更(たとえば、Tomcat構成の変更)を行うためだけにエディターを追加したくない場合は、次のように使用できます。

docker cp <container>:/path/to/file.ext .

ローカルマシン(現在のディレクトリ)にコピーします。次に、お気に入りのエディターを使用してローカルでファイルを編集し、次に

docker cp file.ext <container>:/path/to/file.ext

古いファイルを置き換えます。


21
@Igorこれは、パッケージをコンテナに追加せずにそれを行う適切な方法であるため、実際に受け入れられるソリューションである必要がありますが、パッケージの追加はセカンダリソリューションでなければなりません。
Routhinator 2017年

1
Windowsプラットフォームの場合は、たとえばdocker cp <container>:C:\inetpub\wwwroot\Web.config .、およびを使用できますdocker cp Web.config <container>:C:\inetpub\wwwroot\Web.config
Rosberg Linhares 2017

1
テスト目的のための素晴らしい回避策!本番環境での使用はお勧めしません。
MichalŠípek2018年

9
そして、あなたは生産のために何をお勧めしますか?本番環境でコンテナ内のファイルをインタラクティブに編集する必要がありますか?
lucid_dreamer

4
このメソッドはファイルの所有権を変更することに注意してください。可能ですが、ルート(docker exec -u 0 -it mycontainer bash)としてコンテナーに移動してchownコマンドを実行することで、後で変更することは少し手間がかかります。
スティーブチェンバーズ

91

catインストールされている場合は使用できます。これは、ベア/ローコンテナーでない場合に最も当てはまります。それはピンチで機能し、ローカルで適切なエディターにコピーして貼り付けても問題ありません。

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

cat改行を受け取ると各行を出力します。最後の行には必ず改行を追加してください。ctrl-cはSIGINT for catをて正常に終了します。コメントから、ctrl-dを押してファイルの終わりを示すこともできます(「これ以上入力はありません」)。

別のオプションはinfilter、いくつかのptraceマジックでコンテナー名前空間にプロセスを注入するようなものです:https : //github.com/yadutaf/infilter


3
点眼許可の問題がある場合、これは非常に便利です!
ローマ

17
ctrl+Dより良いですctrl+Cctrl+Dを送信しEOFます。最後に改行を追加する必要はありません。でctrl+C、改行を追加し忘れると、最後の行が失われます。
wisbucky 2017年

1
@wisbuckyいいね!さらに良いです。ただし、Ctrl + Dキーを2回押す必要がある場合があります。
meijsermans 2017年

52

Dockerイメージを小さく保つために、不要なエディターをインストールしないでください。DockerホストからコンテナにSSH経由でファイルを編集できます。

vim scp://remoteuser@containerip//path/to/document

2
ありがとうございました。vim scp:// vim.wikiaをよりよく説明するこのリンクを残したいと思いました。また、あなたのコンテナのIPアドレスを取得するには、あなたが使用することができますsudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
疑問に思って、文字通り「remoteuser」または「docker」を使用しますか?私は試してみました:vim scp://docker@172.17.0.17//data/gitea/conf/app.ini同様にvim scp://remoteuser@172.17.0.17//data/gitea/conf/app.ini、両方とも新しい空のファイルを作成します。
J.スコットエルブレイン

1
@ J.ScottElbleinこれを行うsshには、最初にdockerコンテナーを構成する必要があります。blog.softwaremill.com/…を参照してください。しかし、一般的にはsshコンテナーにインストールしたくありません。
wisbucky

14

いつか最初にコンテナを実行する必要がありますroot

docker exec -ti --user root <container-id> /bin/bash

次に、コンテナで、Vimまたは他の何かをインストールします。

apt-get install vim

7

「docker run」(「docker exec」ではなく)を使用していますが、エディターをインストールできない制限付きゾーンにいます。しかし、私はDockerホストにエディターを持っています。

私の回避策は、Dockerホストからコンテナーにボリュームをバインドマウントし(https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems)、コンテナーの外側でファイルを編集します。次のようになります。

docker run -v /outside/dir:/container/dir

これは主に実験用で、後でイメージを構築するときにファイルを変更します。


6

Dockerコンテナにシェルした後、次のように入力します。

apt-get update
apt-get install nano

6

あなたは既存のファイルを開くことができます

cat filename.extension

そして、既存のテキストをすべてクリップボードにコピーします。

次に、古いファイルを削除します

rm filename.extension

または古いファイルの名前を

mv old-filename.extension new-filename.extension

で新しいファイルを作成

cat > new-file.extension

次に、クリップボードにコピーされたすべてのテキストを貼り付け、を押して、を押してEnter、保存して終了しますctrl+z。また、どんなエディタもインストールする必要はありません。


5

ホストでファイルを編集し、すばやくコピーしてコンテナ内で実行できます。Pythonファイルをコピーして実行するための1行のショートカットを次に示します。

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py

1
それはどのようにして質問に答えますか?- 「ファイルを編集するにはどうすればよいですか?」
Peter Mortensen

4

一般的な編集操作では、1491 kBのみを使用するか、1707 kBを使用するインストールvivim-tiny)を好みます。nano

一方vim28.9 MBを使用しますます。

が機能するためapt-get installにはupdate、初めて実行する必要があることを覚えておく必要があります。

apt-get update
apt-get install vim-tiny

CLIでエディターを起動するには、と入力する必要がありますvi


2

Windowsコンテナーを使用していて、ファイルを変更したい場合は、PowershellコンソールでVimを簡単に取得して使用できます。

PowerShellを使用してWindows Dockerコンテナーにシェル化するには:

docker exec -it <name> powershell

  • 最初にChocolateyパッケージマネージャーをインストールする

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • Vimをインストールする

    choco install vim

  • 環境変数を更新exitするコンテナにシェルバックするだけです

  • ファイルの場所に移動してVimで vim file.txt


1

それはちょっと厄介ですが、ピンチで使用しsedたりawk、小さな編集を行ったり、テキストを削除したりできます。もちろん、正規表現のターゲットに注意してくださいroot。コンテナを使用している可能性が高く、権限を再調整する必要がある場合があることに注意してください。

たとえば、正規表現に一致するテキストを含む行全体を削除します。

awk '!/targetText/' file.txt > temp && mv temp file.txt

(もっと)


1

数行を編集する簡単な方法は次のとおりです。

echo "deb http://deb.debian.org/debian stretch main" > sources.list

1

Stack Overflowの質問 sed編集ファイルを所定の場所に表示する

次の場合は、このオプションが適しています。

  1. 大きなファイルを変更するには、を使用することはできませんcat
  2. Vimのインストールが許可されていないか、時間がかかりすぎます。私は変更したいときに私の状況は、MySQL 5.7の画像を使用しているmy.cnfファイルを、そこにはありませんvimviあまりにも長い(中国グレートファイアウォール)、およびVimがインストールされます。sed画像で提供されており、非常に簡単です。私の使い方は

    sed -i /s/testtobechanged/textwanted/g filename

    man sedより複雑な使用法については、他のチュートリアルを使用するか探してください。


1

cat装着すれば、>キャラ付きでお使いいただけます。ここに操作があります:

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

これで、コマンドで結果を確認できます

cat file

0

必要なコマンドのみが含まれる特別なコンテナーVimを使用することもできます。私はpython-vimを選びました。編集するデータは、次のDockerfileで構築されたデータコンテナーにあると想定しています。

FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user \
            -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
            --uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]

データコンテナー(src_data)とpython-vimコンテナーで共有されるDockerボリューム(src_volume)をマウントすることで、データを編集できます。

docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest

そうすれば、コンテナを変更する必要はありません。この作業には特別なコンテナを使用するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.