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

时间:2015-06-15 19:15:56

标签: docker

我使用

成功炮击了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:/#

如何编辑文件?

18 个答案:

答案 0 :(得分:587)

在评论中,没有默认编辑器设置 - 奇怪 - $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镜像被剪裁到最低限度 - 所以没有随装运的容器安装编辑器。这就是为什么需要手动安装它的原因。

修改

我也鼓励您阅读关于该主题的post

答案 1 :(得分:335)

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

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

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

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

替换旧文件。

答案 2 :(得分:66)

如果安装了cat,则可以使用cat > file # 1. type in your content # 2. leave a newline at end of file # 3. ctrl-c cat file ,如果它不是裸/原始容器,则很可能就是这种情况。它可以在紧凑的情况下工作,并且可以在本地复制+粘贴到适当的编辑器时使用。

cat

SIGINT会在收到换行符时输出每一行。确保为最后一行添加换行符。 ctrl-c为cat发送infilter以正常退出。

另一个选项类似于FAST,它使用一些ptrace魔法将进程注入容器命名空间:https://github.com/yadutaf/infilter

答案 3 :(得分:49)

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

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

答案 4 :(得分:11)

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

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

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

apt-get install vim

答案 5 :(得分:8)

您可以将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

答案 6 :(得分:6)

我使用&#34; docker run&#34; (不是&#34; docker exec&#34;),我在一个我们无法安装编辑器的限制区域。但是我在Docker主机上有一个编辑器。

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

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

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

答案 7 :(得分:5)

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

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

答案 8 :(得分:3)

您可以使用

打开现有文件
cat filename.extension

,然后将所有现有文本复制到剪贴板上。

然后使用

删除旧文件
rm filename.extension

或使用

重命名旧文件
mv old-filename.extension new-filename.extension

使用

创建新文件
cat > new-file.extension

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

答案 9 :(得分:2)

在对Docker容器进行脱壳之后,只需键入:

apt-get update
apt-get install nano

答案 10 :(得分:1)

编辑几行的简单方法是:

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

答案 11 :(得分:1)

对于常见的编辑操作,我更喜欢安装@reboot export DISPLAY=:0; python3 /path/to/my_server.py vim-tiny ),它仅使用 1491 kB vi,它使用< strong> 1707 kB

另一方面,nano使用 28.9 MB

我们必须记住,为了使vim工作,我们必须第一次进行apt-get install,所以:

update

要在 CLI 中启动编辑器,我们需要输入apt-get update apt-get install vim-tiny

答案 12 :(得分:1)

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

如果出现以下情况,这将是一个不错的选择

  1. 要修改大型文件,无法使用cat
  2. 不允许安装Vim或安装时间太长。 当我想更改my.cnf文件,没有vimvi且Vim的安装时间太长时,我的情况是使用MySQL 5.7映像(China Great Firewall)。图像中提供了sed,非常简单。我的用法就像

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

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

答案 13 :(得分:1)

这有点棘手,但在紧要关头,您可以使用sedawk进行小幅编辑或删除文字。当然要小心你的正则表达式目标,并注意你的容器可能root,可能需要重新调整权限。

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

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

(More)

答案 14 :(得分:0)

如果使用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 file.txt

答案 15 :(得分: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

这样,您就不会更改容器。你只需要使用一个特殊的容器来完成这项工作。

答案 16 :(得分:0)

如果你只能用 bin/sh 进入容器(以防 bin/bash 不起作用) 并且apt或apt-get在容器中不起作用,通过在容器内的命令提示符中输入apk来检查是否安装了apk。 如果是,您可以按如下方式安装nano: apk 添加纳米

然后 nano 会照常工作

答案 17 :(得分:0)

我同意@hkong 的回答应该被接受,因为它避免了向容器添加额外的包。但是,我发现在将修改后的文件粘贴到容器后,其中一些往往会限制访问,从而导致 docker daemon 无法启动。在这种情况下,为修改后的文件分配一些权限,然后粘贴到容器中。