使用Docker启动容器时不指定命令的方法

36
我熟悉LXC并想尝试使用docker。我的问题是,我找不到一种方法只告诉docker在后台启动容器,而不执行命令。例如,使用LXC,我会执行以下操作: lxc create -t ubuntu -n my_container lxc-start -n my_container -d 此时,我将拥有一个运行中的容器,可以像任何虚拟机一样使用它(ssh到它,安装东西...)。 看起来docker阻止了这种用法。我错过了什么吗?
4个回答

56

当我需要检查一个由我创建的Docker容器时,如果该容器无法正常运行Dockerfile中的CMD命令,我会将该命令注释掉,并替换为"sleep"命令以便在容器启动时暂停它,以便我可以登录并检查安装过程。

Dockerfile中:

CMD ["sleep","3600"]

登录正在运行的 Docker 实例:

docker exec -i -t <Container ID> bash

2
感觉这样做很傻,但效果很好。除了它在一个小时后毫不客气地把你踢出去!我现在使用 sleep infinity - Heath Raftery
1
对于没有 sleep 命令的容器,您可以使用此命令:https://hub.docker.com/r/refstudycentre/scratch-base - rudolfbyker
3
我对Docker还很陌生,但我不确定我理解这样做的好处。无论您在Dockerfile中使用什么CMD,您都可以使用“docker container run -it”从该镜像创建一个交互式容器。<image/> /bin/bash` 那么为什么需要sleep命令呢? - guibar
@rudolfbyker:Scratch-base 看起来非常有用,但是当我使用 docker run -d theimage:v1 时,出现了这个错误 docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "sleep": executable file not found in $PATH: unknown. - Nav
“theimage:v1”是什么?这在我的Docker 20.10.2上可以运行:docker pull refstudycentre/scratch-base; docker run refstudycentre/scratch-base - rudolfbyker
显示剩余2条评论

20
使用Docker,从CLI命令行不能在不运行命令的情况下创建容器。 如果要使用REST API,则可以调用“create”端点而无需“start”。
但我认为这对你来说不会有太大帮助。
在大多数情况下,您可能只想运行一个bash容器docker run -t -i ubuntu bash并在其中执行操作。一旦完成所有需要的操作,就可以简单地提交并从此刻开始运行。
通常,为了保持清晰的历史记录,最好一步一步操作。看一下Docker builder :)

谢谢! 他们必须在“容器化”操作系统上下了强有力的功夫!! 在容器中运行ps -ef命令,只输出我的进程。你知道他们是如何做到的吗? - rmonjo
这是PID命名空间。 - creack

2

1
命令参数根据文档确实是可选的,但是 docker run -d b750fe79269d 报错 "未指定命令"。 - rmonjo
1
@rmonjo 当 Dockerfile 中没有指定 CMD 时,您会收到该错误。只需在 docker run 的末尾添加您想在容器内运行的内容即可。例如 bash。 - Filippo Vitale

1
在我自己尝试操作时,我想再加入一些想法。
假设我想要使用3个Docker容器进行工作:
blong@mycomputer:~$ docker run --name ubuntuContainer1 -itd ubuntu 
2ce602710fb9b84b6530e5a1072961627e91731aba8f8b019f346fc78df08d7c
blong@mycomputer:~$ docker run --name ubuntuContainer2 -itd ubuntu 
e32b0eb72456fc23222f3915c91afc77e06a7e37a073b11f7088fabe8fa4bf20
blong@mycomputer:~$ docker run --name ubuntuContainer3 -itd ubuntu 
40574f704dceb0378f48ebe01d014d598434093d649be13573911d9833d9825d

即使我没有明确要求运行/bin/bash,也要确保它们继续运行。

blong@mycomputer:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
40574f704dce        ubuntu              "/bin/bash"         2 seconds ago       Up 1 seconds                            ubuntuContainer3
e32b0eb72456        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            ubuntuContainer2
2ce602710fb9        ubuntu              "/bin/bash"         8 seconds ago       Up 7 seconds                            ubuntuContainer1

我可以进入容器

blong@mycomputer:~$ docker attach ubuntuContainer1
root@2ce602710fb9:/# 

我可以在容器中执行命令(例如安装软件包)

root@2ce602710fb9:/# apt-get update

# ... omitting output

root@2ce602710fb9:/# apt-get install nodejs
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  libc-ares2 libv8-3.14.5
The following NEW packages will be installed:
  libc-ares2 libv8-3.14.5 nodejs
0 upgraded, 3 newly installed, 0 to remove and 5 not upgraded.
Need to get 1912 kB of archives.
After this operation, 7538 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y

# ... omitting output

Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
root@2ce602710fb9:/# nodejs --version
v0.10.25

接着,我可以通过按下CTRL-p CTRL-q退出,同时保持一切正常运行。

root@2ce602710fb9:/# blong@mycomputer:~/$ 
blong@mycomputer:~/$ 

另请参阅:


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