将docker scratch容器部署到CloudFoundry PaaS

将docker scratch容器部署到CloudFoundry PaaS,docker,cloud-foundry,paas,Docker,Cloud Foundry,Paas,我正在尝试将Docker映像部署为关键的CloudFoundry应用程序 我的映像不包含Linux发行版,只包含一个运行我的web应用程序的二进制文件。这是它的整个文件系统: drwxr-xr-x 0:0 502 kB ├─⊕ etc -rwxr-xr-x 0:0 25 MB └── service 当我将它推送到CloudFoundry时,它崩溃了: [API/1] OUT Process has crashed with type: "

我正在尝试将Docker映像部署为关键的CloudFoundry应用程序

我的映像不包含Linux发行版,只包含一个运行我的web应用程序的二进制文件。这是它的整个文件系统:

drwxr-xr-x         0:0     502 kB  ├─⊕ etc
-rwxr-xr-x         0:0      25 MB  └── service
当我将它推送到CloudFoundry时,它崩溃了:

[API/1] OUT Process has crashed with type: "web"
[API/1] OUT App instance exited with guid f334fc62-fc66-4d77-80bd-39a213ebbac2 payload: 
{"instance"=>"fabd4f14-902b-4970-51d0-845d", "index"=>0,
"cell_id"=>"67d596a0-891f-4969-b305-cbaeaa144481", "reason"=>"CRASHED",
"exit_description"=>"exec failed: container_linux.go:346: starting container process caused \"exec: \\\"sh\\\": executable file not found in $PATH\"",
"crash_count"=>3, "crash_timestamp"=>1587646358111493168,
"version"=>"c30771cb-38ab-4691-83fc-ec6996dc537f"}
该错误提示有东西正试图运行
sh

如果我检查崩溃的应用程序,它的启动命令是
/service
,正如预期的那样。这应该只是运行二进制文件,而不是shell。(编辑:尽管出于某种原因,其中有一个尾随空格,但我不确定这是否重要)

编辑:我的Dockerfile的入口点部分如下所示:

# … earlier layers omitted

FROM scratch
COPY --from=build /etc/ssl               /etc/ssl
COPY --from=build /project/build/service /service
EXPOSE 8080
ENTRYPOINT ["/service"]

是的,它需要Docker图像中的一些内容:

  • Docker映像必须包含一个/etc/passwd文件,其中包含根用户的条目
  • 映像文件系统中必须存在该根用户的主目录和shell
  • Docker映像文件系统层的总大小不得超过应用程序的磁盘配额

  • 参考资料:

    是的,它需要从Docker图像中提取一些内容:

  • Docker映像必须包含一个/etc/passwd文件,其中包含根用户的条目
  • 映像文件系统中必须存在该根用户的主目录和shell
  • Docker映像文件系统层的总大小不得超过应用程序的磁盘配额

  • 参考资料:

    您的
    Dockerfile
    看起来像什么(特别是
    CMD
    ENTRYPOINT
    指令)?当您在本地运行映像时,它是否成功运行?我在问题中添加了Dockerfile的一部分。是的:如果我只运行
    docker
    图像,它会按预期启动
    /service
    二进制文件。谢谢。我很好奇你是不是在用
    ENTRYPOINT
    而不是
    CMD
    ,你就是这样,所以我没有主意了。希望有CF经验的人会路过。您的
    Dockerfile
    是什么样子的(尤其是
    CMD
    ENTRYPOINT
    指令)?当您在本地运行映像时,它是否成功运行?我在问题中添加了Dockerfile的一部分。是的:如果我只运行
    docker
    图像,它会按预期启动
    /service
    二进制文件。谢谢。我很好奇你是不是在用
    ENTRYPOINT
    而不是
    CMD
    ,你就是这样,所以我没有主意了。希望有CF经验的人会路过。谢谢。不知道我怎么错过了那一页。谢谢。不知道我怎么会错过那一页。
    $ cf curl /v2/info | jq -r .build
    2.6.19-build.6
    
    # … earlier layers omitted
    
    FROM scratch
    COPY --from=build /etc/ssl               /etc/ssl
    COPY --from=build /project/build/service /service
    EXPOSE 8080
    ENTRYPOINT ["/service"]