2
0
mirror of https://github.com/frappe/frappe_docker.git synced 2024-11-08 14:21:05 +00:00
frappe_docker/docs/list-of-containers.md
Revant Nandgaonkar e6088af885
refactor: build only one frappe/erpnext image (#1032)
* ci: skip frappe builds

* refactor: build only one frappe/erpnext image

* fix: lint nginx entrypoint script

* docs: update and organize docs

* docs: fix lint errors

* fix(custom): pass base64 encoded apps json

* ci: update dependabot

* docs: update contributing

* docs: remove info about multi image setup

* fix: initiate empty common_site_config.json

default config has host keys set to localhost
causes connection errors

* docs: add details for pwd volumes

* fix: symlink assets instead of copy

* fix: nginx private files

* ci: skip docker compose v2 install for ubuntu-latest

* fix: organize layers

* feat: allow remove git remote for custom image

* docs: allow remove git remote for custom image

* fix: remove duplicate --apps_path
2023-01-16 04:20:09 +05:30

4.2 KiB

Images

There's 4 images that you can find in /images directory:

  • bench. It is used for development. Learn more how to start development.
  • production.
    • Multi-purpose Python backend. Runs Werkzeug server with gunicorn, queues (via bench worker), or schedule (via bench schedule).
    • Contains JS and CSS assets and routes incoming requests using nginx.
    • Processes realtime websocket requests using Socket.IO.
  • custom. It is used to build bench using apps.json file set with --apps_path during bench initialization. apps.json is a json array. e.g. [{"url":"{{repo_url}}","branch":"{{repo_branch}}"}]

Image has everything we need to be able to run all processes that Frappe framework requires (take a look at Bench Procfile reference). We follow Docker best practices and split these processes to different containers.

We use multi-stage builds and Docker Buildx to reuse as much things as possible and make our builds more efficient.

Compose files

After building the images we have to run the containers. The best and simplest way to do this is to use compose files.

We have one main compose file, compose.yaml. Services described, networking, volumes are also handled there.

Services

All services are described in compose.yaml

  • configurator. Updates common_site_config.json so Frappe knows how to access db and redis. It is executed on every docker-compose up (and exited immediately). Other services start after this container exits successfully.
  • backend. Werkzeug server.
  • db. Optional service that runs MariaDB if you also use overrides/compose.mariadb.yaml or Postgres if you also use overrides/compose.postgres.yaml.
  • redis. Optional service that runs Redis server with cache, Socket.IO and queues data.
  • frontend. nginx server that serves JS/CSS assets and routes incoming requests.
  • proxy. Traefik proxy. It is here for complicated setups or HTTPS override (with overrides/compose.https.yaml).
  • websocket. Node server that runs Socket.IO.
  • queue-short, queue-default, queue-long. Python servers that run job queues using rq.
  • scheduler. Python server that runs tasks on schedule using schedule.

Overrides

We have several overrides:

  • overrides/compose.proxy.yaml. Adds traefik proxy to setup.
  • overrides/compose.noproxy.yaml. Publishes frontend ports directly without any proxy.
  • overrides/compose.https.yaml. Automatically sets up Let's Encrypt certificate and redirects all requests to directed to http, to https.
  • overrides/compose.mariadb.yaml. Adds db service and sets its image to MariaDB.
  • overrides/compose.postgres.yaml. Adds db service and sets its image to Postgres. Note that ERPNext currently doesn't support Postgres.
  • overrides/compose.redis.yaml. Adds redis service and sets its image to redis.

It is quite simple to run overrides. All we need to do is to specify compose files that should be used by docker-compose. For example, we want ERPNext:

# Point to main compose file (compose.yaml) and add one more.
docker-compose -f compose.yaml -f overrides/compose.redis.yaml config

⚠ Make sure to use docker-compose v2 (run docker-compose -v to check). If you want to use v1 make sure the correct $-signs as they get duplicated by the config command!

That's it! Of course, we also have to setup .env before all of that, but that's not the point.

Check environment variables for more.