如何在我shell到Docker容器后编辑文件?

我使用以下命令成功地将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:/#

如何编辑文件?

658525 次浏览

与注释中一样,没有默认的编辑器集-奇怪-$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镜像被修剪到最低限度-所以没有编辑器与交付的容器一起安装。这就是为什么需要手动安装它的原因。

编辑

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

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

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

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

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

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

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

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

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

替换旧文件。

您还可以使用仅包含您需要的命令的特殊容器: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

这样,您就不必更改容器。您只需为这项工作使用一个特殊的容器。

如果安装了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 for cat优雅退出。从注释中你可以看到你也可以按ctrl-d来表示文件结束(“没有更多的输入”)。

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

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

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

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

apt-get install vim

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

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

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

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

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

(更多)

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

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

编辑几行的简单方法是:

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

查看堆栈溢出问题 Sed编辑文件就位

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

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

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

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

在你使用Docker容器后,只需键入:

apt-get update
apt-get install nano

如果您使用Windows容器并且想要更改任何文件,您可以轻松地在Powershell控制台中获取和使用Vim。

若要使用PowerShell将shell添加到Windows Docker容器:

docker exec -it <name> powershell

  • 首先安装Chocolatey软件包管理器

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • 安装Vim

    choco install vim

  • 刷新环境变量 您可以只exit并shell回到容器

  • 转到文件位置并Vim它vim file.txt

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

另一方面,vim使用28.9 MB

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

apt-get update
apt-get install vim-tiny

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

您可以打开现有文件

cat filename.extension

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

然后删除旧文件

rm filename.extension

或重命名旧文件

mv old-filename.extension new-filename.extension

创建新文件

cat > new-file.extension

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

如果安装了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

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

Nano就会像往常一样工作

首次以root身份登录: docker run-u root-ti bash运行日志 键入以下命令: apt-get更新&& apt-get安装nano

docker没有编辑器。所以只需安装vim,36MB空间不要杀死你的docker!

请确保在尝试安装编辑器之前更新容器。

apt-get update
apt-get install nano vi

你可以安装Nano

yum install nano