外壳到Docker容器后如何编辑文件?


516

我成功使用以下方法将其炮击到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可以工作。谢谢!
伊戈尔·巴里诺夫

3
那么为什么不创建Dockerfile并包含apt-get install命令并生成自己的容器呢?Docker容器是按这种方式设计的,而不是您自己的方式。
宝马

1
码头工人应至少在测试编辑器上至少租用vim安装
Bawantha

Answers:


721

就像注释中一样,没有默认的编辑器集-奇怪- $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

15
我需要以root用户身份登录才能完成此操作docker exec -u 0 -it container_name bash
Eng.Fouad

34
与docker一样vim-tiny,可能最好安装它。
ryenus '16

2
也许您可以考虑不在连接的每个容器中安装编辑器,而只在Docker主机上安装一次。正如其他评论员所提到的,您可以装载卷,因此您可以编辑将要装载的文件,或者导航到容器数据本身并在/var/lib/docker/
Pitt

4
我只想在容器中将一种配置从true更改为false。apt-get由于容器内的权限问题而无法正常工作,所以我尝试了sed -i 's/texttobechanged/textwanted/g' filename。它为我工作。
Amreesh Tyagi

420

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

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

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

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

替换旧文件。


21
@Igor实际上应该是公认的解决方案,因为这是正确的方法,无需在容器中添加其他软件包,而添加软件包应该是辅助解决方案。
Routhinator

1
对于Windows平台,可以使用例如:docker cp <container>:C:\inetpub\wwwroot\Web.config .docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config
Rosberg Linhares

1
不错的测试方法!我不建议在生产中这样做。
MichalŠípek'18

9
您对生产有何建议?人们是否应该在生产中以交互方式编辑容器中的文件?
lucid_dreamer

4
值得一提的是,此方法会更改文件所有权。稍后可以通过以root(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发送SIGINTfor cat正常退出。从注释中可以看到,您还可以按ctrl-d来表示文件结尾(“没有更多输入输入”)。

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


3
如果存在注入许可问题,这将非常有用!
罗马,

17
ctrl+D比更好ctrl+Cctrl+D发送EOF。您无需在末尾添加额外的换行符。使用ctrl+C,如果您忘记添加换行符,则将丢失最后一行!
wisbucky

1
@wisbucky不错!更好。可能需要两次ctrl -d。
meijsermans

52

为了使Docker映像较小,请不要安装不必要的编辑器。您可以通过SSH将文件从Docker主机编辑到容器:

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. Scott Elblein '19

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文件的单行快捷方式:

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

1
那如何回答这个问题?- “如何编辑文件?”
彼得·莫滕森

4

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

另一方面vim使用28.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

这有点麻烦,但您可以在紧急情况下使用sedawk进行小的编辑或删除文本。当然要注意正则表达式目标,并要注意root使用容器,并且可能必须重新调整权限。

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

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

(更多)



1

请参阅堆栈溢出问题 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"]

您将可以通过安装Docker卷(src_volume)来编辑数据,该卷将由您的数据容器(src_data)和python-vim容器共享。

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

这样,您无需更改容器。您只需要使用一个特殊的容器即可完成这项工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.