IPO
IPO

Reputation: 835

Translate docker run commands with initialization to a multi-container k8s pod or compose

I have a container that I need to configure for k8s yaml. The workflow on docker run using the terminal looks like this.:

docker run -v $(pwd):/projects \
             -w /projects \
             gcr.io/base-project/myoh:v1 init *myproject*

This command creates a directory called myproject. To complete the workflow, I need to cd into this myproject folder and run:

docker run -v $(pwd):/project \
             -w /project \
             -p 8081:8081 \
             gcr.io/base-project/myoh:v1

Any idea how to convert this to either a docker-compose or a k8s pods/deployment yaml? I have tried all that come to mind with no success.

Upvotes: 0

Views: 408

Answers (2)

David Maze
David Maze

Reputation: 158676

The bind mount of the current directory can't be translated to Kubernetes at all. There's no way to connect a pod's filesystem back to your local workstation. A standard Kubernetes setup has a multi-node installation, and if it's possible to directly connect to a node (it may not be) you can't predict which node a pod will run on, and copying code to every node is cumbersome and hard to maintain. If you're using a hosted Kubernetes installation like GKE, it's even possible that the cluster autoscaler will create and delete nodes automatically, and you won't have an opportunity to manually copy things in.

You need to build your application code into a custom image. That can set the desired WORKDIR, COPY the code in, and RUN any setup commands that are required. Then you need to push that to an image repository, like GCR

docker build -t gcr.io/base-project/my-project:v1 .
docker push gcr.io/base-project/my-project:v1

Once you have that, you can create a minimal Kubernetes Deployment to run it. Set the GCR name of the image you built and pushed as its image:. You will also need a Service to make it accessible, even from other Pods in the same cluster.

Upvotes: 2

Sameer Naik
Sameer Naik

Reputation: 1412

Try this (untested yaml, but you will get the idea)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myoh-deployment
  labels:
    app: myoh
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myoh
  template:
    metadata:
      labels:
        app: myoh
    spec:
      initContainers:
      - name: init-myoh
        image: gcr.io/base-project/myoh:v1
        command: ['sh', '-c', "mkdir -p myproject"]
      containers:
      - name: myoh
        image: gcr.io/base-project/myoh:v1
        ports:
        - containerPort: 8081
        volumeMounts:
        - mountPath: /projects
          name: project-volume
    volumes:
    - name: test-volume
      hostPath:
        # directory location on host
        path: /data
        # this field is optional
        type: Directory

Upvotes: 1

Related Questions