【问题标题】:Running gcloud run deploy from inside Cloud Build results in error从 Cloud Build 内部运行 gcloud run deploy 会导致错误
【发布时间】:2020-09-11 07:55:39
【问题描述】:

我在 Google Cloud Build 中有一个自定义构建步骤,它首先构建一个 docker 映像,然后将其部署为云运行服务。

最后一步失败,日志输出如下;

第 2 步:部署... 第 2 步:设置 IAM 政策.........完成 步骤 2:创建修订................................................................ ..................................................... ............................失败的 步骤#2:部署失败步骤#2:错误:(gcloud.run.deploy)云 运行错误:无效参数错误。入口点无效。 [姓名: “gcr.io/opencobalt/silo@sha256:fb860e758eb1957b90ff3761fcdf68dedb9d10f832f2bb21375915d3de2aaed5” 步骤#2:错误:“无效命令\”/bin/sh\”:找不到文件”步骤#2: ]。已完成步骤 #2 错误错误:构建步骤 2 “gcr.io/cloud-builders/gcloud”失败:步骤以非零值退出 状态:1

构建步骤如下所示;

["run","deploy","silo","--image","gcr.io/opencobalt/silo","--region","us-central1","--platform", "托管","--allow-unauthenticated"]}

该映像是在注册表中构建的,如果我更改最后一个构建步骤以部署计算引擎 VM,则它可以工作。这些构建步骤如下所示;

{"name":"gcr.io/cloud-builders/gcloud","args":["compute","instances", "create-with-container","silo","--container-image","gcr.io/opencobalt/silo","--zone","us-central1-a","--tags", "筒仓,法罗"]}

我也可以在本地构建映像,但在本地运行 gcloud run deploy 时遇到相同的错误。

我正在试图弄清楚如何解决这个问题。该映像工作正常,因为它在本地运行良好,并且在部署为 Compute Engine 虚拟机时运行良好,因此该错误仅在我尝试将映像部署为 Cloud Run 服务时出现。

(添加)Dockerfile 看起来像这样;

######################################
# Based on Ubuntu image
######################################
FROM ubuntu

######################################
# Basic project infos
######################################
LABEL maintainer="PeterSvensson"

######################################
# Update Ubuntu apt and install some tools
######################################
RUN  apt-get update \
  && apt-get install -y wget \
  && apt-get install -y git \
  && apt-get install -y unzip \
  && rm -rf /var/lib/apt/lists/*

######################################
# Have an own directory for the tool
######################################
RUN mkdir webapp
WORKDIR webapp

######################################
# Download Pharo using Zeroconf & start script
######################################
RUN wget -O- https://get.pharo.org/64/80+vm | bash

COPY service_account.json service_account.json
RUN export certificate="$(cat service_account.json)"
COPY load.st load.st
COPY setup.sh setup.sh
RUN chmod +x setup.sh
RUN ./setup.sh; echo 0

RUN ./pharo Pharo.image load.st; echo 0

######################################
# Expose port 8080 of Zinc outside the container
######################################
EXPOSE 8080

######################################
# Finally run headless as server
######################################
CMD ./pharo --headless Pharo.image --no-quit

热烈欢迎任何建议。 谢谢。

【问题讨论】:

  • 在您的问题中包含 Dockerfile。错误消息表明 /bin/sh 不存在,这对于一些非常剥离的图像是正确的。
  • 谢谢。我现在添加了 Dockerfile。我首先省略它的原因是为了简洁,并且在将映像部署到 Compute Engine 时它​​运行良好。另外,我没有在其中使用 /bin/sh,所以它似乎是云运行部署过程的产物。但我不确定,这有点神秘,这个。
  • 你在这里使用它:RUN ./setup.sh; echo 0
  • 我认为它是一个无需显式调用 /bin/sh 即可运行的脚本(顺便说一句,它包含在标准 Ubuntu 中)。但我确实删除了这个文件并运行它,最终结果是一样的。请注意,镜像构建并存在于注册表中,并且可以作为容器引擎 VM 服务运行,在发送请求时返回值。只有特定的云运行构建步骤会产生错误。即使在我删除任何对 setup.sh 的提及后,同样的错误也会再次发生。
  • ./pharo 程序/脚本是什么?

标签: google-cloud-platform cloud google-cloud-build google-cloud-run


【解决方案1】:

另见:

Unable to deploy Ubuntu 20.04 Docker container on Google Cloud Run

我的解决方法是使用直接调用 Python 而不是 shell(/bin/sh 或 /bin/bash)的 CMD 指令。到目前为止,它运行良好。

【讨论】:

    【解决方案2】:

    Google Cloud Run 似乎不喜欢 ubuntu:20.04 映像。我在 Play 框架应用程序中遇到了完全相同的问题。

    命令

    ENTRYPOINT /opt/play-codecheck/bin/play-codecheck -Dconfig.file=/opt/codecheck/production.conf
    

    失败

    error: "Invalid command \"/bin/sh\": file not found"
    

    我也试过

    ENTRYPOINT ["/bin/bash", "/opt/play-codecheck/bin/play-codecheck", "-Dconfig.file=/opt/codecheck/production.conf"]
    

    并获得奖励

    error: "Invalid command \"/bin/bash\": file not found"
    

    将命令放入 shell 脚本的技巧对我也不起作用。但是,当我改变时

    FROM ubuntu:20.04
    

    FROM ubuntu:18.04
    

    部署的图像。在这一点上,这对我来说是一个可以接受的解决方案,但它似乎是 Google 需要解决的问题。

    【讨论】:

      【解决方案3】:

      经过大量测试,我设法走得更远。似乎 /bin/sh 丢失文件的事情是一个红鲱鱼。

      我尝试将启动命令从 CMD 更改为 ENTRYPOINT,因为错误中提到了这一点,但它不起作用。但是,当我将启动指令复制到一个新文件'startup.sh'并将Dockerfile的最后一行更改为;

      入口点 ./startup.sh

      确实有效。我当然需要 chmod +x 新文件,但奇怪的是 ENTRYPOINT ./pharo --headless Pharo.image --no-quit 给出了同样的错误,甚至 ENTRYPOINT ["./pharo", "- -headless", "Pharo.image", "--no-quit"] 也给出了同样的错误。

      但是只有一个 ENTRYPOINT 参数可以让云运行工作。去图吧。

      【讨论】:

      • 唷。比那更复杂。这就是正常工作的方法,不知道为什么在计算引擎进程没有的情况下,云运行对 Dockerfile 细节如此挑剔;入口点 ["./pharo"] CMD ["--headless", "Pharo.image", "--no-quit"]'
      • Cloud Run 在 CMD/ENTRYPOINT 方面与 Docker 没有什么不同。请首先在本地运行您的容器,如cloud.google.com/run/docs/testing/local 所示,以测试它是否可以在 Cloud Run 上运行。
      • 嗨,艾哈迈德,感谢您的评论。我同意不应该这样。我目前的发现是; 1)我可以很好地在本地构建和运行我的容器,2)我可以使用 google cloud build 很好地构建图像,并作为一个单独的构建步骤将其部署为计算引擎 VM(它也可以在那里运行良好),3)对于一些原因 Cloud Run 专门只接受 ENTRYPOINT 并使用特定的括号语法 ["foo","bar,..]。这与几个月前有所不同。
      • 这听起来不对。我用它所有的时间。当你不使用方括号时,“docker”就是在它周围添加 /bin/sh -c “...”的那个。如果您有一个小型复制品,请随意链接。
      • 我也遇到了这个问题。它在用作本地 Cloud Run 模拟器的 skaffold/minikube 中工作,因此 Cloud Run 有一些问题。
      猜你喜欢
      • 2023-02-03
      • 1970-01-01
      • 2019-11-15
      • 2021-03-03
      • 2020-06-15
      • 2021-09-16
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多