forked from LaconicNetwork/kompose
#### What type of PR is this? Change from Docker Compose references to just Compose <!-- Add one of the following kinds: /kind bug /kind cleanup /kind documentation /kind feature --> #### What this PR does / why we need it: Compose is an open format and we should not say "Docker Compose". #### Which issue(s) this PR fixes: <!-- *Automatically closes linked issue when PR is merged. Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`. --> Fixes https://github.com/kubernetes/kompose/issues/1868 #### Special notes for your reviewer: Signed-off-by: Charlie Drage <charlie@charliedrage.com>
91 lines
3.3 KiB
Markdown
91 lines
3.3 KiB
Markdown
---
|
|
layout: default
|
|
permalink: /architecture/
|
|
title: Architecture
|
|
redirect_from:
|
|
- /docs/architecture.md/
|
|
- /docs/architecture/
|
|
---
|
|
|
|
# Architecture and Internal Design
|
|
|
|
* TOC
|
|
{:toc}
|
|
|
|
`kompose` has 3 stages: _Loader_, _Transformer_ and _Outputter_. Each stage should have a well-defined interface, so it is easy to write a new Loader, Transformer, or Outputters and plug it in. Currently, only Loader and Transformer interfaces are defined.
|
|
|
|

|
|
|
|
## Loader
|
|
|
|
The Loader reads the input file now `kompose` supports [Compose](https://docs.docker.com/compose) v1, v2 and converts it to KomposeObject.
|
|
|
|
Loader is represented by a Loader interface:
|
|
|
|
```go
|
|
type Loader interface {
|
|
LoadFile(file string) kobject.KomposeObject
|
|
}
|
|
```
|
|
|
|
Every loader “implementation” should be placed into `kompose/pkg/loader` (like compose). More input formats will be supported in the future. You can take a look for more details at:
|
|
|
|
- [kompose/pkg/loader](https://github.com/kubernetes/kompose/tree/master/pkg/loader)
|
|
- [kompose/pkg/loader/compose](https://github.com/kubernetes/kompose/tree/master/pkg/loader/compose)
|
|
|
|
## KomposeObject
|
|
|
|
`KomposeObject` is Kompose internal representation of all containers loaded from input file. First version of `KomposeObject` looks like this (source: [kobject.go](https://github.com/kubernetes/kompose/blob/master/pkg/kobject/kobject.go)):
|
|
|
|
```go
|
|
// KomposeObject holds the generic struct of Kompose transformation
|
|
type KomposeObject struct {
|
|
ServiceConfigs map[string]ServiceConfig
|
|
}
|
|
|
|
// ServiceConfig holds the basic struct of a container
|
|
type ServiceConfig struct {
|
|
ContainerName string
|
|
Image string
|
|
Environment []EnvVar
|
|
Port []Ports
|
|
Command []string
|
|
WorkingDir string
|
|
Args []string
|
|
Volumes []string
|
|
Network []string
|
|
Labels map[string]string
|
|
Annotations map[string]string
|
|
CPUSet string
|
|
CPUShares int64
|
|
CPUQuota int64
|
|
CapAdd []string
|
|
CapDrop []string
|
|
Entrypoint []string
|
|
Expose []string
|
|
Privileged bool
|
|
Restart string
|
|
User string
|
|
}
|
|
```
|
|
|
|
## Transformer
|
|
|
|
The Transformer takes KomposeObject and converts it to target/output format (currently, there are sets of Kubernetes/OpenShift objects). Similar to the `Loader`, Transformer is represented by a Transformer interface:
|
|
|
|
```go
|
|
type Transformer interface {
|
|
Transform(kobject.KomposeObject, kobject.ConvertOptions) []runtime.Object
|
|
}
|
|
```
|
|
|
|
If you wish to add more providers containing different kinds of objects, the Transformer would be the place to look into. Currently, Kompose supports Kubernetes (by default) and OpenShift providers. More details at:
|
|
|
|
- [kompose/pkg/transformer](https://github.com/kubernetes/kompose/tree/master/pkg/transformer)
|
|
- [kompose/pkg/transformer/Kubernetes](https://github.com/kubernetes/kompose/tree/master/pkg/transformer/kubernetes)
|
|
- [kompose/pkg/transformer/openshift](https://github.com/kubernetes/kompose/tree/master/pkg/transformer/openshift)
|
|
|
|
## Outputter
|
|
|
|
The Outputter takes the Transformer result and executes the given action. For example, action can display results to stdout or directly deploy artifacts to Kubernetes/OpenShift.
|