这是正常现象:容器只要主进程(PID 1)结束就会立刻退出。很可能是用镜像默认的 ENTRYPOINT/CMD
启动,命令跑完就退出了,所以状态是 Exited。
下面给你一套“查原因 → 重新跑起来”的最短路径(PowerShell 语法):
1) 先看看它为什么退
docker ps -a
docker logs pulsar2_3.3
docker inspect -f '{{json .Config.Entrypoint}} {{json .Config.Cmd}}' pulsar2:3.3
- 如果
Entrypoint/Cmd
是个一次性命令(比如脚本),它执行完就会退出。
2) 交互式重新跑(覆盖入口为 shell)
最省事是删掉已退出的容器,重新以交互式 shell 启动:
docker rm -f pulsar2_3.3
# 优先试 bash,报错再换 /bin/sh
docker run -it --name pulsar2_3.3 `
--platform linux/amd64 `
-v "${PWD}:/work" -w /work `
--entrypoint /bin/bash `
pulsar2:3.3
# 如果提示 /bin/bash: cannot execute 或不存在,改成:
# --entrypoint /bin/sh
进入后你就能在容器里做 pulsar2 的编译/调试了。之后再进容器:
docker start -ai pulsar2_3.3 # 附着到已存在的容器
# 或者容器在跑时开新终端:
docker exec -it pulsar2_3.3 /bin/bash # 或 /bin/sh
3) 想“常驻”再进去(可选)
有些人喜欢先把容器跑成后台常驻,再随时 exec
进去:
docker rm -f pulsar2_3.3
docker run -d --name pulsar2_3.3 `
--platform linux/amd64 `
-v "${PWD}:/work" -w /work `
pulsar2:3.3 tail -f /dev/null
docker exec -it pulsar2_3.3 /bin/sh # 或 /bin/bash
这里用 tail -f /dev/null
让 PID 1 永远不退出。
4) 两个常见坑提醒
- /bin/bash 不存在:很多精简镜像只有
/bin/sh
(BusyBox/ash)。直接换/bin/sh
即可。 - 改动“丢失”:写到容器可写层的东西,删容器就没了。代码要挂载目录(
-v "${PWD}:/work"
);环境变更要写进 Dockerfile 重建镜像,而不是只在容器里手工改。
重新进入
1) 直接退出容器后再进
- 退出:在容器里输入
exit
(容器会停止) - 重新进入:
docker start -ai pulsar2_3.3
2) 不想停容器,只是先离开一会儿
- 在容器里按:Ctrl+P 然后 Ctrl+Q(从 TTY 分离,容器继续跑)
- 再次进入(两种选一):
docker attach pulsar2_3.3 # 回到原来的那个终端
docker exec -it pulsar2_3.3 /bin/bash # 或开一个新的 shell(bash 不在就用 /bin/sh)
3) 关闭 Docker Desktop(或重启系统)后再进
- 先启动 Docker Desktop(Docker 引擎)
- 然后:
docker start -ai pulsar2_3.3
(想让它随 Docker 引擎自动启动,可设重启策略:docker update --restart unless-stopped pulsar2_3.3
)
小贴士:
- 看状态:
docker ps -a
- 代码请继续放在挂载目录里(
-v ...:/work
),容器删了也不丢。 - 如果当初用的是
/bin/sh
作为入口,把上面命令里的bash
换成sh
就行。
文章评论