Docker Compose
Docker-compose components
Docker Compose is one of the methods to create components within [bunnyshell.yaml](environment-definition)
.
Adding components from a docker-compose.yaml
file is straightforward, and it will create one of the 3 environment component types, depending on what's being added.
Important note
The conversion from
docker-compose.yaml
tobunnyshell.yaml
is one-time and one-way.When the
docker-compose.yaml
file is being added to the environment, it is parsed and the correspondingbunnyshell.yaml
contents is generated, and from that point on, the management of the components will be performed solely frombunnyshell.yaml
.Updating
docker-compose.yaml
will NOT automatically updatebunnyshell.yaml
.
Essentially, all 3 kinds operate the same way, with the exception that some room for specific developments was left for Databases
(with regards to seeding, for example).
Applications
and Services
differ only semantically, but operate identically.
Application
Applications are used for (you guessed it...) applications. They are designed to be used for pieces of software in your stack which are written by you and need to be built.
They are translated from Docker Compose services with an image to be built, and must not fall into the Database
conditions.
Database
A component will be categorised as a Database
if:
- the name of the image or the name of the Docker Compose service contains one of mysql, percona, mariadb, sql, postgre, mongo, clickhouse, database
- it exposes one of the ports 3306, 27017, 5432, 5433, 8123
Service
Services
are designed to be used for pieces of software in your stack which are not written by you. A Service
is a component translated from Docker Compose which is nor Database
nor Application
.
Kubernetes Resources
Docker Compose Kubernetes resources are fully managed by Bunnyshell.
For each component, Bunnyshell creates the needed Kubernetes resources, for example:
dockerCompose.environment
will create a KubernetesConfigMap
dockerCompose.ports
will create a KubernetesService
hosts
will create a KubernetesIngress
Resource cleanup
When updating/changing the Component, some resources may need to disappear, eg. removing all exposed ports will result in the associated Kubernetes Service
to disappear.
The platform adds a label (app.bunnyshell.com/deploy-version
) on each resource with every deployment. After a deployment is completed, resources which have a different value for app.bunnyshell.com/deploy-version
will be deleted.
Resources not managed by Bunnyshell (not having the app.kubernetes.io/instance-${componentName}=bns
label) will be left untouched.
Memory and CPU
For Docker Compose components, resources for the Application
component (the container running in a Pod) can be set through the dockerCompose.deploy
property of each Component. You can set a minimum and a maximum (reservations
and limits
).
-
kind: Application
name: api
...
dockerCompose:
deploy:
resources:
limits:
cpus: '2'
memory: '10000M'
reservations:
cpus: '0.50'
memory: '5000M'
Health checks using Kubernetes probes
To ensure your application is up and running at all times, you can configure health checks for both startup and running phases. These can be implemented in the form of Kubernetes probes.
Please see the dedicated Health checks for Docker Compose section.
CronJobs
Please see the dedicated CronJobs for Docker Compose section.
Volumes
Please see the dedicated Volumes for Docker Compose section.
Horizontal Pod Autoscaling
Please see the dedicated HPA for Docker Compose section.
Example
Bunnyshell allows the docker compose service syntax in the componentdockerCompose
field, with some exceptions, and below is an example with a rich component configuration
-
kind: Application
name: my-app
gitRepo: 'https://gitlab.com/example/my-app.git'
gitBranch: master
gitApplicationPath: /
dockerCompose:
build:
context: .
dockerfile: ./Dockerfile
target: prod
args:
NOM_TOKEN: '{{env.varGroups.app.NPM_TOKEN}}'
environmentVariablesGroups:
- var-group-1
- var-group-2
environment:
MY_VAR: value
OTHER_VAR: 2
entrypoint: /bin/sh
command:
- -c
- 'echo "starting..." && ./myscript.sh"
ports:
- '80:8080'
deploy:
replicas: 3
resources:
limits:
cpus: '2'
memory: '10000M'
reservations:
cpus: '0.50'
memory: '5000M'
volumes:
-
name: database_volume
mount: /var/db
-
name: misc_volume
mount: /tmp/stuff
subPath: /stuffA
hosts:
-
hostname: 'app-{{env.base_domain}}'
path: /
servicePort: 80
Updated about 1 month ago