我如何在 shell 到 Docker 容器后编辑文件?
How do I edit a file after I shell to a Docker container?
我成功地使用了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:/#
如何编辑文件?
如评论中所述,没有设置默认编辑器 - 奇怪 - $EDITOR
环境变量为空。您可以使用以下命令登录容器:
docker exec -it <container> bash
和运行:
apt-get update
apt-get install vim
或使用以下Docker文件:
FROM confluent/postgres-bw:0.1
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]
Docker 交付的图像被裁剪到最低限度 - 因此没有随交付的容器安装任何编辑器。这就是为什么需要手动安装它的原因。
编辑
我也鼓励您阅读我的 post 关于这个主题。
我使用 "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。它假定您要编辑的数据位于使用以下 Docker 文件构建的数据容器中:
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
,您可以使用它,如果它不是 bare/raw 容器,则很可能是这种情况。它在紧要关头工作,当复制+粘贴到本地适当的编辑器时没问题。
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 来表示文件结尾 ("no more input coming")。
另一个选项类似于 infilter
,它使用一些 ptrace 魔法将进程注入容器名称空间: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
有点麻烦,但在紧要关头,您可以使用 sed
或 awk
进行小的编辑或删除文本。当然要小心您的正则表达式目标,并注意您可能 root
在您的容器上并且可能需要重新调整权限。
例如,删除包含与正则表达式匹配的文本的整行:
awk '!/targetText/' file.txt > temp && mv temp file.txt
(More)
您只需在主机上编辑您的文件,然后快速将其复制到容器中并 运行 即可。这是我复制和 运行 一个 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
查看 Stack Overflow 问题
sed edit file in place
这将是一个不错的选择,如果:
- 修改大文件,无法使用
cat
。
不允许安装 Vim 或安装时间太长。
我的情况是使用MySQL 5.7镜像,当我想更改my.cnf
文件时,没有vim
、vi
和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
对于常见的编辑操作我更喜欢安装vi
(vim-tiny),它只使用1491 kB 或 nano
使用 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
如果你只能 shell 进入带有 bin/sh 的容器(以防 bin/bash 不起作用)
并且 apt 或 apt-get 在容器中不起作用,请通过在容器内的命令提示符中输入 apk 来检查是否安装了 apk。
如果是,您可以按如下方式安装 nano:
apk 添加 nano
然后 nano 将照常工作
我同意应该接受@hkong 的回答,因为它避免了向容器中添加额外的包。但是,我发现将修改后的文件粘贴到容器中后,其中一些容易出现访问受限,导致 docker 守护进程无法启动的情况。在这种情况下,为修改后的文件分配一些权限,然后粘贴到容器中。
首次以 root 登录:
docker 运行 -u root -ti bash
键入以下命令:
apt-get更新&&
apt-get 安装 nano
docker 没有编辑。所以只需安装 vim,36MB space 不要杀死你的 docker!
确保在尝试安装编辑器之前更新容器。
apt-get update
apt-get install nano vi
我成功地使用了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:/#
如何编辑文件?
如评论中所述,没有设置默认编辑器 - 奇怪 - $EDITOR
环境变量为空。您可以使用以下命令登录容器:
docker exec -it <container> bash
和运行:
apt-get update
apt-get install vim
或使用以下Docker文件:
FROM confluent/postgres-bw:0.1
RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]
Docker 交付的图像被裁剪到最低限度 - 因此没有随交付的容器安装任何编辑器。这就是为什么需要手动安装它的原因。
编辑
我也鼓励您阅读我的 post 关于这个主题。
我使用 "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。它假定您要编辑的数据位于使用以下 Docker 文件构建的数据容器中:
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
,您可以使用它,如果它不是 bare/raw 容器,则很可能是这种情况。它在紧要关头工作,当复制+粘贴到本地适当的编辑器时没问题。
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 来表示文件结尾 ("no more input coming")。
另一个选项类似于 infilter
,它使用一些 ptrace 魔法将进程注入容器名称空间: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
有点麻烦,但在紧要关头,您可以使用 sed
或 awk
进行小的编辑或删除文本。当然要小心您的正则表达式目标,并注意您可能 root
在您的容器上并且可能需要重新调整权限。
例如,删除包含与正则表达式匹配的文本的整行:
awk '!/targetText/' file.txt > temp && mv temp file.txt
(More)
您只需在主机上编辑您的文件,然后快速将其复制到容器中并 运行 即可。这是我复制和 运行 一个 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
查看 Stack Overflow 问题 sed edit file in place
这将是一个不错的选择,如果:
- 修改大文件,无法使用
cat
。 不允许安装 Vim 或安装时间太长。 我的情况是使用MySQL 5.7镜像,当我想更改
my.cnf
文件时,没有vim
、vi
和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
对于常见的编辑操作我更喜欢安装vi
(vim-tiny),它只使用1491 kB 或 nano
使用 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
如果你只能 shell 进入带有 bin/sh 的容器(以防 bin/bash 不起作用) 并且 apt 或 apt-get 在容器中不起作用,请通过在容器内的命令提示符中输入 apk 来检查是否安装了 apk。 如果是,您可以按如下方式安装 nano: apk 添加 nano
然后 nano 将照常工作
我同意应该接受@hkong 的回答,因为它避免了向容器中添加额外的包。但是,我发现将修改后的文件粘贴到容器中后,其中一些容易出现访问受限,导致 docker 守护进程无法启动的情况。在这种情况下,为修改后的文件分配一些权限,然后粘贴到容器中。
首次以 root 登录: docker 运行 -u root -ti bash 键入以下命令: apt-get更新&& apt-get 安装 nano
docker 没有编辑。所以只需安装 vim,36MB space 不要杀死你的 docker!
确保在尝试安装编辑器之前更新容器。
apt-get update
apt-get install nano vi