shell转换为Docker容器后如何编辑文件?

Igo*_*nov 456 docker

我使用成功炮击了Docker容器

docker exec -i -t 69f1711a205e bash
Run Code Online (Sandbox Code Playgroud)

现在我需要编辑文件,里面没有任何编辑器:

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:/#
Run Code Online (Sandbox Code Playgroud)

如何编辑文件?

Opa*_*pal 648

在注释中,没有默认的编辑器设置 - 奇怪 - $EDITOR环境变量是空的.您可以使用以下命令登录容器:

docker exec -it <container> bash
Run Code Online (Sandbox Code Playgroud)

并运行:

apt-get update
apt-get install vim
Run Code Online (Sandbox Code Playgroud)

或者使用以下Dockerfile:

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]
Run Code Online (Sandbox Code Playgroud)

Docker镜像被传送到最低限度 - 因此没有与装运容器一起安装编辑器.这就是为什么需要手动安装它的原因.

编辑

我也鼓励你阅读关于这个主题的帖子.

  • 和docker一样,最好安装`vim-tiny`. (30认同)
  • 我需要以root身份登录才能完成这个工作`docker exec -u 0 -it container_name bash`. (11认同)
  • 你需要的是安装一个卷:https://docs.docker.com/userguide/dockervolumes/ (3认同)
  • 我只是想在容器中将一个配置从true更改为false.由于容器内的权限问题,`apt-get`无法正常工作,所以我尝试了`sed -i's/texttobechanged/textwanted/g'filename`.它对我有用. (3认同)
  • 也许你可以考虑不在你附加的每个容器中安装一个编辑器,而只是在docker主机上安装一次.正如其他评论员提到的那样你可以挂载卷,所以你可以编辑要挂载的文件,或者导航到容器数据本身并编辑`/ var/lib/docker /中的文件. (2认同)

hko*_*ong 373

如果您不想仅仅为了进行一些小的更改而添加编辑器(例如,更改Tomcat配置),您可以使用:

docker cp <container>:/path/to/file.ext .
Run Code Online (Sandbox Code Playgroud)

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

docker cp file.ext <container>:/path/to/file.ext
Run Code Online (Sandbox Code Playgroud)

替换旧文件.

  • @Igor这应该是公认的解决方案,因为这是正确的方法,无需向容器中添加额外的包,而添加包应该是一个辅助解决方案. (18认同)
  • 你对生产有什么建议?人们应该在生产中以交互方式编辑容器中的文件吗? (8认同)
  • 对于 Windows 平台,您可以使用,例如:`docker cp &lt;container&gt;:C:\inetpub\wwwroot\Web.config .` 和 `docker cp Web.config &lt;container&gt;:C:\inetpub\wwwroot\Web。配置`。 (3认同)
  • 值得一提的是,此方法会更改文件所有权。稍后可以通过以root身份进入容器(`docker exec -u 0 -it mycontainer bash`)然后运行“ chown”命令来将其更改回来。 (3认同)

小智 79

您可以使用cat它是否已安装,如果它不是裸/原始容器,则很可能就是这种情况.它可以在紧凑的情况下工作,在本地复制+粘贴到适当的编辑器时可以.

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

cat将在接收换行时输出每一行.确保为最后一行添加换行符.ctrl-c发送SIGINTfor cat以优雅地退出.

另一种选择是infilter使用一些ptrace魔法将进程注入容器命名空间:https://github.com/yadutaf/infilter

  • `ctrl + D`优于`ctrl + C`.`ctrl + D`发送'EOF`.您最后不需要添加额外的换行符.使用`ctrl + C`,如果您忘记添加换行符,您将丢失最后一行! (15认同)
  • 还可以 cat &gt;&gt; 文件来追加而不是删除以前的内容。 (5认同)
  • 如果存在注入许可问题,这将非常有用! (3认同)

Mat*_*hew 51

要使Docker镜像保持较小,请不要安装不必要的编辑器.您可以通过SSH从Docker主机编辑文件到容器:

vim scp://remoteuser@containerip//path/to/document
Run Code Online (Sandbox Code Playgroud)

  • @J.ScottElblein 这需要首先在 Docker 容器上配置 `ssh`。请参阅 https://blog.softwaremill.com/editing-files-in-a-docker-container-f36d76b9613c 。但您通常不希望在容器中安装“ssh”。 (3认同)
  • 谢谢。我想留下这个链接,以更好地解释`vim scp://`[vim.wikia](http://vim.wikia.com/wiki/Editing_remote_files_via_scp_in_vim)。另外,要获取容器的IP地址,可以使用`sudo docker inspect &lt;container_id&gt; | grep“ IPAddress”` (2认同)

sim*_*eco 18

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

另一方面vim使用28.9 MB

我们必须记住,为了apt-get install工作,我们必须做update第一次,所以:

apt-get update
apt-get install vim-tiny
Run Code Online (Sandbox Code Playgroud)

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


小智 16

您可以打开现有文件

cat filename.extension
Run Code Online (Sandbox Code Playgroud)

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

然后删除旧文件

rm filename.extension
Run Code Online (Sandbox Code Playgroud)

或重命名旧文件

mv old-filename.extension new-filename.extension
Run Code Online (Sandbox Code Playgroud)

创建新文件

cat > new-file.extension
Run Code Online (Sandbox Code Playgroud)

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


小智 15

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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用命令查看结果

cat file
Run Code Online (Sandbox Code Playgroud)


小智 13

有时您必须先运行容器root:

docker exec -ti --user root <container-id> /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

apt-get install vim
Run Code Online (Sandbox Code Playgroud)


ynu*_*nux 6

我使用"docker run"(而不是"docker exec"),我在一个禁区,我们无法安装编辑器.但是我在Docker主机上有一个编辑器.

我的解决方法是:将一个卷从Docker主机绑定到容器(https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems),然后在容器外编辑该文件.它看起来像这样:

docker run -v /outside/dir:/container/dir
Run Code Online (Sandbox Code Playgroud)

这主要用于实验,后来我在构建图像时更改了文件.


Dos*_*Dos 6

脱壳到Docker容器后,只需键入:

apt-get update
apt-get install nano
Run Code Online (Sandbox Code Playgroud)


Dav*_*han 5

您可以在主机上编辑文件并快速将其复制到容器内并在其中运行.这是我复制和运行Python文件的单行快捷方式:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py
Run Code Online (Sandbox Code Playgroud)


Shi*_*ang 5

请参阅堆栈溢出问题 sed edit file in place

如果满足以下条件,这将是一个不错的选择:

  1. 要修改大文件,不可能使用cat.
  2. 不允许安装 Vim 或安装时间太长。我的情况是使用 MySQL 5.7 映像,当我想要更改my.cnf文件时,没有vim, vi,并且 Vim 安装时间太长(中国防火墙)。sed图片中提供了,非常简单。我的用法就像

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

    使用man sed或寻找其他教程以了解更复杂的用法。


Aid*_*tin 5

如果您使用 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