【问题标题】:How to call gcloud compute instances create-with-container with container entrypoint arguments如何使用容器入口点参数调用 gcloud 计算实例 create-with-container
【发布时间】:2020-01-08 19:10:09
【问题描述】:

我想创建一个带有 python 入口点的compute instance based on a container。入口点需要参数。例如,如果我使用以下命令在本地运行容器:

docker run ${IMAGE_TAG} \
  --arg0=0 \
  --arg1=1

gcloud 命令是什么来创建一个使用提供的参数自动运行入口点的实例?

我尝试了类似以下的操作(在推送容器后),但没有成功。实例已启动,但未从入口点运行。

gcloud compute instances create-with-container \
  ${INSTANCE_NAME} \
  --zone=${ZONE} \
  --machine-type=${INSTANCE_TYPE} \
  --accelerator=${GPU_TYPE} \
  --service-account=default \
  --container-image=${IMAGE_URI} \
  --container-arg="--arg0=0" \
  --container-arg="--arg1=1"

【问题讨论】:

    标签: docker google-cloud-platform google-compute-engine


    【解决方案1】:

    我会问,您的 ENTRYPOINT 是如何在 Dockerfile 中定义的。您使用的是 exec 还是 shell 形式?

    我认为您使用的是 exec 表单,因为在本地运行它时,您只是将两个参数附加到 docker run 命令,并且它们已成功传递。我提到这一点是因为在 shell 表单中定义的ENTRYPOINT 不接受根据docs 传递的参数。

    使用 --container-arg 传递的参数应附加在 ENTRYPOINT 之后,其方式与使用 CMD 设置 ENTRYPOINT 的默认值时类似(有关详细信息,请参阅 this)。

    正如 John Hanley 所提到的,字符串 --arg0=0 将传递给附加到 Dockerfile ENTRYPOINT 的程序,或者传递给 John Hanley 的回答中使用 --container-command 指定的命令。

    我建议检查 Dockerfile 中的 ENTRYPOINT 是如何定义的,以开始排除可能导致此问题的原因。您也可以在创建后立即在 VM 实例中 check your running processes 以查看入口点是如何执行的,例如$ docker exec -it test ps aux.

    【讨论】:

    • 感谢您的回复。我还是有点困惑。这只是一个玩具示例 - 但在示例中,入口点定义为:ENTRYPOINT ["python3", "main.py"],之后没有CMDs。实际参数(甚至有多少参数)也无法提前知道。所以没有 docker,我会使用命令:python3 main.py --arg0=0 --arg1=1 --arg2=2,我只是想重现这个。如果我只打电话给docker run <imagename> --arg0=0 --arg1=1 --arg2=2,它似乎可以正常工作。这只是将“arg0=0 --arg1=1 --arg2=2”作为字符串附加是有道理的
    • 如果我调用docker run <imagename>,那么main.py 运行时不带任何参数。将CMD [] 添加到dockerfile 的末尾然后使用--container-arg="--arg0=0 --arg1=1 --someotherarg=blah" 之类的东西有意义吗?
    • CMD 可用于定义将被docker run 传递的参数覆盖的默认参数,或者在这种情况下使用--container-arg 时。由于我不太确定在使用 gcloud compute instances create-with-container 时如何解析 --container-arg,所以我会坚持先分离每个参数。
    • 我认为我们必须更好地理解--container-arg 的使用如何解析传递的参数。为此,您可以运行 docker exec -it CONTAINER_NAME ps aux 以查看正在运行的 VM 容器中的进程。您可以在此处粘贴输出,您可以按照 John 的建议对您的命令执行此操作,并比较该命令在容器中的运行方式。
    • 容器根本没有在虚拟机上运行。我试着把事情归结为最简单的例子,但仍然没有取得进展。暂时放弃这个。感谢您的尝试
    【解决方案2】:

    通常entrypoint 在您创建容器时在 Dockerfile 中指定。

    要覆盖它,请使用 --container-command--container-arg 参数。

    Passing arguments to the container ENTRYPOINT command

    在您的Dockerfile 中,您指定要运行的程序及其参数,如下所示:

    CMD [ "python", "app.py", "arg1", arg2" ]
    

    要覆盖这些设置:

    gcloud compute instances create-with-container \
      ${INSTANCE_NAME} \
      --zone=${ZONE} \
      --machine-type=${INSTANCE_TYPE} \
      --accelerator=${GPU_TYPE} \
      --service-account=default \
      --container-image=${IMAGE_URI} \
      --containter-command="python"
      --container-arg="app.py" \
      --container-arg="arg1" \
      --container-arg="arg2"
    

    我不确定你想用--arg0=0 完成什么。未更改的字符串将被传递给程序。

    【讨论】:

    • 谢谢。 dockerfile 中的最后一行是ENTRYPOINT ["python3", "main.py"]。没有CMD 行。我正在尝试实现一个容器,该容器可以使用提供的任意数量的任意参数自动执行 main.py。因此,gcloud 命令仅用于复制 docker run ${IMAGE_TAG} --arg=1 --anotherarg=x,其中在调用 gcloud 命令之前不知道 args 的 #、名称和值。我原以为这相当于将--container-args 添加到 gcloud 命令中。我将尝试取出入口点行并使用 gcloud cmd,就像您的示例一样。
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2018-12-23
    • 2019-02-13
    • 2022-12-03
    • 2020-07-18
    相关资源
    最近更新 更多