【问题标题】:How can I keep docker container running?如何保持 docker 容器运行?
【发布时间】:2017-08-02 12:45:03
【问题描述】:

我想自动运行多个容器并创建一些东西,

但有些图像,例如swarm,在运行或启动后会自动停止。

我已经这样尝试了

docker run -d swarm

docker run -d swarm /bin/bash tail -f /dev/null

docker run -itd swarm bash -c "while true; do sleep 1; done"

但是 'docker ps' 什么也没显示,我尝试通过键入以下内容来构建 Dockerfile:

FROM swarm
ENTRYPOINT ["echo"]

并且图像无法运行并显示错误消息:

docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"echo\\\": executable file not found in $PATH\"\n".

我无法理解这个错误...如何保持 swarm 容器运行...?

(对不起,我的英语不好))

【问题讨论】:

    标签: docker containers


    【解决方案1】:

    首先,您不想混合使用-i-d 开关。您希望以交互或分离模式运行容器。在您的情况下处于分离模式:

    docker run -d swarm /bin/bash tail -f /dev/null
    

    也不需要使用-t 标志分配tty,因为这只需要在交互模式下完成。

    你应该看看Docker run reference

    【讨论】:

    • docker ps 仍然没有显示任何内容。我必须研究更多关于 docker run 的信息。谢谢你:)
    • @haeney - 你的容器启动并运行了吗?
    • 是的。其他容器如 nginx、Ubuntu 和 redis 运行良好,但 swarm 会在运行的同时终止。
    【解决方案2】:

    推荐使用-d,因为你可以只用一个命令来运行你的容器,并且你不需要通过按Ctrl + P + Q来分离容器的终端。

    但是,-d 选项有问题。 除非命令不在前台运行,否则您的容器会立即停止。 Docker 要求您的命令保持在前台运行。否则,它会认为您的应用程序停止并关闭容器。

    问题是某些应用程序没有在前台运行。

    在这种情况下,您可以将 tail -f /dev/null 添加到您的命令中。 通过这样做,即使您的主命令在后台运行,您的容器也不会停止,因为 tail 一直在前台运行。

    docker run -d swarm tail -f /dev/null

    docker ps 显示容器

    现在您可以使用 docker exec container_name 命令

    附加您的容器

    docker run -d swarm command tail -f /dev/null

    【讨论】:

    • 如你所说,我尝试了这个命令,但容器仍然无法继续运行。如果可能,您能否确认当 swarm 映像使用该命令运行时,容器的显示在 docker ps 中?我想检查我的服务器是否奇怪......在等待答案的同时,我使用 Dockerfile 做了一个简单的测试并收到了一条错误消息。我已经更新了帖子,希望您可以参考它来解决这个问题。感谢您继续关注解决我的问题
    【解决方案3】:

    Docker 容器执行两种类型的任务。一种是执行并退出,另一种是在后台运行。

    要在后台运行 docker 容器,选项很少。

    1. 使用 shell 运行。 docker run -it <image> /bin/bash
    2. 用于连续运行的容器。 docker run -d -p 8080:8080 <image>。假设图像将暴露端口 8080 并处于侦听模式。

    【讨论】:

      【解决方案4】:

      尾随 /dev/null 没问题,但为什么不让它做一些有用的事情呢?

      以下命令将获取孤儿进程,因此不会留下任何僵尸(已失效)进程。还有一些 init.d / restart 脚本不允许这样做。

      exec sh -c 'while true ;do wait ;done'
      

      【讨论】:

        【解决方案5】:

        你是对的docker run -itd swarm(没有为容器提供参数(bash -c“while true; do sleep 1; done”))工作正常。如果你传递 docker run 的参数它将运行命令并终止容器。如果要永久运行容器,首先使用 docker run -itd swarm 启动容器,然后通过 docker ps 现在容器运行了,如果你想在容器中执行任何命令,请使用 docker exec -itd container_name 命令 记住:只使用不停止容器的命令。 bash -c "while true; do sleep 1; done 这个命令将停止容器(因为这是一个完整的命令,如果我们在普通终端执行它执行并终止,这种类型的命令也会终止容器)。

        我希望这会有所帮助..

        【讨论】:

        • 我的代码步骤是这样的: 1. 无命令运行图像 (docker run -itd swarm) 2. 检查 'docker ps' 3. 如果容器没有运行,3-1 删除容器和图像使用命令运行 (docker run -itd swarm bash ...) 所以,不使用命令运行映像没有任何效果....
        【解决方案6】:

        基本上这是方法,但是您的 docker 映像是 swarm,所以它是不同的,我不知道 swarm docker 映像,我没有使用它。但是在我研究之后。首先我运行它显示的 docker swarm 图像。,

        之后我知道我们只使用图片中的五个命令来运行 docker swarm image,比如创建、列表管理、加入、帮助。如果我们在没有 docker run -itd swarm 之类的命令的情况下运行 swarm 映像,它会将命令作为 --help 。对不起,但我不知道群体图像的目的是什么。更多用法请查看https://hub.docker.com/_/swarm/

        我添加的答案 docker run -itd image tail -f /dev/null 不适用于 swarm image,它适用于 ubuntu、fedora、centos 等 docker 镜像。

        只需阅读 swarm image 的用法以及使用它的原因。

        如果您有任何问题,请在https://github.com/docker/swarm-library-image/issues 中发布您的问题

        谢谢...

        【讨论】:

        • 我也不知道Swarm的用处。因为我的目的是从explore页面获取大量的图片信息并自动拉取运行。但由于 Swarm 是一个特例,我将继续下一步.. 只是有点恶心 :( 无论如何,谢谢 ^^
        猜你喜欢
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 2014-11-04
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多