通常,如果您通过连接到 docker 实例,docker exec
您会进入类似sh
或 之类的非常原始的东西ash
。
如果你想要更好的东西,你必须自己在 docker 实例上安装它。
然而,如果我看对了——我想要从 shell 中得到的只是执行二进制文件,并可能重定向 stdin 和 stdout。 shell 是否不可能存在于我的主机上,具有pwd
docker 容器的权限,并且可以访问 docker 容器和我的主机的二进制文件?
这纯粹是为了开发/调试,所以如果我必须禁用安全功能来实现这一点,这是可以接受的。
这很容易做到吗?如果没有,那么主要障碍是什么?
答案1
如果我正确理解你的问题,那么你想要在 docker 容器中使用与主机系统中相同的 shell 和相同的配置。
你确实可以通过使用体积来耦合它们,但是要使其 100% 正确地工作将是困难和混乱的。我强烈建议安装它并从您的主机复制配置。
假设您的主机上用作shell,并且您想要使用从基于 ubuntu 的bash
映像创建的容器。foo:latest
在这种情况下,您可以创建以下内容Dockerfile
:
FROM foo:latest
RUN apt-get update && apt-get -y install bash
COPY .bashrc /root/.bashrc
COPY .profile /root/.profile
现在:
- 创建一个目录
newimage
.bashrc
将并从您的 homedir复制.profile
到此目录- 转到这个目录并运行
docker build -t foo:withbash
现在您将拥有一个foo:withbash
与 bash 相同的映像foo:latest
,但它也将在您的主机系统上具有 bash 的配置。
(同样的技巧可以用于zsh
其他 shell 和 centos 以及其他发行版,但 Dockerfile 中的命令会略有不同)
编辑: 一些注意事项:
- 在我的 dockerfile 中,我假设您将是容器中的 root(通常是这种情况)。如果您不是此容器的 root 用户,您可能需要更改最后两行,以便将这些文件复制到正确的目录。
- 第二行适用于所有基于 debian、ubuntu 或类似发行版的 dockerimage。
如果它基于 CentOS 或类似的发行版,您会想要:yum -y update && yum -y install bash
如果它基于 Alpine,您会想要RUN apk add --no-cache bash
- 如果你想将 zsh 更改
bash
为zsh
第 2 行和第 3 行