【问题标题】:How to show the run command of a docker container如何显示 docker 容器的运行命令
【发布时间】:2015-12-21 21:44:12
【问题描述】:

我使用第三方 GUI(Synology Docker 包)来设置 docker 容器。但是,它的限制使我需要从命令行运行容器。 (我想映射另一个主机ip来绑定端口)

现在,由于已经完成了很多设置,我想检索启动这个容器的原始运行命令,然后我可以将端口映射端口更改为新的。例如。 "docker run -p 80:8080 gitlab"

我找不到这样做的方法,事件使用“docker inspect”,没有提供此类信息。

请提供一些建议来解决这个问题。

【问题讨论】:

  • @capitalistpug 这个问题与这个问题完全相反——它是关于 inside 容器的命令,这是关于用于 launch 的命令容器。
  • 历史 | grep 'docker run'
  • 令人惊奇的是 Docker 没有内置的选项。
  • @AdrianMay 啊,是的,posix 来救场了。

标签: docker


【解决方案1】:

那么如何逆向工程 docker run 命令呢?

有一个 github 存储库尝试对 docker run 命令进行逆向工程,但目前还不完善,版本为0.1.2。您应该按照它进行更新。也许有一天你可以用它来获得正确的运行命令。

$ sudo pip install runlike

# run the ubuntu image
$ docker run -ti ubuntu bash

$ docker ps -a  
# suppose you get the container ID 1dfff2ba0226

# Run runlike to get the docker run command. 
$ runlike 1dfff2ba0226
docker run --name=elated_cray -t ubuntu bash

Github 仓库:runlike

更新:

无需安装即可运行(感谢@tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro \
    assaflavie/runlike YOUR-CONTAINER

或设置别名并将其放入您的 shell 的配置文件中

alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro assaflavie/runlike"

docker ps

runlike YOUR-CONTAINER

【讨论】:

  • 在 Synology DSM 上设置 runlike 有点困难,但我会尝试一下。谢谢!
  • 我不得不使用 sudo pip install runlike
  • 运行如下:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
  • 谢谢@Tilo。在我的 Synology NAS 上工作就像一个魅力。
  • 为了安全起见,最好以只读方式挂载docker.sock,即:alias runlike="docker run --rm -v/var/run/docker.sock:/var/run/docker.sock:ro assaflavie/runlike"
【解决方案2】:

使用docker inspect:

$ docker inspect foo/bar
[
    {
        # …
        "Config": {
            # …
            "Cmd": [
                "/usr/local/bin/script.sh"
            ],
            # …
        }
    }
]

您可以使用jq 以编程方式解析它:

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh

【讨论】:

  • 是的,我也更喜欢 jq,对命令稍作调整(更容易输入和阅读恕我直言)是:docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
  • "Cmd": null, 也许这只有在容器没有作为 docker 守护进程自动启动的情况下才有效?
  • 这显示了在容器启动时启动的 CMD。绝对不是问什么。
【解决方案3】:

我编写了一个简单的基于节点的 CLI 工具来从现有容器生成 docker run 命令。

https://www.npmjs.com/package/rekcod

这是一个例子:

$ npm i -g rekcod
$ rekcod redis_container

docker run -d --name redis_container --restart always -h a44159e148e1 \
--expose 6379/tcp -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e REDIS_VERSION=3.0.7 -e REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.7.tar.gz \
-e REDIS_DOWNLOAD_SHA1=e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c \
--entrypoint "/entrypoint.sh" redis "redis-server"

还处理链接和挂载的卷和其他东西。

目前还不是超级健壮,但比提到的其他一些事情处理得更多,这正是我想要的。

编辑: 在单个命令中,无需安装任何软件:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container

【讨论】:

  • 不错的工具。另一种选择(在 Python 中)是runlike。 (不过我自己更喜欢 NodeJS,假设功能相同)
【解决方案4】:

更简单的 (?) 替代方法是运行 this docker inspect template,它使用内置的 Go 模板功能输出 docker run 兼容命令。该模板仅涵盖最常用的命令行选项,但可以轻松扩展。

此解决方案不依赖于其他工具,除了 docker 本身。

docker inspect \
  --format "$(curl -s https://gist.githubusercontent.com/efrecon/8ce9c75d518b6eb863f667442d7bc679/raw/run.tpl)" \
  name_or_id_of_your_running_container

【讨论】:

  • 这个答案需要更多的支持,这真的是最好的解决方案!
【解决方案5】:

使用以下命令获取所有容器的参数:

docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)

【讨论】:

  • 这列出了运行 inside 容器的命令和参数,而不是容器的启动方式(即回答您在此之后 4 分钟发布 runlike 答案的问题!: ) ).
【解决方案6】:

目前看来我们必须去 'docker inspect' 然后手动重新创建运行命令。

我发现有人试图编写一个 bash 脚本来执行此操作: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

但它是不完整的,取决于 jq。

【讨论】:

    【解决方案7】:

    如果您不想在当前运行的 Docker 服务器设置中安装任何东西,您可以简单地执行(将 $CONTAINER_NAME 替换为您想要运行参数的容器名称):

    docker run -it --rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache nodejs nodejs-npm && npm i -g rekcod && rekcod $CONTAINER_NAME"
    

    (对于rekcod method

    docker run -it --rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache py-pip && pip install runlike && runlike $CONTAINER_NAME"
    

    (对于runlike method

    【讨论】:

    • 我认为-it--rm之间应该有一个空格
    • @IpsRich 你是对的,我已经修改了我的答案,谢谢!
    【解决方案8】:

    更简单(稳健)的选项是使用bash-preexec 之类的东西来捕获以“docker run”开头的命令。然后,您可以将这些命令存储在某处并稍后检索它们。

    例如,您可以在 bash 配置文件中添加类似这样的内容:

    [[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
    docker_run_history=~/.docker_run_history
    docker_clear_history(){
        echo -n > $docker_run_history
    }
    docker_search_history(){
        search_for="$@"
        [[ -z $search_for ]] && search_for=".*"
        \cat $docker_run_history | grep "$search_for" | tail -1
    }
    docker_ps_mod(){
        for c in $(docker ps --format "{{.Image}}"); do 
            echo "Container $c was run using:"
            echo -e "\t$(docker_search_history $c)"
        done
    }
    docker_hook(){
        if [[ $@ =~ ^"docker run".*$ ]]; then
            \echo "$@" >> $docker_run_history 
        fi
    }
    preexec(){ 
        docker_hook $@
    }
    

    然后你就可以运行你的东西了:

    source ~/.bash_profile
    docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
    docker run -d daemon
    docker_ps_mod
    

    哪些输出:

    Container image was run using:
        docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
    Container daemon was run using:
        docker run -d daemon
    

    【讨论】:

    • 有趣的选择。 +1
    • docker 不记录命令历史并且有这样一个简单的管道是荒谬的。
    • 有趣。但是使用“图像”名称似乎有点奇怪,因为多个容器可能使用相同的图像。是否可以使用docker run ... 命令返回的值来取回容器的名称?
    【解决方案9】:

    Dockerfile 或任何其他 docker 相关文档中未指定 docker run 命令。

    您可以在与容器相关联的文档中找到一个示例,或者您可以推断 docker run 使用(至少对于命令和端口映射)docker ps -a(但这不会为您提供可能的@987654323 @选项)

    也检查/usr/syno/etc/packages/Docker-GitLab/config

    这与gitlab config itself, which on Synology 的不同之处在于/usr/syno/etc/packages/Docker/synology_gitlab.config

    【讨论】:

    • 感谢您提及 Synology Docker 的配置文件位置。但是配置不能提供更多帮助。它的内容与从 Web UI 导出容器非常相似。
    【解决方案10】:

    要反转 docker run 命令,还有以下 npm 包。

    https://github.com/nexdrew/rekcod

    【讨论】:

    • 哈哈.. docker in reverse ==> rekcod
    • @Macindows 只是巧合。 ;)
    【解决方案11】:

    所有 docker 文件都在这里,例如,您可以找到 cmd 和 mounts ls -la /proc/1 猫就行了

    cat /proc/1/cmdline
    nginx: master process nginx -g daemon off;
    

    【讨论】:

      【解决方案12】:

      正如@Chris_Lamb 所述,您可以使用 docker inspect 来查看此内容以及更多内容。 以下是如何将此信息加载到 python 字典:

      import subprocess,json
      im_inspect = subprocess.check_output(["docker", "image", "inspect", "datalab-nginx-ui"])
      # print(im_inspect.decode("utf-8") ) #if you want to print it
      d_inspect = json.loads(im_inspect)
      d_inspect
      d_inspect[-1]['ContainerConfig']['Cmd']
      

      示例运行:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-21
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        相关资源
        最近更新 更多