我成功地shell到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:/#

如何编辑文件?


当前回答

参见堆栈溢出问题 Sed编辑文件到位

这将是一个很好的选择,如果:

要修改一个大文件,不可能使用cat。 不允许安装Vim或需要太长时间。 我的情况是使用MySQL 5.7镜像当我想改变My .cnf文件,没有vim, vi, vim安装需要太长时间(中国防火墙)。图像中提供了Sed,非常简单。我的用法是 Sed -i /s/testtobechanged/ texwanted /g文件名 使用man sed或查找其他教程以获得更复杂的用法。

其他回答

有时你必须先用root运行容器:

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

然后在容器中,安装Vim或其他东西:

apt-get install vim

可以打开现有文件

cat filename.extension

并复制剪贴板上所有现有的文本。

然后删除旧文件用

rm filename.extension

或重命名旧文件

mv old-filename.extension new-filename.extension

创建新文件

cat > new-file.extension

然后粘贴剪贴板上复制的所有文本,按Enter键并按ctrl+z退出保存。瞧,不需要安装任何类型的编辑器。

这有点古怪,但在必要时,您可以使用sed或awk进行小的编辑或删除文本。当然,要小心您的正则表达式目标,并注意您可能是容器的根用户,可能需要重新调整权限。

例如,删除包含匹配正则表达式的文本的整行:

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

(更多)

对于常见的编辑操作,我更喜欢安装vi (vim-tiny),它只使用1491 kB或nano,它使用1707 kB。

另一方面,vim使用28.9 MB。

我们必须记住,为了让apt-get安装工作,我们必须在第一时间进行更新,因此:

apt-get update
apt-get install vim-tiny

要在CLI中启动编辑器,我们需要输入vi。

如果安装了cat,您可以使用它,如果它不是一个裸/原始容器,则很可能是这种情况。它的工作在紧要关头,ok时复制+粘贴到一个适当的编辑器本地。

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让cat优雅地退出。从注释中您可以看到,您还可以按ctrl-d来表示文件结束(“没有更多的输入即将到来”)。

另一种选择是类似于infilter的东西,它使用一些ptrace魔法将进程注入容器名称空间:https://github.com/yadutaf/infilter