Customize generated Dockerfile and built-in transformer behavior
In this tutorial, Move2Kube will add a custom Dockerfile, and a custom file.
- Create an empty workspace directory named
workspace
and make it the current working directory. Assume all commands are executed within this directory.
$ mkdir workspace && cd workspace
- Use the enterprise-app as input for this flow.
$ curl https://move2kube.konveyor.io/scripts/download.sh | bash -s -- -d samples/enterprise-app/src -r move2kube-demos
$ ls src
README.md config-utils customers docs frontend gateway orders
- Run Move2Kube without any customization.
- If the
Dockerfile
is generated for thefrontend
app, it usesregistry.access.redhat.com/ubi8/nodejs-12
as the base image. - There are no scripts named
start-nodejs.sh
in thefrontend
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 README.md dr-surge.js manifest.yml package-lock.json server.js stories test-setup.js webpack.common.js webpack.prod.js LICENSE __mocks__ jest.config.js nodemon.json package.json src stylePaths.js tsconfig.json webpack.dev.js
FROM registry.access.redhat.com/ubi8/nodejs-12
COPY . .
RUN npm install
RUN npm run build
EXPOSE 8080
CMD npm run start
cicd compose knative knative-parameterized yamls yamls-parameterized
The next steps will:
- The base image of the Dockerfile generated for Node.js from
registry.access.redhat.com/ubi8/nodejs-12
toquay.io/konveyor/nodejs-12
. - Add a new script named
start-nodejs.sh
in the Node.js app directories along with the Dockerfile in thefrontend
directory. - Change the location of Kubernetes YAMLs from
myproject/deploy/yamls
tomyproject/yamls-elsewhere
.
- Use a custom configured version of the Node.js built-in transformer and the Kubernetes built-in transformer to achieve this. Copy it into the
customizations
sub-directory.
$ curl https://move2kube.konveyor.io/scripts/download.sh | bash -s -- -d custom-dockerfile-change-built-in-behavior -r move2kube-transformers -o customizations
- Transform using this customization and specify the customization using the
-c
flag.
$ move2kube transform -s src/ -c customizations/ --qa-skip
Once the output is generated, note the following:
- The Dockerfile generated for the
frontend
app contains the custom base image. - A new file named
start-nodejs.sh
was generated in thefrontend
directory. - The Kubernetes YAMLs are now generated in
myproject/yamls-elsewhere
directory and the parameterized YAMLs are also inmyproject/yamls-elsewhere-parameterized
directory.
$ ls myproject/source/frontend
Dockerfile README.md dr-surge.js manifest.yml package-lock.json server.js start-nodejs.sh stylePaths.js tsconfig.json webpack.dev.js LICENSE __mocks__ jest.config.js nodemon.json package.json src stories test-setup.js webpack.common.js webpack.prod.js
$ cat myproject/source/frontend/Dockerfile
FROM quay.io/konveyor/nodejs-12
COPY . .
RUN npm install
RUN npm run build
EXPOSE 8080
CMD sh start-nodejs.sh
$ ls myproject
Readme.md 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 shown below:
$ tree customizations
customizations
└── custom-dockerfile-change-built-in-behavior
├── kubernetes
│ └── kubernetes.yaml
└── nodejs
├── nodejs.yaml
└── templates
├── Dockerfile
└── start-nodejs.sh
To custom configure a built-in transformer, copy the built-in transformer’s configuration directory from the move2kube
source, change the configurations, use it as a customization, and make it override the built-in transformer using the override
config in the yaml.
In this case, change the Dockerfile template, add a script, and change the transformer configuration YAML.
- To change the template, the custom template is placed 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 it is a custom base image and a customCMD
.
{% raw %}$ cat customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/Dockerfile
FROM quay.io/konveyor/nodejs-12
COPY . .
RUN npm install
{{- if .Build }}
RUN npm run build
{{- end}}
EXPOSE {{ .Port }}
CMD sh start-nodejs.sh{% endraw %}
- Add
customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/start-nodejs.sh
.
$ ls customizations/custom-dockerfile-change-built-in-behavior/nodejs/templates/
Dockerfile start-nodejs.sh
- The
transformer.yaml
is the transformer configuration with two changes compared to the built-in transformer:
- The custom transformer name is
Nodejs-CustomFiles
(seename
field in themetadata
section). - Specify an
override
section which is asking Move2Kube to disable the transformer namedNodejs-Dockerfile
if it is present.
$ cat customizations/custom-dockerfile-change-built-in-behavior/nodejs/nodejs.yaml
apiVersion: move2kube.konveyor.io/v1alpha1
kind: Transformer
metadata:
name: Nodejs-CustomFiles
labels:
move2kube.konveyor.io/task: containerization
move2kube.konveyor.io/built-in: true
spec:
class: "NodejsDockerfileGenerator"
directoryDetect:
levels: -1
consumes:
Service:
merge: false
produces:
Dockerfile:
disabled: false
DockerfileForService:
disabled: false
override:
matchLabels:
move2kube.konveyor.io/name: Nodejs-Dockerfile
config:
defaultNodejsVersion: "12"
- In the
kubernetes
transformer, change the name and override the config. Also change the default behavior of the transformer, which is to put the Kubernetes yamls indeploy/yamls
directory by changing thespec.config.outputPath
toyamls-elsewhere
.
$ cat customizations/custom-dockerfile-change-built-in-behavior/kubernetes/kubernetes.yaml
{% raw %}apiVersion: move2kube.konveyor.io/v1alpha1
kind: Transformer
metadata:
name: KubernetesWithCustomOutputDirectory
labels:
move2kube.konveyor.io/built-in: true
spec:
class: "Kubernetes"
directoryDetect:
levels: 0
consumes:
IR:
merge: true
produces:
KubernetesYamls:
disabled: false
override:
matchLabels:
move2kube.konveyor.io/name: Kubernetes
dependency:
matchLabels:
move2kube.konveyor.io/kubernetesclusterselector: "true"
config:
outputPath: "yamls-elsewhere"
ingressName: "{{ .ProjectName }}"{% endraw %}
The next step is adding custom annotations to Kubernetes YAMLs.