mirror of https://github.com/docker/docs.git
Compose Bridge early access (#19702)
* compose-bridge doc - release v0.0.1 Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com> Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> * Apply Ally's suggestions from first code review Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> * manually adapt some review feedback Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> --------- Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com> Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> Co-authored-by: Guillaume Lours <705411+glours@users.noreply.github.com> Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com>
This commit is contained in:
parent
0a7cb792ec
commit
9e4a918f8d
|
|
@ -0,0 +1,189 @@
|
||||||
|
---
|
||||||
|
description: Overview of Docker Compose Bridge
|
||||||
|
keywords: compose, orchestration, kubernetes, bridge
|
||||||
|
title: Overview of Docker Compose Bridge
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< include "compose-bridge-early-access.md" >}}
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
Docker Compose makes it easy to define a multi-container application
|
||||||
|
to be run on a single-node Docker Engine, relying on a `compose.yaml` file to
|
||||||
|
describe resources with a simple abstraction.
|
||||||
|
|
||||||
|
Compose Bridge lets you reuse this exact same `compose.yaml` file but
|
||||||
|
translate it into another platform's definition format, with a primary
|
||||||
|
focus on Kubernetes. This transformation can be customized to match
|
||||||
|
specific needs and requirements.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Compose Bridge is a command line tool that consumes a `compose.yaml` file
|
||||||
|
and runs a transformation to produce resource definitions for another platform.
|
||||||
|
[By default](transformation.md), it produces Kubernetes manifests and a Kustomize overlay for Docker Desktop. For example:
|
||||||
|
```console
|
||||||
|
$ compose-bridge -f compose.yaml convert
|
||||||
|
Kubernetes resource api-deployment.yaml created
|
||||||
|
Kubernetes resource db-deployment.yaml created
|
||||||
|
Kubernetes resource web-deployment.yaml created
|
||||||
|
Kubernetes resource api-expose.yaml created
|
||||||
|
Kubernetes resource db-expose.yaml created
|
||||||
|
Kubernetes resource web-expose.yaml created
|
||||||
|
Kubernetes resource 0-avatars-namespace.yaml created
|
||||||
|
Kubernetes resource default-network-policy.yaml created
|
||||||
|
Kubernetes resource private-network-policy.yaml created
|
||||||
|
Kubernetes resource public-network-policy.yaml created
|
||||||
|
Kubernetes resource db-db_data-persistentVolumeClaim.yaml created
|
||||||
|
Kubernetes resource api-service.yaml created
|
||||||
|
Kubernetes resource web-service.yaml created
|
||||||
|
Kubernetes resource kustomization.yaml created
|
||||||
|
Kubernetes resource db-db_data-persistentVolumeClaim.yaml created
|
||||||
|
Kubernetes resource api-service.yaml created
|
||||||
|
Kubernetes resource web-service.yaml created
|
||||||
|
Kubernetes resource kustomization.yaml created
|
||||||
|
```
|
||||||
|
|
||||||
|
Such manifests can then be used to run the application on Kubernetes using
|
||||||
|
the standard deployment command `kubectl apply -k out/overlays/desktop/`.
|
||||||
|
|
||||||
|
## Customization
|
||||||
|
|
||||||
|
The Kubernetes manifests produced by Compose Bridge
|
||||||
|
are designed to allow deployment on Docker Desktop with Kubernetes enabled.
|
||||||
|
|
||||||
|
Kubernetes is such a versatile platform that there are many ways
|
||||||
|
to map Compose concepts into a Kubernetes resource definitions. Compose
|
||||||
|
Bridge lets you customize the transformation to match your own infrastructure
|
||||||
|
decisions and preferences, with various level of flexibility / investment.
|
||||||
|
|
||||||
|
|
||||||
|
### Modify the default templates
|
||||||
|
|
||||||
|
You can extract templates used by default transformation `docker/compose-bridge-kubernetes`
|
||||||
|
by running `compose-bridge transformations create my-template --from docker/compose-bridge-kubernetes`
|
||||||
|
and adjusting those to match your needs.
|
||||||
|
|
||||||
|
The templates will be extracted into a directory named after your template name (ie `my-template`).
|
||||||
|
Inside, you will find a Dockerfile that allows you to create your own image to distribute your template, as well as a directory containing the templating files.
|
||||||
|
You are free to edit the existing files, delete them, or [add new ones](#add-your-own-templates) to subsequently generate Kubernetes manifests that meet your needs.
|
||||||
|
You can then use the generated Dockerfile to package your changes into a new Transformer image, which you can then use with Compose Bridge:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker build --tag mycompany/transform --push .
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then use your transformation as a replacement:
|
||||||
|
```console
|
||||||
|
$ compose-bridge -f compose.yaml convert --transformation mycompany/transform
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information, see [Templates](./templates.md).
|
||||||
|
|
||||||
|
### Add your own templates
|
||||||
|
|
||||||
|
For resources that are not managed by Compose Bridge's default transformation,
|
||||||
|
you can build your own templates. The `compose.yaml` model may not offer all
|
||||||
|
the configuration attributes required to populate the target manifest. If this is the case, you can
|
||||||
|
then rely on Compose custom extensions to let developers better describe the
|
||||||
|
application, and offer an agnostic transformation.
|
||||||
|
|
||||||
|
As an illustration, if developers add `x-virtual-host` metadata
|
||||||
|
to service definitions in the `compose.yaml` file, you can use the following custom attribute
|
||||||
|
to produce Ingress rules:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
{{ $project := .name }}
|
||||||
|
#! {{ $name }}-ingress.yaml
|
||||||
|
# Generated code, do not edit
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: virtual-host-ingress
|
||||||
|
namespace: {{ $project }}
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
{{ range $name, $service := .services }}
|
||||||
|
{{ if $service.x-virtual-host }}
|
||||||
|
- host: ${{ $service.x-virtual-host }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: "/"
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: ${{ name }}
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
Once packaged into a Docker image, you can use this custom template
|
||||||
|
when transforming Compose models into Kubernetes in addition to other
|
||||||
|
transformations:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ compose-bridge -f compose.yaml convert \
|
||||||
|
--transformation docker/compose-bridge-kubernetes \
|
||||||
|
--transformation mycompany/transform
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build your own transformation
|
||||||
|
|
||||||
|
While Compose Bridge templates make it easy to customize with minimal changes,
|
||||||
|
you may want to make significant changes, or rely on an existing conversion tool.
|
||||||
|
|
||||||
|
A Compose Bridge transformation is a Docker image that is designed to get a Compose model
|
||||||
|
from `/in/compose.yaml` and produce platform manifests under `/out`. This simple
|
||||||
|
contract makes it easy to bundle an alternate transformation, as illustrated below using
|
||||||
|
[Kompose](https://kompose.io/):
|
||||||
|
|
||||||
|
```Dockerfile
|
||||||
|
FROM alpine
|
||||||
|
|
||||||
|
# Get kompose from github release page
|
||||||
|
RUN apk add --no-cache curl
|
||||||
|
ARG VERSION=1.32.0
|
||||||
|
RUN ARCH=$(uname -m | sed 's/armv7l/arm/g' | sed 's/aarch64/arm64/g' | sed 's/x86_64/amd64/g') && \
|
||||||
|
curl -fsL \
|
||||||
|
"https://github.com/kubernetes/kompose/releases/download/v${VERSION}/kompose-linux-${ARCH}" \
|
||||||
|
-o /usr/bin/kompose
|
||||||
|
RUN chmod +x /usr/bin/kompose
|
||||||
|
|
||||||
|
CMD ["/usr/bin/kompose", "convert", "-f", "/in/compose.yaml", "--out", "/out"]
|
||||||
|
```
|
||||||
|
|
||||||
|
This Dockerfile bundles Kompose and defines the command to run this tool according
|
||||||
|
to the Compose Bridge transformation contract.
|
||||||
|
|
||||||
|
## Use `compose-bridge` as a `kubectl` plugin
|
||||||
|
|
||||||
|
To use the `compose-bridge` binary as a `kubectl` plugin, you need to make sure that the binary is available in your PATH and the name of the binary is prefixed with `kubectl-`.
|
||||||
|
|
||||||
|
1. Rename or copy the `compose-bridge` binary to `kubectl-compose_bridge`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ mv /path/to/compose-bridge /usr/local/bin/kubectl-compose_bridge
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Ensure that the binary is executable:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ chmod +x /usr/local/bin/kubectl-compose_bridge
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Verify that the plugin is recognized by `kubectl`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl plugin list
|
||||||
|
```
|
||||||
|
|
||||||
|
In the output, you should see `kubectl-compose_bridge`.
|
||||||
|
|
||||||
|
4. Now you can use `compose-bridge` as a `kubectl` plugin:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ kubectl compose-bridge [command]
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `[command]` with any `compose-bridge` command you want to use.
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
---
|
||||||
|
title: Compose Bridge templates
|
||||||
|
description: Learn about the Compose Bridge templates syntax
|
||||||
|
keywords: compose, bridge, templates
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< include "compose-bridge-early-access.md" >}}
|
||||||
|
|
||||||
|
Compose Bridge's default transformation uses templates to produce Kubernetes manifests.
|
||||||
|
This page describes the templating mechanism.
|
||||||
|
|
||||||
|
## Syntax
|
||||||
|
|
||||||
|
Templates are plain text files, using [go-template](https://pkg.go.dev/text/template)
|
||||||
|
to allow logic and data injection based on the `compose.yaml` model.
|
||||||
|
|
||||||
|
When a template is executed, it must produce a YAML file. Multiple files can be generated
|
||||||
|
as long as those are separated by `---`
|
||||||
|
|
||||||
|
The first line, when creating the YAML file, defines the file being generated using a custom notation:
|
||||||
|
```yaml
|
||||||
|
#! manifest.yaml
|
||||||
|
```
|
||||||
|
With this header comment, `manifest.yaml` will be created by Compose Bridge with the content following
|
||||||
|
the annotation.
|
||||||
|
|
||||||
|
Combining these together, you can write a template to iterate over some of Compose resources,
|
||||||
|
then for each resource you can produce a dedicated manifest:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
{{ range $name, $service := .services }}
|
||||||
|
---
|
||||||
|
#! {{ $name }}-manifest.yaml
|
||||||
|
# Generated code, do not edit
|
||||||
|
key: value
|
||||||
|
## ...
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
This example produces a manifest file for each and every Compose service in you Compose model.
|
||||||
|
|
||||||
|
|
||||||
|
## Input
|
||||||
|
|
||||||
|
The input compose model is the canonical yaml model you can get by running
|
||||||
|
`docker compose config`. Within a template you can access model nodes using
|
||||||
|
dot notation:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# iterate over a yaml sequence
|
||||||
|
{{ range $name, $service := .services }}
|
||||||
|
# access a nested attribute using dot notation
|
||||||
|
{{ if eq $service.deploy.mode "global" }}
|
||||||
|
kind: DaemonSet
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can check the [Compose Specification json-spec file](https://github.com/compose-spec/compose-go/blob/main/schema/compose-spec.json) to have a full overview of the Compose model.
|
||||||
|
|
||||||
|
## Helpers
|
||||||
|
|
||||||
|
As part of the Go templating syntax, Compose Bridge offers a set of helper functions:
|
||||||
|
|
||||||
|
- `seconds`: convert a [duration](https://github.com/compose-spec/compose-spec/blob/master/11-extension.md#specifying-durations) into an integer
|
||||||
|
- `uppercase` convert a string into upper case characters
|
||||||
|
- `title`: convert a string by capitalizing first letter of each word
|
||||||
|
- `safe`: convert a string into a safe identifier, replacing all characters but \[a-z\] with `-`
|
||||||
|
- `truncate`: removes the N first elements from a list
|
||||||
|
- `join`: group elements from a list into a single string, using a separator
|
||||||
|
- `base64`: encode string as base64
|
||||||
|
- `map`: transform value according to mappings expressed as `"value -> newValue"` strings
|
||||||
|
- `indent`: writes string content indented by N spaces
|
||||||
|
- `helmValue`: write the string content as a template value in final file
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: Compose Bridge default transformation
|
||||||
|
description: Learn about the Compose Bridge default transformation
|
||||||
|
keywords: compose, bridge, kubernetes
|
||||||
|
---
|
||||||
|
|
||||||
|
{{< include "compose-bridge-early-access.md" >}}
|
||||||
|
|
||||||
|
Compose Bridge produces Kubernetes manifests so you can deploy
|
||||||
|
your Compose application to Kubernetes that is enabled on Docker Desktop.
|
||||||
|
|
||||||
|
Based on an arbitrary `compose.yaml` project, Compose Bridge will produce:
|
||||||
|
|
||||||
|
- A [Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) so all your resources are isolated and don't colide with another deployment
|
||||||
|
- A [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) with an entry for each and every config resource in your Compose model
|
||||||
|
- [Deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) for application services
|
||||||
|
- [Services](https://kubernetes.io/docs/concepts/services-networking/service/) for ports exposed by your services, used for service-to-service communication
|
||||||
|
- [Services](https://kubernetes.io/docs/concepts/services-networking/service/) for ports published by your services, with type `LoadBalancer` so that Docker Desktop will also expose same port on host
|
||||||
|
- [Network policies](https://kubernetes.io/docs/concepts/services-networking/network-policies/) to replicate the networking topology expressed in Compose
|
||||||
|
- [PersistentVolumeClaims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) for your volumes, using `hostpath` storage class so that Docker Desktop manages volume creation
|
||||||
|
- [Secrets](https://kubernetes.io/docs/concepts/configuration/secret/) with your secret encoded - this is designed for local use in a testing environment
|
||||||
|
|
||||||
|
And a Kustomize overlay dedicated to Docker Desktop with:
|
||||||
|
- Loadbalancer for services which need to expose ports on host
|
||||||
|
- A PersistentVolumeClaim to use the Docker Desktop storage provisioner `desktop-storage-provisioner`
|
||||||
|
- A Kustomize file to link the all those resources together
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
> **Early Access**
|
||||||
|
>
|
||||||
|
> Compose Bridge command line is an [early access](/release-lifecycle#early-access-ea) product.
|
||||||
|
>
|
||||||
|
{ .restricted }
|
||||||
Loading…
Reference in New Issue