docker 的 hello-world 这种运行完就退出的容器,有什么方法进去看看? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
shijingshijing
V2EX    程序员

docker 的 hello-world 这种运行完就退出的容器,有什么方法进去看看?

  •  
  •   shijingshijing 2022-08-09 18:04:16 +08:00 4705 次点击
    这是一个创建于 1160 天前的主题,其中的信息可能已经有所发展或是发生改变。

    体积这么小,纯粹比较好奇想进去看看。

    今天尝试了一下,不管是 attach 还是 exec 好像都不行。

    30 条回复    2022-08-10 16:18:12 +08:00
    registerrr
        1
    registerrr  
       2022-08-09 18:07:17 +08:00
    你想看啥?里边有啥东西 dockerfile 不都写着了么
    ryanbuu
        2
    ryanbuu  
       2022-08-09 18:10:28 +08:00
    docker run -it image
    Vegetable
        3
    Vegetable  
       2022-08-09 18:13:16 +08:00
    它本身就一层一条命令,所以小。

    docker run -it --rm hello-world sh
    Nitroethane
        4
    Nitroethane  
       2022-08-09 18:18:30 +08:00 via iPhone
    用 Go 写一个项目,然后静态编译。写 dockerfile 的时候 from 指定 scratch ,然后把编译得到的静态链接的二进制文件扔进去,这样就得到了一个非常精简的镜像
    Noicdi
        5
    Noicdi  
       2022-08-09 18:23:03 +08:00
    我有一个想法,用 hello-world 镜像做底,写 dockerfile ,带一个不断 sleep 的脚本,然后拉起来,再进去看看
    mxT52CRuqR6o5
        6
    mxT52CRuqR6o5  
    &nbp;  2022-08-09 18:23:27 +08:00
    -it
    hwdef
        7
    hwdef  
       2022-08-09 18:27:40 +08:00
    @Noicdi hello-world 镜像那么小,可能都没有 sleep 命令,进去的话也是要 shell 的。。可能都没有 shell
    lovelylain
        8
    lovelylain  
       2022-08-09 18:29:39 +08:00 via Android
    想看什么?看里面有哪些文件的话可以 docker cp 或者 export
    Noicdi
        9
    Noicdi  
       2022-08-09 18:33:13 +08:00
    @hwdef 是的,我用 sh 和 bash 试了半天拉不了
    然后去找了 hello-world 的官方,他们好像是直接写了二进制文件?

    FROM scratch
    COPY hello /
    CMD ["/hello"]

    https://github.com/docker-library/hello-world/tree/master/amd64/hello-world
    shijingshijing
        10
    shijingshijing  
    OP
       2022-08-09 19:29:30 +08:00
    -it 不行的,自己试一下就知道了。官方的 dockerfile 里面只有一个底包,然后 CMD ["/hello"],这个 /hello 应该是编译好的二进制文件,直接执行。

    其实我的初衷是已经执行了 docker run hello-world ,这时候生成了一个 dc73aabc215 的 container ,我能有什么办法再进这个 container 里面去完成一些操作,比如把这个二进制的 hello 拷贝出来,或者添加一个 shell 脚本让 hello 循环跑几次? attach 和 exec /bin/bash 好像都不行。
    Belmode
        11
    Belmode  
       2022-08-09 19:29:45 +08:00
    copy 一个 busybox 到容器里
    rrfeng
        12
    rrfeng  
       2022-08-09 19:54:20 +08:00
    这玩意里面根本没有 shell ,进不去的。

    scratch 直接加二进制文件,整个镜像其实就只有你那个 hello-world 程序,没什么好看的。

    但是可以附加一个调试容器到运行中的容器上,共享一下 ns ,就能用调试容器的工具去调试它了。
    可以参考 kubectl debug ...
    kkocdko
        13
    kkocdko  
       2022-08-09 21:07:04 +08:00
    bing 搜索 “docker shell”,第一条 stackoverflow 就是正确答案。我看了下第二条的文章更简洁: https://www.baeldung.com/ops/docker-container-shell

    总结就是如下命令,新建一个基于 ubuntu 的容器,进入容器的 bash:
    sudo docker rename $(sudo docker run --network=host -h docker -d ubuntu tail -f /dev/null) hi
    sudo docker exec -it hi bash
    kkocdko
        14
    kkocdko  
       2022-08-09 21:08:24 +08:00
    哦上边已经有人提到了,scratch 没有任何东西,也没有 core-utils ,那就别折腾了呗。
    shijingshijing
        15
    shijingshijing  
    OP
       2022-08-09 21:46:51 +08:00
    @kkocdko
    结果:

    docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "tail": executable file not found in $PATH: unknown.

    你给的那个例子里面 image 是 ubuntu ,应该能跑起来。hello-world 这个起不来,有点意思。。。

    我最后还有一个思路,把 hello-world 生成的 container 重新 build 成一个 image ,然后在这个 image 基础上,加一层 fs ,跑一下 /bin/bash
    shijingshijing
        16
    shijingshijing  
    OP
       2022-08-09 21:48:09 +08:00
    @Belmode #11 提到的 busybox 估计也是可以的,毕竟自带一套完整的装备。
    cctv6
        17
    cctv6  
       2022-08-09 22:24:10 +08:00
    `docker history hello-world`
    镜像里面只有一个可执行文件,用`docker run --rm -it hello-world sh`当然执行不了,执行 CMD 的前提是镜像里面有对应的文件。

    类似 golang 打包后,只有一个可执行文件,就可以用这个可执行文件基于 scratch 制作成一个镜像。
    Dockerfile:

    FROM scratch
    COPY abcd /abcd
    CMD abcd

    这样最后的效果和 hello-world 一样。
    cctv6
        18
    cctv6  
       2022-08-09 22:30:06 +08:00
    还有一种情况,当 dockerfile 里面使用 ENTRYPOINT 指定启动脚本时,再使用`docker run -it image:tag bash` 的时候,这里的 bash 会被认为是 ENTRYPOINT 的参数,这个时候如果要进入容器内,就需要:`docker run -it --entrypoint /bin/sh image:tag` 进入容器,用--entrypoint 覆盖原来 dockerfile 里面的 entrypoint 。
    littlewing
        19
    littlewing  
       2022-08-09 22:46:41 +08:00
    直接说你到底想干啥?只是好奇还是想实现某些功能?
    xiaon
        21
    xiaon  
       2022-08-10 08:24:46 +08:00 via iPhone
    强行改变容器启动后的运行命令,一定是要工作在前台的都行,比如 sleep 600 ,让它睡眠 600 秒
    pepesii
        22
    pepesii  
       2022-08-10 09:35:04 +08:00
    这个是个精简镜像,里头只有 hello 这个二进制可执行文件吧,说 sleep 和通过交互式 tty 的都不行的;
    体较小的原因是因为从 stractch 镜像来的,它的代码在这儿 https://github.com/docker-library/hello-world
    justNoBody
        23
    justNoBody  
       2022-08-10 09:41:58 +08:00
    docker run -d --entrypoint sh IMAGE_ID -c "ping 127.0.0.1"

    如果没有 ping ,就试试其他可以一直循环执行的命令
    debuggerx
        24
    debuggerx  
       2022-08-10 09:44:26 +08:00   1
    shijingshijing
        25
    shijingshijing  
    OP
       2022-08-10 10:30:08 +08:00
    @debuggerx #24 这个工具不错,有点意思,收藏了。

    上面不管是-it, sleep, ping 都没有用的,基础镜像是 scratch 就真的是啥都没有。
    krly0912
       26
    krly0912  
       2022-08-10 14:49:03 +08:00
    容器内需要有一个进程一直在运行才可以,不然会直接退出。把最后的`/bin/bash`替换为`/usr/sbin/init`
    yujinchn
        27
    yujinchn  
       2022-08-10 15:01:32 +08:00   1
    运行这句 tail -f /dev/null
    jwenjian
        28
    jwenjian  
       2022-08-10 15:39:32 +08:00 via Android
    dive
    xiaon
        29
    xiaon  
       2022-08-10 15:50:39 +08:00
    因为这个镜像里面没有可用的 shell ,所以没法连接到容器里面,我试了下,可以这样,你把 busybox 镜像的 /bin 目录拷贝到你的宿主机上,再使用 Dockerfile 基于 hello-world 镜像,将 /bin 目录拷贝到 hello-world 镜像中的 / 目录下(bin 目录本身也要拷贝),做一个新的镜像,比如叫 hello-world2 ,这样你就可以基于 hello-world2 镜像启动一个容器,同时可以使用 -it sh 连接到容器中,其实镜像里面也没什么,主要就是一个主程序 /hello 脚本
    guanzhangzhang
        30
    guanzhangzhang  
       2022-08-10 16:18:12 +08:00
    这个镜像里没 rootfs 阿,没有任何 shell 和命令,你真要搞就不应该用基础镜像是 scratch 的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1349 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:46 PVG 00:46 LAX 09:46 JFK 12:46
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86