Maybe this is a little bit off-topic. I would like to ask how you manage your dockerfile.
I have a git repo hosting my configurations (docker-compose, traefik, etc). Then, I have a python script that reads data from JSON, renders the placeholder inside these files (the {{replace_me}}
) by an actual value and outputs them to another directory. Finally, I cd
to that directory and run docker-compose up -f ...
. (This approach takes inspiration from the terraform
templatefile
)
That JSON file is generated by some terraform code, along with terraform code for other stuffs (storage bucket, vps, dns, etc).
It works well for me so far. Especially for:
- templating
traefik toml
configuration (I like it a lot more than the label approach). - secret in the docker env file (so my docker.env file has the form of
secrect={{secret}}
.
I know most templating docker part can be replaced by directly interpolating with environment variables but I don’t really like it because it seems environment variables are not persistent.
Do you have any suggestions for my workflow ? I am always feel a litte bit off about this approach.
Edit: Thank you for your suggestions. I will try k8s
for edge computing and if it does not work really well, I will stick with my current approach.
Here is an ansible role that will create a compose file using variables passed in. ironicbadger/ansible-role-docker-compose-generator
I tried this but ended up using ansible directly to manage my containers.
I was recently helping someone working on a mini-project to do a bit of parsing of docker compose files, when I discovered that the docker compose spec is published as JSON Schema here.
I converted that into TypeScript types using JSON Schema to TypeScript. So I can create docker compose config in code and then just export it as yaml - I have a build/deploy script that does this at the end.
But now the great thing is that I can export/import that config, share it between projects, extend configs, mix-in, and so on. I’ve just started doing it and it’s been really nice so far, when I get a chance and it’s stabilised a bit I’m going to tidy it up and share it. But there’s not much I’ve added beyond the above at the moment (just some bits to mix-in arrays, which was what set me off on this whole thing!)
so you are also generating the docker-compose from code. I think I am looking for something that aware of both templating and docker-compose deployment because right now, at the end of the day, I am still have to run
docker-compose up -f ...
whilehelm
can do both templating and deployment.
So far I just hand roll my docker-compose (at home, anyway). However, docker-compose does also support overrides via yaml merging, maybe that’s worth looking into?
My idea with that is to have a base compose that configures also my services and then to have a few override yamls with environment specific stuff (like prod, local, …)
This is similar to Kustomize from kubernetes land which I’ve worked with in the past
I actually need more than merging. For example, right now my
traefik.template
will look like this:[http.routers.{{ router_name }}] rule = "{{ router_rule }}" service = "{{ service_name }}" middlewares = [{{ middlewares | map("tojson") | join(", ") }}] {% block router %}{% endblock %} [http.routers.{{ router_name }}.tls] certResolver = "leresolver_http" {% if service_host is defined %} [[http.services.{{ service_name }}.loadBalancer.servers]] url = "{{ 'https' if service_use_https is defined else 'http' }}://{{ service_host }}{{ ':' ~ service_port if service_port is defined else '' }}" {% endif %}
and then one of my
traefik.toml
could look like this{% extends "template/traefik.jinja" %} {% set router_name = "dozzle" %} {% set router_rule = "Host(`dozzle.example.com`)" %} {% set service_name = "dozzle" %} {% set service_host = "dozzle" %} {% set service_port = 8080 %}
This is definitely a job for templating, seems you’ve got the right tool to me!
I was using file merging, but one issue I found was that arrays don’t get merged - and since switching to use Traefik (which is great) there are a lot of arrays in the config! And I’ve since started using labels for my own tooling too.