<p>I have a docker image, that contains a python file that accepts arguments from command line using sys.stdin(). I can run the image using the following command</p>

<blockquote>
  <p>cat file.csv | docker run -i -t my_image</p>
</blockquote>

<p>It pipes the contents of file.csv to the image, and i get the output as expected.</p>

<p>Now i want to deploy this image to kubernetes. I can run the image on the server using docker without any problems. But if i curl to it, it should send a response back, but i am not getting it because i do not have a web server listening on any port. I went ahead and built a deployment using the following command.</p>

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

<p>It built the deployment and i can see the pods running. Then i expose it.</p>

<blockquote>
  <p>kubectl expose deployment my_deployment --type=LoadBalancer --port 80 --target-port 8080</p>
</blockquote>

<p>But if i try to access it using the IP assigned using curl,</p>

<blockquote>
  <p>curl <a href="http://allocated_ip" rel="nofollow noreferrer">http://allocated_ip</a></p>
</blockquote>

<p>i get a response "connection refused".</p>

<p>How can deploy this docker image as a service on kubernetes and send contents of a file as an input to the service? Do i need a web server for that?</p>

sid0972
<p>Kubernetes generally assumes the containers it deploys are long-lived and autonomous.  If you're deploying something in a Pod, particularly via a Deployment, it should be able to run on its own without any particular inputs.  If it immediately exits, Kubernetes will restart it, and you'll quickly wind up in the dreaded <code>CrashLoopBackOff</code> state.</p>

<p>In short: you need to redesign your container to not use stdin and stdout is its primary interface.</p>

<p>Your instinct to add a network endpoint into the service is probably correct, but Kubernetes won't do that on its own.  If you rebuild your application to have, say, a Flask server and listen on a port, that's something you can readily deploy to Kubernetes.  If the application expects data to come in on stdin and its results to go to stdout, adding the Kubernetes networking metadata won't help anything: in your example if nothing is listening inside the container on port 8080 then a network connection will never go anywhere.</p>
