首页 > 解决方案 > 无法在 docker 容器中使用 vi 或 vim 命令?

问题描述

它是 CentOS 7,已经在我的 CentOS 中安装了 vi 和 vim,我可以使用它们。当我执行以下这一行时,我在 CentOS 中运行 docker:

docker exec -it mysolr /bin/bash

我不能在 solr 容器中使用 vi/vim:

bash: vim: command not found

为什么会这样以及如何修复它以便我可以使用 vi/vim 编辑 docker 容器中的文件?

标签: dockervimcentoscentos7vi

解决方案


一个典型的 Docker 镜像包含一组最小的库和实用程序来运行一个特定的程序。此外,Docker 容器文件系统的寿命并不长:删除和重新创建容器是非常例行的,例如使用更新版本的基础映像。

这样做的结果是你永远不想直接在 Docker 容器中编辑文件,而且大多数图像都没有设置“丰富”的编辑工具。(BusyBox包含一个最小的vi,因此大多数基于 Alpine 的图像也将。)如果您进行一些更改,一旦您删除容器,它就会丢失。(同样,您通常可以安装vimoremacs或其他任何东西,但一旦容器被删除,它就会丢失:在运行的容器中安装软件通常不是最佳实践。)

有两种很好的方法可以解决这个问题,具体取决于它是什么类型的文件。

如果文件是应用程序的一部分,例如源文件,请在 Docker 空间之外对其进行编辑、调试和测试。一旦你确信它是正确的(通过运行单元测试和在本地运行程序),docker build一个带有它的新图像,一个带有新图像docker run的新容器。

ed config.py
pytest
docker build -t imagename .
docker run -d -p ... --name containername imagename
...
ed config.py
pytest
docker build -t imagename .
docker stop containername
docker run -d -p ... --name containername imagename

如果该文件是应用程序启动时需要注入的配置docker run -v,则该选项是一个很好的推入方式。您可以直接在主机上编辑配置文件,但您可能需要重新启动(或删除并重新创建) ) 让其注意到的容器。

ed config.txt
docker run \
  -v $PWD/config.txt:/etc/whatever/config.txt \
  --name containername -p ... \
  imagename
...
ed config.txt
docker stop containername
docker rm containername
docker run ... imagename

推荐阅读