docker - 如何在接受命令行参数的 kubernetes 上运行 docker 镜像?

标签 docker deployment kubernetes google-kubernetes-engine

我有一个 docker 镜像,其中包含一个 python 文件,该文件使用 sys.stdin() 从命令行接受参数。我可以使用以下命令运行图像

cat file.csv | docker run -i -t my_image



它将 file.csv 的内容通过管道传输到图像,我得到了预期的输出。

现在我想将此镜像部署到 kubernetes。我可以使用 docker 在服务器上运行图像而没有任何问题。但是如果我 curl 到它,它应该会发回响应,但我没有收到它,因为我没有在任何端口上监听的 Web 服务器。我继续使用以下命令构建了一个部署。

kubectl run -i my_deployment --image=gcr.io/${PROJECT_ID}/my_image:v1 --port 8080



它构建了部署,我可以看到 Pod 正在运行。然后我暴露它。

kubectl expose deployment my_deployment --type=LoadBalancer --port 80 --target-port 8080



但是如果我尝试使用使用 curl 分配的 IP 来访问它,

curl http://allocated_ip



我得到一个响应“连接被拒绝”。

如何将此 docker 镜像部署为 kubernetes 上的服务并将文件内容作为输入发送到服务?我需要一个网络服务器吗?

最佳答案

Kubernetes 通常假设它部署的容器是长生命周期和自治的。如果您在 Pod 中部署某些东西,尤其是通过 Deployment,它应该能够在没有任何特定输入的情况下自行运行。如果它立即退出,Kubernetes 将重新启动它,你很快就会陷入可怕的 CrashLoopBackOff状态。

简而言之:您需要重新设计容器以不使用标准输入,标准输出是它的主要接口(interface)。

您将网络端点添加到服务中的直觉可能是正确的,但 Kubernetes 不会自己这样做。如果你重建你的应用程序以拥有一个 Flask 服务器并监听一个端口,那么你可以很容易地将它部署到 Kubernetes。如果应用程序希望数据进入标准输入并且其结果进入标准输出,那么添加 Kubernetes 网络元数据将无济于事:在您的示例中,如果容器内没有任何东西在端口 8080 上监听,那么网络连接将永远不会去任何地方.

关于docker - 如何在接受命令行参数的 kubernetes 上运行 docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54424063/

相关文章:

python - 在 AWS 实例上的 Docker 容器中使用 PyCharm 进行开发

python - docker 无法使用 postman 从 docker 公开正确的端口 9090

java - 使用 wlst 脚本部署 Weblogic 应用程序出现内存不足异常

docker - Windows10上的Docker卷权限 “a STORAGE ENGINE failed.”

visual-studio - Visual Studio - Web 项目之间的资源(CSS/JS/图像)共享

docker - 在使用Docker设计应用程序和部署策略的架构方面需要帮助

ssh - kubectl : Error from server: No SSH tunnels currently open

kubernetes - 如何从 kubernetes 集群注销 kubernetes 节点

kubernetes - 这些变量从哪里出现在我的 kubernetes 容器中?

docker - 覆盖另一个文件时,Dockerfile COPY命令将一个空文件放入其容器中