当我使用shell进入Docker容器后,如何编辑文件?

802

我使用以下命令成功连接到了一个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:/#

如何编辑文件?


1
@Opal 我使用的是 confluent/postgres-bw:0.1。 - Igor Barinov
2
@Opal apt-get install vim 可以使用。谢谢! - Igor Barinov
4
为什么不创建一个 Dockerfile 并包含 apt-get install 命令来生成你自己的容器呢?Docker 容器就是这样设计的,不是按照你的方式。 - BMW
4
Docker应该至少安装在测试编辑器上,至少默认安装vim。 - Bawantha
2
运行以下命令在容器中安装“nano”$ apt-get update $ apt-get install nano - Naveed Jamali
我是新手,我发现你也可以使用vim修改docker之外的文件。 - Siwei
24个回答

1058

根据评论中的内容,没有设置默认编辑器 - 很奇怪 - $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镜像被精简到了最基本的要素 - 因此在容器中不会安装任何编辑器。这就是为什么需要手动安装它的原因。

编辑

我还鼓励您阅读我的有关该主题的文章


7
您需要的是挂载卷:https://docs.docker.com/userguide/dockervolumes/ - Opal
37
为了完成这个任务,我需要以根用户登录,使用命令 docker exec -u 0 -it container_name bash - Eng.Fouad
59
与Docker一样,最好安装 vim-tiny - ryenus
3
也许你可以考虑不在每个容器上安装编辑器,而是仅在Docker主机上安装一次。正如其他评论者所提到的,你可以挂载卷,这样你就可以编辑即将挂载的文件,或者导航到容器数据本身,并在/var/lib/docker/中编辑文件。 - Pitt
8
我只想将容器中的一个配置从“true”更改为“false”。由于容器内部权限问题,无法使用“apt-get”,因此我尝试使用“sed -i 's/texttobechanged/textwanted/g' filename”命令。这对我起作用了。 - Amreesh Tyagi
显示剩余11条评论

698

如果你不想添加编辑器来进行少量更改(例如,更改Tomcat配置),你可以使用:

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

这将把文件复制到您的本地机器(当前目录)。然后使用您喜欢的编辑器在本地编辑该文件,然后执行

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

替换旧文件。


57
@Igor 这实际上应该是被接受的解决方案,因为这是在不向容器添加额外包的情况下完成它的正确方法,而添加包应该是一种次要的解决方案。 - Routhinator
7
对于 Windows 平台,例如可以使用 docker cp <container>:C:\inetpub\wwwroot\Web.config .docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config - Rosberg Linhares
1
很好的解决方案,适用于测试目的!但我不建议在生产环境中这样做。 - Michal Sipek
13
您建议在生产环境中如何操作?人们是否应该在容器内交互式地编辑文件? - lucid_dreamer
10
值得注意的是,这种方法会改变文件的所有权。稍微有点麻烦,但可以通过在容器内以root身份进入(docker exec -u 0 -it mycontainer bash),然后运行 chown 命令来将其更改回来。 - Steve Chambers
显示剩余2条评论

168

如果已经安装了 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 信号以正常退出 cat 命令。 从评论中您可以看到,也可以使用 ctrl-d 表示文件结尾("没有更多的输入")。

另一种选择是类似于 infilter 的方法,该方法通过一些 ptrace 魔法将进程注入到容器名称空间中:https://github.com/yadutaf/infilter


6
如果存在安装权限问题,这将非常有用! - Roman
25
ctrl+Dctrl+C 更好。ctrl+D 发送一个 EOF,你不需要在结尾添加额外的换行符。使用 ctrl+C 时,如果忘记添加换行符,你将丢失最后一行! - wisbucky
1
@wisbucky 不错!甚至更好。可能需要按两次ctrl-d。 - meijsermans
4
可以使用 "cat >> 文件名" 来追加内容而不会删除先前的内容。 - Rodrigo Amaral
@egvo 我建议将原始文件的输出保存在某个地方(本地或远程),然后在完成工作后再将其替换回来。一旦使用该命令编辑了文件,我相信是无法恢复的。 - undefined
显示剩余2条评论

66
为了使你的Docker镜像更小,请勿安装不必要的编辑器。你可以通过SSH从Docker主机对容器中的文件进行编辑:

为了使您的 Docker 镜像保持小巧,不要安装不必要的编辑器。您可以通过 SSH 从 Docker 主机对容器中的文件进行编辑:

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

3
谢谢。我想留下这个链接,它更好地解释了 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.inivim scp://remoteuser@172.17.0.17//data/gitea/conf/app.ini,但两者都只创建了一个新的空文件。 - J. Scott Elblein
6
这需要先在您的Docker容器上配置ssh。请参见https://blog.softwaremill.com/editing-files-in-a-docker-container-f36d76b9613c 。但通常不建议在您的容器中安装ssh - wisbucky

29
你可以使用安装了的 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

真聪明! - Joseph Ishak

26

您可以使用以下方法打开现有文件:

cat filename.extension

复制剪贴板中所有已有的文本。

然后删除旧文件。

rm filename.extension

或者重命名旧文件

mv old-filename.extension new-filename.extension
创建一个新文件。
cat > new-file.extension

然后粘贴剪贴板上复制的所有文本,按Enter键并通过按ctrl+z保存退出。然后就完成了,无需安装任何编辑器。


按下ctrl+z可能会使文件处于繁忙状态。最好在结束时使用ctrl+c/ctrl+d来保存文件。 - undefined

23

对于通用的编辑操作,我更喜欢安装 vivim-tiny),它只使用了 1491 kBnano,它使用了 1707 kB

另一方面,vim 使用了 28.9 MB

我们必须记住,在使用 apt-get install 命令之前,第一次需要执行 update 命令,所以:

apt-get update
apt-get install vim-tiny

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


1
对我来说,这是更简单和更快的解决方案,上述解决方案可能有不下载应用程序的优点,但这是更简单的一个。 - Ivandez

19

有时候你必须先以root用户身份运行容器:

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

然后在容器中安装Vim或其他软件:

apt-get install vim

1
这表示“权限被拒绝”。 - Stepan Yakovenko

10

我使用的是“docker run”(而不是“docker exec”),并且我处于一个不能安装编辑器的受限区域。但是我在Docker主机上有一个编辑器。

我的解决方法是:将一个卷从Docker主机挂载到容器中(https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems),在容器外部编辑文件。操作步骤如下:

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

这主要是为了进行实验,后来在构建图像时我会更改文件。


9
当你进入Docker容器后,只需输入以下命令:
apt-get update
apt-get install nano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接