首页 > 解决方案 > “oc new-app”虽然输入图像不暴露端口

问题描述

我正在探索 OpenShift 3.9,并设法构建并运行了第一个容器以及oc new-appDocker 构建策略。我的 Dockerfile 包含命令EXPOSE 5432

在 rolloutoc describe istag/my_app:latest | grep ^Exposes报告之后Exposes Ports: 5432/tcp,看起来不错:镜像暴露了 5432 端口。但是oc describe po/my_app-1-some_id | grep "^\s*Port"报告了Port: <none>,所以总的来说,似乎端口暴露在 Docker 级别,但还没有暴露在 Kubernetes/OpenShift 级别。

OpenShift 文档说明如下:

new-app 命令尝试检测输入图像中暴露的端口。它使用最小数字公开端口来生成公开该端口的服务。为了暴露不同的端口,在 new-app 完成后,只需使用 oc expose 命令生成额外的服务。

为什么oc new-app在这种情况下不公开端口 5432(实际上它也不会创建任何service资源),我怎样才能让它自动这样做,因为输入图像已经这样做了,并且从文档中看来是可能的?

更新以下是有关如何创建新应用程序的更多详细信息:

oc new-app ssh://my_account@my_git_server/my_path/my_repo.git
  --context-dir=my_dir --strategy=docker --name my_app

Git 存储库包含一个到目前为止微不足道的my_dir/Dockerfile内容,而它又包含命令EXPOSE 5432

标签: dockeropenshift

解决方案


最后,问题“突然”消失了,oc new-app现在确实暴露了端口(如文档所述)。到目前为止,我正在使用这样的微不足道Dockerfile的东西

FROM debian:stretch
EXPOSE 5432

COPY start.sh /usr/local/bin/start.sh
CMD ["start.sh"]

在哪里startup.sh调用sleep infinity。在解释方面,我只能猜测我犯了一些导致干扰的次要和瞬时错误。

以下是尝试诊断和解决问题时的经验教训(非常感谢@GrahamDumpleton):

  • 如果一切顺利oc new-app,应指明资源的 oc get all端口,还应列出类型为 、、、、和的新 OpenShift(和 Kubernetes)资源。5432/TCPsvc/my_appdeploymentconfigsbuildconfigsbuildsimagestreamsporc
  • 这种自动机制仅在集群内部公开端口,即svc/my_app拥有(并监听)集群IP(不是:外部IP)。
  • 附加参数--dry-run -output json会导致oc new-app进行试运行并打印其通常会创建的资源的准确描述(以 JSON 格式)。

推荐阅读