无法在Docker容器内使用vim、vi、nano、yum

33

启动了一个名为nginx的Docker化应用程序,然后在其中执行了bash。令我惊讶的是,在该容器中找不到vim、vi甚至yum。

请原谅我,因为我对Docker非常陌生,正在学习中。

以下命令可用于重现此问题。

docker run -d --name=my_nginxtemp nginx
docker exec -i -t my_nginxtemp bash
docker commit my_nginxtemp my_nginx

我的主机是Ubuntu 16.04,我正在使用最新版的docker-engine和docker cli。

root@jim-Ubuntu1504:/home/jim/web# docker version
Client:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: b9f10c9
Built: Wed Jun 1 22:00:43 2016
OS/Arch: linux/amd64

Server:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: b9f10c9
Built: Wed Jun 1 22:00:43 2016
OS/Arch: linux/amd64
root@jim-Ubuntu1504:/home/jim/web#

请不要访问我的主机名,因为我已经升级到15.04版本以后的系统了 :slight_smile:

root@jim-Ubuntu1504:/home/jim/web# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial
root@jim-Ubuntu1504:/home/jim/web#

非常感谢您的帮助。


今天刚刚发生了这件事!我在一些主题中也看到要更改Dockerfile。我会尝试一下。 - Geiser
可能是如何在进入Docker容器后编辑文件?的重复问题。 - Steve Chambers
5个回答

43

sudo apt-get update
sudo apt-get install vim

我遇到了相同的问题。我按照上面简单的两个步骤做,它就像魔法一样奏效了。


2
@D8Amonk > 这是因为您已经作为root用户登录了。只需删除“sudo”即可。 - Spock

14
令我惊讶的是我在该容器内找不到vimvi甚至yum。 这取决于nginx镜像及其基础镜像:如果未在那里安装vim,则您的容器将无法找到它。 您可以从nginx开始构建自己的镜像,并添加所需的软件
FROM nginx
RUN apt-get update
RUN apt-get install vim

但是这个镜像会有访问互联网的权限吗?比如说,如果你想要安装额外的软件怎么办? 令我惊讶的是,它最终是一个操作系统和Web服务器,为什么不能具备安装软件的能力呢? - learner
@learner,该图像将具有与您的主机相同的互联网访问权限。如果您在代理后面,请使用https://dev59.com/3VsW5IYBdhLWcg3wM0uF#35286398,并确保您的Docker守护程序知道该代理(https://docs.docker.com/engine/admin/systemd/#http-proxy)。 - VonC
不错。我会构建那个镜像!非常感谢。 - learner
1
是的,它具有与主机相同的访问权限。这是因为Docker的桥接网络吗?想要理解一下。 - learner
是的,这就是 https://docs.docker.com/engine/userguide/networking/dockernetworks/ 中详细说明的内容。 - VonC
@ VonC,你的答案好像缺少一两个RUN :-) - user2915097

11

对于像我这样的初学者,添加更多的描述: 有些容器是基于Ubuntu构建的,因此您甚至找不到特定于RedHat/CentOS的yum包管理器。

1. 使用exec命令进入容器:

username@hostname:/home/username $ docker container exec -it container_image_name bash

2. 确定容器镜像所构建的操作系统并相应地采取措施 现在,为了确定容器镜像是在哪个操作系统上构建的,我们可以在进入该容器后使用以下命令检查操作系统版本:

root@5e9d0e3c1001:/# cat /etc/*release*
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
root@5e9d0e3c1001:/#

然后执行以下操作(我们进行更新的原因是在第一次安装之前这是必需的):

root@5e9d0e3c1001:/# apt-get update
root@5e9d0e3c1001:/# apt-get install vim

参考文献:https://forums.docker.com/t/cannot-use-vim-vi-nano-yum-inside-docker-container/14905

无法在Docker容器中使用vim、vi、nano和yum的原因是因为这些工具在容器内部没有安装。要在Docker容器中使用它们,需要使用以下命令安装:
  • 使用以下命令安装vi:yum install vim
  • 使用以下命令安装nano:yum install nano
  • 一旦安装,你就可以在Docker容器中使用这些工具了。

    在管理员权限下运行容器,甚至启用所有能力,都存在安全风险。安全服务器也具有物理隔离功能,因此安装将因此原因而失败。 - mirekphd

    7

    这是我们最后的编辑器:

    echo "This is a workaround." > file.txt
    echo "Added more text." >> file.txt
    cat file.txt
    

    2
    你可以创建一个Dockerfile来使用nginx Docker镜像,并根据你的需要进行修改...
    FROM nginx
    RUN ["apt-get","update"]
    RUN ["apt-get","install","-y","vi"]
    

    1
    找不到 vi 软件包,只能使用 vim - Daniel Node.js
    1
    所以运行["apt-get", "install", "-y", "vim"]。 - KatyGB

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接