Okteto can understand and interpret docker-compose files into kubernetes objects. Let us understand with an example
❯ tree
.
├── Dockerfile
├── app.py
├── docker-compose.yaml
├── okteto.yml
└── requirements.txt
❯ cat Dockerfile
FROM python:3.11.0a6-alpine3.15
WORKDIR /code
COPY requirements.txt /code
RUN pip install -r requirements.txt --no-cache-dir
COPY . /code
EXPOSE 5000
CMD python app.py
❯ cat docker-compose.yaml
services:
redis:
image: redislabs/redismod
ports:
- '6379:6379'
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
❯ cat app.py
from flask import Flask, jsonify
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
redis.incr('hits')
counter = str(redis.get('hits'),'utf-8')
return { "message": "This webpage has been viewed {} time(s)".format(counter)}
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
❯ cat requirements.txt
flask
redis
Let us instantiate with okteto init
❯ okteto init
i Using default @ kind-macbook as context
✓ Okteto manifest (okteto.yml) deploy and build configured successfully
? Do you want to configure your development containers? [y/n]: y
✓ Development container 'redis' configured successfully
✓ Development container 'redisinsight' configured successfully
✓ Okteto manifest (okteto.yml) configured successfully
i Run 'okteto up' to activate your development container
Update the generated okteto.yaml
Activate DEV container and test
❯ okteto up
i Using default @ kind-macbook as context
i Development environment 'docker-compose' already deployed.
i To redeploy your development environment run 'okteto deploy' or 'okteto up [devName] --deploy'
✓ Development container 'web' selected
i Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'
✓ Images successfully pulled
✓ Files synchronized
Context: kind-macbook
Namespace: default
Name: web
Forward: 5000 -> 5000
Reverse: 9000 <- 9000
/code # ls
Dockerfile app.py docker-compose.yaml okteto.yml requirements.txt
/code # python app.py
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Serving Flask app 'app'
* Debug mode: on
* Running on all addresses (0.0.0.0)
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://127.0.0.1:5000
* Running on http://10.244.1.24:5000 (Press CTRL+C to quit)
* Restarting with stat
...
# localhost
❯ curl localhost:5000
{
"message": "This webpage has been viewed 1 time(s)"
}
Check the kubernetes objects created
❯ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/redis-6fb6c999bd-v7bxw 1/1 Running 0 21h
pod/web-okteto-578ffd7b8c-79scd 1/1 Running 0 11m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d19h
service/redis ClusterIP 10.96.197.159 <none> 6379/TCP 21h
service/web ClusterIP 10.96.250.54 <none> 5000/TCP 21h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/redis 1/1 1 1 21h
deployment.apps/web 0/0 0 0 21h
deployment.apps/web-okteto 1/1 1 1 21h
NAME DESIRED CURRENT READY AGE
replicaset.apps/redis-6fb6c999bd 1 1 1 21h
replicaset.apps/web-6444f97788 0 0 0 21h
replicaset.apps/web-6c45f74b85 0 0 0 21h
replicaset.apps/web-8849d7c 0 0 0 11m
replicaset.apps/web-okteto-578ffd7b8c 1 1 1 11m
replicaset.apps/web-okteto-654fd944fd 0 0 0 21h
Stop the DEV container
❯ okteto down
i Using default @ kind-macbook as context
✓ Development container 'web' selected
✓ Development container 'web' deactivated
Destroy deployment
❯ okteto destroy
i Using default @ kind-macbook as context
✓ Development environment 'docker-compose' successfully destroyed
Advanced configuration options
❯ cat docker-compose.yaml
services:
redis:
image: redislabs/redismod
ports:
- '6379:6379'
web:
# replica count
scale: 2
# environment variables (present in same dir as docker-compose.yaml)
env_file: app.env
# probe - command is also supported
healthcheck:
interval: 10s
timeout: 10m
retries: 5
start_period: 30s
http:
path: /healthz
port: 5000
# annotations
labels:
app: web
label_one: value_one
# resource requirements
deploy:
resources:
reservations:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
❯ cat app.env
DEBUG=1
FOO=bar
Apply and verify
❯ okteto deploy
i Using default @ kind-macbook as context
i Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'
✓ Endpoint 'web' created
✓ Service 'redis' created
✓ Service 'web' created
✓ Compose 'docker-compose' successfully deployed
There are no available endpoints for 'docker-compose'
✓ Development environment 'docker-compose' successfully deployed
i Run 'okteto up' to activate your development container
❯ kubectl get pod web-7fb866df6c-jl4bx -o jsonpath='{.spec.containers[0].resources}{.spec.containers[0].env}{.metadata.annotations}{.spec.containers[0].readinessProbe}'
{"limits":{"memory":"256Mi"},"requests":{"memory":"128Mi"}}[{"name":"DEBUG","value":"1"},{"name":"FOO","value":"bar"}]{"app":"web","label_one":"value_one"}{"failureThreshold":5,"httpGet":{"path":"/healthz","port":5000,"scheme":"HTTP"},"initialDelaySeconds":30,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":600}%
TODO
- Volume mounts
- Conditions leading to init containers?
Top comments (0)