是否可以在运行状态下的容器中启动shell会话(不使用ssh)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (108)

我想在运行状态下的容器中运行bashshell:

docker run "id of running container" /bin/bash

但是返回了以下error:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

假设我想在运行状态下的的容器中运行bashshell,那么我必须运行SSH服务器并通过ssh登录吗?

提问于
用户回答回答于

docker exec -it "id of running container" bash文档

假设你处于调试环境中的话,你可以使用该代码:sudo lxc-attach -n <ID>

请注意,id必须是完整的(docker ps -notrunc)

注意:-notrunc将被替换为--no-trunc

用户回答回答于

attach:

$ sudo docker attach 665b4a1e17b6 #by ID

exec:

$ sudo docker exec - -t 665b4a1e17b6 #by ID
用户回答回答于

以下为我的解决方案:

DOckerfile部分:

...
RUN mkdir -p /opt
ADD initd.sh /opt/
RUN chmod +x /opt/initd.sh
ENTRYPOINT ["/opt/initd.sh"]

“initd.sh”部分:

#!/bin/bash
...
/etc/init.d/gearman-job-server start
/etc/init.d/supervisor start
#very important!!!
/bin/bash

在生成图像之后,你可以使用exec和 attach两个选项:

  1. 使用exec,运行以下代码:

docker exec -it $CONTAINER_NAME /bin/bash

然后:

CTRL+D to detach

  1. 使用attach,运行以下代码:

docker run --name $CONTAINER_NAME -dit $IMAGE_NAME

然后:

docker attach $CONTAINER_NAME

并且使用CTRL+P and CTRL+Q to 来辨别在参数-i之间选项的区别

用户回答回答于

在容器中有一个shell的方法。

假设你通过/root/run.sh启动进程、进程管理(supervisor)或其他任何内容。

可以通过gnu-screen来创建/root/runme.sh

# Spawn a screen with two tabs
screen -AdmS 'main' /root/run.sh
screen -S 'main' -X screen bash -l
screen -r 'main'

现在你的daemons在表0中,交互式shell在表1中,可以通过docker attach来观察在容器中发生的事情。

还有另一个建议是在产品映像的基础上创建一个“开发包”映像,并提供所有必要的工具,包括这个屏幕技巧。

用户回答回答于

注意以下请求:https://github.com/docker/docker/put/7409

docker exec <container_id> <command>命令如果是可用的,那么应该可以启动和停止运行中的容器中的ssh服务。

nsinit提供了一种方便的方式来访问正在运行的容器名称空间内的shell,但看起来很难运行。

https://gist.github.com/ubergarm/ed42ebbea293350c30a6

用户回答回答于

首先你不能运行以下代码:

docker run "existing container" command

因为命令需要返回的是图像而不是容器,并且无论如何它都会导致一个新容器的产生。

我在DAEMON模式下通过管理员运行我的命令。

然后我执行了docker_loop.sh,代码如下:

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done

它的作用是允许你“附加”到容器上,并与supervisorctl接口来停止/启动/重新启动并检查日志。 如果这还不够,你可以通过Ctrl + D来进入shell,让你可以像正常的系统一样。

不过需要考虑到这个系统不像没有shell的容器那么安全,所以请采取一切必要措施来保护容器。

用户回答回答于
docker attach container_name

可以通过Ctrlpthan Ctrlq来从容器中分离出来。

用户回答回答于

我比较建议使用nsenter来访问正在运行的容器。

GitHub储存库

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

或者你可以使用docker-enter:

docker-enter <container_name_or_ID>

在docker 容器中不运行sshd的原因

用户回答回答于

扫码关注云+社区