Link Search Menu Expand Document

Customizing generated Dockerfile and behavior of built-in transformer

Big picture

In this example, we look at how to make Move2Kube add custom Dockerfile and a custom file.

  1. Let us start by creating an empty workspace directory say workspace and make it the current working directory. We will assume all commands are executed within this directory.
      $ mkdir workspace && cd workspace
  2. Lets use the enterprise-app as input for this flow.
      $ curl | bash -s -- -d samples/enterprise-app/src -r move2kube-demos
      $ ls src		config-utils		customers	docs			frontend		gateway			orders
  3. Let’s first run Move2Kube without any customization.
    • If we notice the Dockerfile generated for the frontend app, it uses as base image
    • There are no scripts named in the frontend service directory
    • The Kubernetes yamls are generated in myproject/deploy/yamls directory
     $ move2kube transform -s src/ --qa-skip && ls myproject/source/frontend && cat myproject/source/frontend/Dockerfile && ls myproject/deploy && rm -rf myproject
     Dockerfile      __mocks__       jest.config.js    package-lock.json    src               test-setup.js
     LICENSE         dist            manifest.yml      package.json         stories           tsconfig.json       dr-surge.js     nodemon.json      server.js            stylePaths.js     webpack.common.js
     COPY . .
     RUN npm install
     RUN npm run build
     USER root
     RUN chown -R 1001:0 /opt/app-root/src/.npm
     RUN chmod -R 775 /opt/app-root/src/.npm
     USER 1001
     EXPOSE 8080
     CMD npm run start
     cicd			compose			knative			knative-parameterized	yamls			yamls-parameterized

Let’s say, we want to change

  • The base image of the Dockerfile generated for nodejs from to
  • Add a new script named in the nodejs app directories along with the Dockerfile, in our case frontend directory
  • Change the location of Kubernetes yamls from myproject/deploy/yamls to myproject/yamls-elsewhere
  1. We will use a custom configured version of the nodejs built-in transformer and kubernetes built-in transformer to achieve this. We copy it into the customizations sub-directory.
      $ curl | bash -s -- -d custom-dockerfile-change-built-in-behavior -r move2kube-transformers -o customizations
  2. Now lets transform with this customization. Specify the customization using the -c flag.
      $ move2kube transform -s src/ -c customizations/ --qa-skip

Once the output is generated, we can observe

  • The Dockerfile generated for the frontend app contains the custom base image
  • A new file named is generated in the frontend directory
  • The kubernetes yamls are now generated in myproject/yamls-elsewhere directory, and hence the parameterized yamls are also in myproject/yamls-elsewhere-parameterized directory.
    $ ls myproject/source/frontend
    Dockerfile        __mocks__         jest.config.js    package-lock.json src               stylePaths.js     webpack.common.js
    LICENSE           dist              manifest.yml      package.json   test-setup.js         dr-surge.js       nodemon.json      server.js         stories           tsconfig.json
    $ cat myproject/source/frontend/Dockerfile
    COPY . .
    RUN npm install
    RUN npm run build
    EXPOSE 8080
    CMD sh
    $ ls myproject			deploy				scripts				source				yamls-elsewhere			yamls-elsewhere-parameterized

Anatomy of transformers in custom-dockerfile-change-built-in-behavior

The two customized transformers in the directory are nodejs and kubernetes. The contents of custom-dockerfile-custom-files are as shown below:

  $ tree customizations
  └── custom-dockerfile-change-built-in-behavior
      ├── kubernetes
      │   └── transformer.yaml
      └── nodejs
          ├── mappings
          │   └── nodeversions.yaml
          ├── templates
          │   ├── Dockerfile
          │   └──
          └── transformer.yaml

To custom configure an built-in transformer, you can copy the built-in transformer’s configuration directory from move2kube source, change the configurations and use it as a customization. You can make it override the built-in transformer using the override config in the yaml.

In this case, we change the Dockerfile template, add a script and change the transformer configuration yaml.

  1. To change the template, we have added our custom template in customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/Dockerfile. The template is the same as the one used in the built-in transformer, except that we are using a custom base image and a custom CMD here.
      $ cat customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/Dockerfile
      COPY . .
      RUN npm install
      {{- if .Build }}
      RUN npm run build
      {{- end}}
      EXPOSE {{ .Port }}
      CMD sh
  2. Add customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/
      $ ls customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/
  3. The transformer.yaml is the transformer configuration. We have two changes here compared to the built-in transformer:
    • The name of our custom transformer is Nodejs-CustomFiles (see name field in the metadata section).
    • We are also specifying an override section which is asking Move2Kube to disable the transformer named Nodejs-Dockerfile if this transformer is present.
        $ cat customizations/custom-dockerfile-change-built-in-behavior/nodejs/transformer.yaml
        kind: Transformer
       name: Nodejs-CustomFiles
       labels: containerization false
       class: "NodejsDockerfileGenerator"
         levels: -1
       merge: false
       disabled: false
       disabled: false
         matchLabels: Nodejs-Dockerfile
  4. In the kubernetes transformer, we change the name and override config too. But in addition, we change the default behavior of the transformer, which is to put the Kubernetes yamls in deploy/yamls directory by changing the spec.config.outputPath to yamls-elsewhere.
      $ cat customizations/custom-dockerfile-change-built-in-behavior/kubernetes/transformer.yaml
      kind: Transformer
     name: KubernetesWithCustomOutputDirectory
     labels: false
     class: "Kubernetes"
       levels: 0
         merge: true
         disabled: false
       matchLabels: Kubernetes
       matchLabels: "true"
       outputPath: "yamls-elsewhere"
       ingressName: "{{ .ProjectName }}"

Next step Adding custom annotations to Kubernetes YAMLs