【问题标题】:How run image as daemon in ruby docker-api?如何在 ruby​​ docker-api 中将图像作为守护进程运行?
【发布时间】:2019-11-12 10:28:10
【问题描述】:

我需要docker-api 方法,它可以让我将图像作为守护进程运行。

Docker 命令供参考:docker run -t -d some_image

有人知道解决办法吗?

【问题讨论】:

    标签: ruby-on-rails ruby docker docker-api


    【解决方案1】:

    你不需要做任何特别的事情。在 API 级别,docker run 做了三件事:

    1. creates a new container 包含您指定的大部分选项;
    2. starts the container;和
    3. attaches to the containers's stdin and stdout

    您链接到的 GitHub 项目有一些相当复杂的示例。 (它的API documentation 并没有说太多;例如,Docker::Container 文档大多只是列出了方法,而没有解释可以进入各种散列参数的内容。)如果您创建并启动容器,但不要t附加到它,它将具有docker run -d“在后台”运行容器的相同效果。

    # Lifted from https://github.com/swipely/docker-api
    
    # Create a Container.
    container = Docker::Container.create('Cmd' => ['ls'], 'Image' => 'base')
    
    # Start running the Container.
    container.start
    
    # It is "in the background", unless you specifically #attach to it or
    # #wait for it.
    

    【讨论】:

    • container.start之后我们会得到Exited状态
    • 如果你运行类似ls的东西作为主容器进程,如示例所示,它实际上会快速退出。这等效于docker run -d alpine ls(在标准 Docker Hub 映像中交换),并且出于相同的原因,这将在docker ps -a 输出中显示“Exited (0)”。
    • 抱歉,您可能误解了我的意思。运行容器后我需要一些东西,我可以执行命令。
    • 容器做什么?这应该是它的主要过程;您可能不应该以编程方式尝试在其中执行命令。
    • 为什么不呢?我需要运行来自用户的代码。
    【解决方案2】:

    我找到解决方案:

    container = Docker::Container.create('Cmd' => ["tail", "-f", "/dev/null"], 'Image' => 'some_image')
    
    container.start
    
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS                      PORTS               NAMES
    
    08564fe29591        some_image          "tail -f /dev/null"   20 seconds ago      Up 10 seconds                                   nervous_ardinghelli
    

    容器启动后未退出,可以在这个容器中执行!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 2015-07-12
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      相关资源
      最近更新 更多