convert docker-compose.yml file to kubernetes

5/31/2020

I am converting a docker-compose file to kubernetes using kompose running the follwing command:

$kompose convert -f docker-compose.yml -o kubernetes_image.yaml

After the command finish the ouput is the following.

WARN Volume mount on the host "/usr/docker/adpater/dbdata" isn't supported - ignoring path on the host
INFO Network integration is detected at Source, shall be converted to equivalent NetworkPolicy at Destination
WARN Volume mount on the host "/usr/docker/adpater/license.json" isn't supported - ignoring path on the host
WARN Volume mount on the host "/usr/docker/adpater/certificates/ssl.crt" isn't supported - ignoring path on the host
WARN Volume mount on the host "/usr/docker/adpater/certificates/ssl.key" isn't supported - ignoring path on the host
WARN Volume mount on the host "/usr/docker/adpater/server.xml" isn't supported - ignoring path on the host
INFO Network integration is detected at Source, shall be converted to equivalent NetworkPolicy at Destination

To push the converted file to kubernetes I run the follwoing command:

$kubectl apply -f kubernetes_image.yaml

NAME                      READY   STATUS             RESTARTS   AGE
mysql-557dd849c8-bsdq7    1/1     Running            1          17h
tomcat-7cd65d4556-spjbl   0/1     CrashLoopBackOff   76         18h

if I run: $ kubectl describe pod tomcat-7cd65d4556-spjbl I get the following message:

Last State:     Terminated
      Reason:       ContainerCannotRun
      Message:      OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/usr/docker/adapter/server.xml\\\" to rootfs \\\"/var/lib/docker/overlay2/a6df90a0ef4cbe8b2a3fa5352be5f304cd7b648fb1381492308f0a7fceb931cc/merged\\\" at \\\"/var/lib/docker/overlay2/a6df90a0ef4cbe8b2a3fa5352be5f304cd7b648fb1381492308f0a7fceb931cc/merged/usr/local/tomcat/conf/server.xml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
      Exit Code:    127
      Started:      Sun, 31 May 2020 13:35:00 +0100
      Finished:     Sun, 31 May 2020 13:35:00 +0100
    Ready:          False
    Restart Count:  75
    Environment:    <none>
    Mounts:
      /run/secrets/rji_license.json from tomcat-hostpath0 (rw)
      /usr/local/tomcat/conf/server.xml from tomcat-hostpath3 (rw)
      /usr/local/tomcat/conf/ssl.crt from tomcat-hostpath1 (rw)
      /usr/local/tomcat/conf/ssl.key from tomcat-hostpath2 (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-8dhnk (ro)

This is my docker-compose.yml file:


version: '3.6'

networks:
  integration:

services:
  mysql:
    environment:
      MYSQL_USER: 'integrationdb'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    image: db:poc
    networks:
    - integration
    ports:
    - '3306:3306'
    restart: always
    volumes:
       - ./dbdata:/var/lib/mysql
  tomcat:
    image: adapter:poc
    networks:
    - integration
    ports:
    - '8080:8080'
    - '8443:8443'
    restart: always
    volumes:
      - ./license.json:/run/secrets/rji_license.json
      - ./certificates/ssl.crt:/usr/local/tomcat/conf/ssl.crt
      - ./certificates/ssl.key:/usr/local/tomcat/conf/ssl.key
      - ./server.xml:/usr/local/tomcat/conf/server.xml

Versions of the tools:

kompose: 1.21.0 (992df58d8)

docker: 19.03.9

kubectl:Major:"1", Minor:"18"

I think my challange here is whithin this type of volumes or files, I dont know how can I migrate or convert them to kubernetes and put the tomcat pod running fine. Could someone give me a hand?

 volumes:
          - ./license.json:/run/secrets/rji_license.json
          - ./certificates/ssl.crt:/usr/local/tomcat/conf/ssl.crt
          - ./certificates/ssl.key:/usr/local/tomcat/conf/ssl.key
          - ./server.xml:/usr/local/tomcat/conf/server.xml

thanks in advance.

-- rdinis
docker
kompose
kubernetes
tomcat

2 Answers

5/31/2020

When Kompose warns you:

<!-- language: lang-none -->
WARN Volume mount on the host "/usr/docker/adpater/license.json" isn't supported - ignoring path on the host

It means that it can't translate this fragment of the docker-compose.yml file into Kubernetes syntax:

<!-- language: lang-yaml -->
volumes:
    - ./license.json:/run/secrets/rji_license.json

In native Kubernetes, you'd need to provide this content in ConfigMap or Secret objects, and then mount the file into the pod. You can't directly access content on the system from which you're launching the containers.

You can't really get around directly working with the Kubernetes YAML files here. You could run kompose convert to generate the skeleton files, but then you'll need to edit those to add the ConfigMaps, PersistentVolumeClaims (for the database storage), and relevant volume and mount declarations, and then run kubectl apply -f to actually run them. I'd check the Kubernetes YAML files into source control, and maintain them in parallel with your Docker Compose setup.

-- David Maze
Source: StackOverflow

11/20/2020

Move2Kube (which does support docker-compose translation), can handle this case and tries to convert the volumes by interacting with you.

    ? 6. [] What type of container registry login do you want to use?
Hints:
 [Docker login from config mode, will use the default config from your local machine.]
 No authentication
? 7. Do you want to create PVC for host path [/Users/ashok/wksps/hc/temp/test2/src/dbdata]?:
Hints:
 [Use PVC for persistent storage wherever applicable]
 Yes
? 8. Do you want to create PVC for host path [/Users/ashok/wksps/hc/temp/test2/src/license.json]?:
Hints:
 [Use PVC for persistent storage wherever applicable]
 No
? 9. Do you want to create PVC for host path [/Users/ashok/wksps/hc/temp/test2/src/certificates/ssl.crt]?:
Hints:
 [Use PVC for persistent storage wherever applicable]
 No
? 10. Do you want to create PVC for host path [/Users/ashok/wksps/hc/temp/test2/src/certificates/ssl.key]?:
Hints:
 [Use PVC for persistent storage wherever applicable]
 No
? 11. Do you want to create PVC for host path [/Users/ashok/wksps/hc/temp/test2/src/server.xml]?:
Hints:
 [Use PVC for persistent storage wherever applicable]
 No
? 12. Which storage class to use for persistent volume claim [vol17655897939759777588] used by [mysql]
Hints:
 [If you have a custom cluster, you can use collect to get storage classes from it.]
 default
? 13. Provide the ingress host domain
Hints:
 [Ingress host domain is part of service URL]
 myproject.com
? 14. Provide the TLS secret for ingress
Hints:
 [Enter TLS secret name]

If the above choices were made Move2Kube creates the following artifacts:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    move2kube.konveyor.io/service.expose: "true"
  creationTimestamp: null
  labels:
    move2kube.konveyor.io/network/integration: "true"
    move2kube.konveyor.io/service: tomcat
  name: tomcat
spec:
  replicas: 2
  selector:
    matchLabels:
      move2kube.konveyor.io/service: tomcat
  strategy: {}
  template:
    metadata:
      annotations:
        move2kube.konveyor.io/service.expose: "true"
      creationTimestamp: null
      labels:
        move2kube.konveyor.io/network/integration: "true"
        move2kube.konveyor.io/service: tomcat
      name: tomcat
    spec:
      containers:
        - image: adapter:poc
          imagePullPolicy: Always
          name: tomcat
          ports:
            - containerPort: 8080
              protocol: TCP
            - containerPort: 8443
              protocol: TCP
          resources: {}
          volumeMounts:
            - mountPath: /run/secrets/rji_license.json
              name: vol16871681589659214643
            - mountPath: /usr/local/tomcat/conf/ssl.crt
              name: vol12635587774184387470
            - mountPath: /usr/local/tomcat/conf/ssl.key
              name: vol7446232639477381794
            - mountPath: /usr/local/tomcat/conf/server.xml
              name: vol4920239289720818926
      restartPolicy: Always
      volumes:
        - hostPath:
            path: /Users/ashok/wksps/hc/temp/test2/src/license.json
          name: vol16871681589659214643
        - hostPath:
            path: /Users/ashok/wksps/hc/temp/test2/src/certificates/ssl.crt
          name: vol12635587774184387470
        - hostPath:
            path: /Users/ashok/wksps/hc/temp/test2/src/certificates/ssl.key
          name: vol7446232639477381794
        - hostPath:
            path: /Users/ashok/wksps/hc/temp/test2/src/server.xml
          name: vol4920239289720818926
    status: {}

and

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    move2kube.konveyor.io/service.expose: "true"
  creationTimestamp: null
  labels:
    move2kube.konveyor.io/network/integration: "true"
    move2kube.konveyor.io/service: mysql
  name: mysql
spec:
  replicas: 2
  selector:
    matchLabels:
      move2kube.konveyor.io/service: mysql
  strategy: {}
  template:
    metadata:
      annotations:
        move2kube.konveyor.io/service.expose: "true"
      creationTimestamp: null
      labels:
        move2kube.konveyor.io/network/integration: "true"
        move2kube.konveyor.io/service: mysql
      name: mysql
    spec:
      containers:
        - env:
            - name: MYSQL_USER
              value: integrationdb
            - name: MYSQL_PASSWORD
              value: password
            - name: MYSQL_ROOT_PASSWORD
              value: password
          image: db:poc
          imagePullPolicy: Always
          name: mysql
          ports:
            - containerPort: 3306
              protocol: TCP
          resources: {}
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: vol17655897939759777588
      restartPolicy: Always
      volumes:
        - name: vol17655897939759777588
          persistentVolumeClaim:
            claimName: vol17655897939759777588
status: {}

and

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  name: vol17655897939759777588
spec:
  resources:
    requests:
      storage: 100Mi
  storageClassName: default
  volumeName: vol17655897939759777588
status: {}

Essentially depending on your choice Move2Kube will create the appropriate artifacts for you.

You can check out how it works in https://konveyor.github.io/move2kube/tutorials/docker-compose/.

-- Ashok Pon Kumar
Source: StackOverflow