feat(compose): Work with a registry

This commit is contained in:
hygienic-books 2023-10-13 02:06:56 +02:00
parent d98de5aff0
commit e5e78a0527
12 changed files with 57 additions and 16 deletions

View File

@ -39,7 +39,7 @@ docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --en
## Copy to target ## Copy to target
Copy images to target Docker host, that is assuming you deploy to a machine that itself has no network route to reach Docker Hub. Copying in its simplest form involves a local `docker save` and a remote `docker load`. Consider the helper mini-project [quico.space/Quico/copy-docker](https://quico.space/Quico/copy-docker) where [copy-docker.sh](https://quico.space/Quico/copy-docker/src/branch/main/copy-docker.sh) allows the following workflow: Copy images to target Docker host, that is assuming you deploy to a machine that itself has no network route to reach Docker Hub or your private registry of choice. Copying in its simplest form involves a local `docker save` and a remote `docker load`. Consider the helper mini-project [quico.space/Quico/copy-docker](https://quico.space/Quico/copy-docker) where [copy-docker.sh](https://quico.space/Quico/copy-docker/src/branch/main/copy-docker.sh) allows the following workflow:
``` ```
source "${COMPOSE_ENV}" source "${COMPOSE_ENV}"

View File

@ -1,5 +1,6 @@
services: services:
grafana-build: grafana-build:
# FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "grafana:${GRAFANA_VERSION}" image: "grafana:${GRAFANA_VERSION}"
profiles: ["build", "build-grafana"] profiles: ["build", "build-grafana"]
build: build:
@ -9,6 +10,7 @@ services:
EXAMPLE_ARG_FOR_DOCKERFILE: "${EXAMPLE_ARG_FROM_ENV_FILE}" EXAMPLE_ARG_FOR_DOCKERFILE: "${EXAMPLE_ARG_FROM_ENV_FILE}"
GRAFANA_VERSION: "${GRAFANA_VERSION}" GRAFANA_VERSION: "${GRAFANA_VERSION}"
nginx-build: nginx-build:
# FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "nginx:${NGINX_VERSION}" image: "nginx:${NGINX_VERSION}"
profiles: ["build", "build-nginx"] profiles: ["build", "build-nginx"]
build: build:

View File

@ -1,6 +1,6 @@
services: services:
grafana: grafana:
# FIXME Docker Hub image name with or without slash? FIXME # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "grafana:${GRAFANA_VERSION}" image: "grafana:${GRAFANA_VERSION}"
container_name: "grafana-grafana-${CONTEXT}" container_name: "grafana-grafana-${CONTEXT}"
networks: networks:
@ -29,7 +29,7 @@ services:
# GRAFANA_USER: ${GRAFANA_USER} # GRAFANA_USER: ${GRAFANA_USER}
# GRAFANA_PASSWORD: ${GRAFANA_PASSWORD} # GRAFANA_PASSWORD: ${GRAFANA_PASSWORD}
nginx: nginx:
# FIXME Docker Hub image name with or without slash? FIXME # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "nginx:${NGINX_VERSION}" image: "nginx:${NGINX_VERSION}"
container_name: "grafana-nginx-${CONTEXT}" container_name: "grafana-nginx-${CONTEXT}"
networks: networks:

View File

@ -7,6 +7,7 @@ CONTEXT=ux_vilnius
# GRAFANA_VERSION=x.y.z # GRAFANA_VERSION=x.y.z
# NGINX_VERSION=x.y.z # NGINX_VERSION=x.y.z
# GRAFANA_VIP=10.1.1.2 # GRAFANA_VIP=10.1.1.2
# GRAFANA_BUILD_DATE=20230731

View File

@ -32,15 +32,28 @@ docker context create fully.qualified.domain.name --docker 'host=ssh://root@full
## Build ## Build
> Skip to [Pull](#pull) if you already have images in your private registry ready to use. Otherwise read on to build them now.
FIXME We build the `vault` image locally. Our adjustment to the official image is simply adding `/tmp/vault` to it. See [build-context/Dockerfile](build-context/Dockerfile). We use `/tmp/vault` to bind-mount a dedicated ZFS dataset for the application's `tmpdir` location. FIXME We build the `vault` image locally. Our adjustment to the official image is simply adding `/tmp/vault` to it. See [build-context/Dockerfile](build-context/Dockerfile). We use `/tmp/vault` to bind-mount a dedicated ZFS dataset for the application's `tmpdir` location.
``` ```
docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --file "${COMPOSE_OVERRIDE}" --env-file "${COMPOSE_ENV}" --profile 'build-vault' build docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --file "${COMPOSE_OVERRIDE}" --env-file "${COMPOSE_ENV}" --profile 'build-vault' build
``` ```
## Push
Push to Docker Hub or your private registry. Setting up a private registry is out of scope of this repo.
```
source "${COMPOSE_ENV}"
docker push "registry.example.com/project/vault:${VAULT_BUILD_DATE}-${VAULT_VERSION}"
```
## Pull ## Pull
FIXME Rewrite either [Build](#build) or this paragraph for which images are built and which ones pulled, `--profile 'full'` may not make sense FIXME Pull images from Docker Hub verbatim. > Skip this step if you just built images that still exist locally on your build host.
FIXME Rewrite either [Build](#build) or this paragraph for which images are built and which ones pulled, `--profile 'full'` may not make sense.
``` ```
docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' pull docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' pull
@ -48,7 +61,7 @@ docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --en
## Copy to target ## Copy to target
Copy images to target Docker host, that is assuming you deploy to a machine that itself has no network route to reach Docker Hub. Copying in its simplest form involves a local `docker save` and a remote `docker load`. Consider the helper mini-project [quico.space/Quico/copy-docker](https://quico.space/Quico/copy-docker) where [copy-docker.sh](https://quico.space/Quico/copy-docker/src/branch/main/copy-docker.sh) allows the following workflow: Copy images to target Docker host, that is assuming you deploy to a machine that itself has no network route to reach Docker Hub or your private registry of choice. Copying in its simplest form involves a local `docker save` and a remote `docker load`. Consider the helper mini-project [quico.space/Quico/copy-docker](https://quico.space/Quico/copy-docker) where [copy-docker.sh](https://quico.space/Quico/copy-docker/src/branch/main/copy-docker.sh) allows the following workflow:
``` ```
source "${COMPOSE_ENV}" source "${COMPOSE_ENV}"

View File

@ -1,6 +1,7 @@
services: services:
vault-build: vault-build:
image: "vault:${VAULT_VERSION}" # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "registry.example.com/project/vault:${VAULT_BUILD_DATE}-${VAULT_VERSION}"
profiles: ["build"] profiles: ["build"]
build: build:
context: "build-context/vault" context: "build-context/vault"

View File

@ -1,7 +1,7 @@
services: services:
vault: vault:
# FIXME Docker Hub image name with or without slash? FIXME # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "vault:${VAULT_VERSION}" image: "registry.example.com/project/vault:${VAULT_BUILD_DATE}-${VAULT_VERSION}"
container_name: "vault-${CONTEXT}" container_name: "vault-${CONTEXT}"
networks: networks:
vault-default: vault-default:

View File

@ -6,6 +6,7 @@ CONTEXT=ux_vilnius
# --- # ---
# VAULT_VERSION=x.y.z # VAULT_VERSION=x.y.z
# VAULT_VIP=10.1.1.2 # VAULT_VIP=10.1.1.2
# VAULT_BUILD_DATE=20230731

View File

@ -36,18 +36,38 @@ docker context create fully.qualified.domain.name --docker 'host=ssh://root@full
{% set components = cookiecutter.__component_list_slug.split(',') -%} {% set components = cookiecutter.__component_list_slug.split(',') -%}
{%- for component in components %} {%- for component in components %}
{%- if loop.first %} {%- if loop.first %}
> Skip to [Pull](#pull) if you already have images in your private registry ready to use. Otherwise read on to build them now.
FIXME We build the `{{ cookiecutter.__service_slug }}` image locally. Our adjustment to the official image is simply adding `/tmp/{{ cookiecutter.__service_slug }}` to it. See {% if ',' in cookiecutter.__component_list_slug %}[build-context/{{ cookiecutter.__service_slug }}/Dockerfile](build-context/{{ cookiecutter.__service_slug }}/Dockerfile){%- else %}[build-context/Dockerfile](build-context/Dockerfile){%- endif %}. We use `/tmp/{{ cookiecutter.__service_slug }}` to bind-mount a dedicated ZFS dataset for the application's `tmpdir` location. FIXME We build the `{{ cookiecutter.__service_slug }}` image locally. Our adjustment to the official image is simply adding `/tmp/{{ cookiecutter.__service_slug }}` to it. See {% if ',' in cookiecutter.__component_list_slug %}[build-context/{{ cookiecutter.__service_slug }}/Dockerfile](build-context/{{ cookiecutter.__service_slug }}/Dockerfile){%- else %}[build-context/Dockerfile](build-context/Dockerfile){%- endif %}. We use `/tmp/{{ cookiecutter.__service_slug }}` to bind-mount a dedicated ZFS dataset for the application's `tmpdir` location.
``` ```
docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --file "${COMPOSE_OVERRIDE}" --env-file "${COMPOSE_ENV}" --profile 'build-{{ cookiecutter.__service_slug }}' build docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --file "${COMPOSE_OVERRIDE}" --env-file "${COMPOSE_ENV}" --profile 'build-{{ cookiecutter.__service_slug }}' build
``` ```
{%- endif %} {%- endif %}
{%- endfor %} {% endfor %}
## Push
Push to Docker Hub or your private registry. Setting up a private registry is out of scope of this repo.
```
source "${COMPOSE_ENV}"
{%- set components = cookiecutter.__component_list_slug.split(',') -%}
{%- if ',' in cookiecutter.__component_list_slug %}
for image in{% for component in components %} \
'{%- if cookiecutter.build == "yes" -%}{%- if loop.first -%}registry.example.com/project/{%- endif -%}{%- endif -%}{{ component }}:'"{%- if cookiecutter.build == "yes" -%}{%- if loop.first -%}${% raw %}{{% endraw %}{{ component.upper() }}_BUILD_DATE{% raw %}}{% endraw %}-{%- endif -%}{%- endif -%}${% raw %}{{% endraw %}{{ component.upper() }}_VERSION{% raw %}}{% endraw %}"{%- endfor %}; do
docker push 'registry.example.com/project/'"${image}"
done
{%- else %}
docker push "{%- if cookiecutter.build == "yes" -%}registry.example.com/project/{%- endif -%}{{ cookiecutter.__component_list_slug }}:{%- if cookiecutter.build == "yes" -%}${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_BUILD_DATE{% raw %}}{% endraw %}-{%- endif -%}${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_VERSION{% raw %}}{% endraw %}"
{%- endif %}
```
{%- endif %} {%- endif %}
## Pull ## Pull
{% if cookiecutter.build == "yes" %}FIXME Rewrite either [Build](#build) or this paragraph for which images are built and which ones pulled, `--profile 'full'` may not make sense FIXME {% endif %}Pull images from Docker Hub verbatim. {% if cookiecutter.build == "yes" %}> Skip this step if you just built images that still exist locally on your build host.
FIXME Rewrite either [Build](#build) or this paragraph for which images are built and which ones pulled, `--profile 'full'` may not make sense.{% else %}Pull images from Docker Hub verbatim.{% endif %}
``` ```
docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' pull docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' pull

View File

@ -3,7 +3,8 @@ services:
{%- set components = cookiecutter.__component_list_slug.split(',') -%} {%- set components = cookiecutter.__component_list_slug.split(',') -%}
{% for component in components %} {% for component in components %}
{{ component }}-build: {{ component }}-build:
image: "{{ component }}:${% raw %}{{% endraw %}{{ component.upper() }}_VERSION{% raw %}}{% endraw %}" # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "{%- if cookiecutter.build == "yes" -%}{%- if loop.first -%}registry.example.com/project/{%- endif -%}{%- endif -%}{{ component }}:{%- if cookiecutter.build == "yes" -%}{%- if loop.first -%}${% raw %}{{% endraw %}{{ component.upper() }}_BUILD_DATE{% raw %}}{% endraw %}-{%- endif -%}{%- endif -%}${% raw %}{{% endraw %}{{ component.upper() }}_VERSION{% raw %}}{% endraw %}"
profiles: ["build", "build-{{ component }}"] profiles: ["build", "build-{{ component }}"]
build: build:
context: "build-context/{{ component }}" context: "build-context/{{ component }}"
@ -14,7 +15,8 @@ services:
{%- endfor %} {%- endfor %}
{%- else %} {%- else %}
{{ cookiecutter.__component_list_slug }}-build: {{ cookiecutter.__component_list_slug }}-build:
image: "{{ cookiecutter.__component_list_slug }}:${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_VERSION{% raw %}}{% endraw %}" # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "{%- if cookiecutter.build == "yes" -%}registry.example.com/project/{%- endif -%}{{ cookiecutter.__component_list_slug }}:{%- if cookiecutter.build == "yes" -%}${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_BUILD_DATE{% raw %}}{% endraw %}-{%- endif -%}${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_VERSION{% raw %}}{% endraw %}"
profiles: ["build"] profiles: ["build"]
build: build:
context: "build-context/{{ cookiecutter.__component_list_slug }}" context: "build-context/{{ cookiecutter.__component_list_slug }}"

View File

@ -12,8 +12,8 @@ services:
{%- endfor -%} {%- endfor -%}
{%- for component in components %} {%- for component in components %}
{{ component }}: {{ component }}:
# FIXME Docker Hub image name with or without slash? FIXME # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "{{ component }}:${% raw %}{{% endraw %}{{ component.upper() }}_VERSION{% raw %}}{% endraw %}" image: "{%- if cookiecutter.build == "yes" -%}{%- if loop.first -%}registry.example.com/project/{%- endif -%}{%- endif -%}{{ component }}:{%- if cookiecutter.build == "yes" -%}{%- if loop.first -%}${% raw %}{{% endraw %}{{ component.upper() }}_BUILD_DATE{% raw %}}{% endraw %}-{%- endif -%}{%- endif -%}${% raw %}{{% endraw %}{{ component.upper() }}_VERSION{% raw %}}{% endraw %}"
container_name: "{{ cookiecutter.__service_slug }}-{{ component }}-${CONTEXT}" container_name: "{{ cookiecutter.__service_slug }}-{{ component }}-${CONTEXT}"
networks: networks:
{{ cookiecutter.__service_slug }}-default: {{ cookiecutter.__service_slug }}-default:
@ -52,8 +52,8 @@ services:
{%- endfor -%} {%- endfor -%}
{%- else %} {%- else %}
{{ cookiecutter.__component_list_slug }}: {{ cookiecutter.__component_list_slug }}:
# FIXME Docker Hub image name with or without slash? FIXME # FIXME image name with or without slash? Docker Hub or private registry? With or without *_BUILD_DATE? FIXME
image: "{{ cookiecutter.__component_list_slug }}:${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_VERSION{% raw %}}{% endraw %}" image: "{%- if cookiecutter.build == "yes" -%}registry.example.com/project/{%- endif -%}{{ cookiecutter.__component_list_slug }}:{%- if cookiecutter.build == "yes" -%}${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_BUILD_DATE{% raw %}}{% endraw %}-{%- endif -%}${% raw %}{{% endraw %}{{ cookiecutter.__component_list_slug.upper() }}_VERSION{% raw %}}{% endraw %}"
container_name: "{{ cookiecutter.__service_slug }}-${CONTEXT}" container_name: "{{ cookiecutter.__service_slug }}-${CONTEXT}"
networks: networks:
{{ cookiecutter.__service_slug }}-default: {{ cookiecutter.__service_slug }}-default:

View File

@ -11,6 +11,7 @@ CONTEXT=ux_vilnius
{%- for component in components %} {%- for component in components %}
{%- if loop.first %} {%- if loop.first %}
# {{ component.upper() }}_VIP=10.1.1.2 # {{ component.upper() }}_VIP=10.1.1.2
# {{ component.upper() }}_BUILD_DATE=20230731
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}