Compartir comentarios
Las respuestas se generan en base a la documentación.

Empaquetar y desplegar aplicaciones de Docker Compose como artefactos OCI

Requiere: Docker Compose 2.34.0 y posterior

Docker Compose admite el trabajo con artefactos OCI, lo que permite empaquetar y distribuir tus aplicaciones de Compose a través de registros de contenedores. Esto significa que puedes almacenar tus archivos de Compose junto con tus imágenes de contenedor, facilitando el control de versiones, el intercambio y el despliegue de tus aplicaciones multi-contenedor.

Publica tu aplicación de Compose como un artefacto OCI

Para distribuir tu aplicación de Compose como un artefacto OCI, puedes utilizar el comando docker compose publish a fin de publicarla en un registro compatible con OCI. Esto permite que otros usuarios desplieguen tu aplicación directamente desde el registro.

La función de publicación admite la mayoría de las capacidades de composición de Compose, como sobrescrituras (overrides), extensiones (extends) o inclusiones (include), con algunas limitaciones.

Pasos generales

  1. Ve al directorio de tu aplicación de Compose.
    Asegúrate de estar en el directorio que contiene tu archivo compose.yaml o de estar especificando tu archivo de Compose con la bandera -f.

  2. En tu terminal, inicia sesión en tu cuenta de Docker para autenticarte con Docker Hub.

    $ docker login
    
  3. Utiliza el comando docker compose publish para enviar (push) tu aplicación como un artefacto OCI:

    $ docker compose publish username/my-compose-app:latest
    

    Si tienes múltiples archivos de Compose, ejecuta:

    $ docker compose -f compose-base.yml -f compose-production.yml publish username/my-compose-app:latest
    

Opciones avanzadas de publicación

Al publicar, puedes pasar opciones adicionales:

  • --oci-version: Especifica la versión de OCI (por defecto se determina automáticamente).
  • --resolve-image-digests: Vincula las etiquetas de imagen a los resúmenes (digests).
  • --with-env: Incluye variables de entorno en el artefacto OCI publicado.

Compose realiza comprobaciones para asegurarse de que no haya datos sensibles en tu configuración y muestra tus variables de entorno para confirmar que deseas publicarlas.

...
you are about to publish sensitive data within your OCI artifact.
please double check that you are not leaking sensitive data
AWS Client ID
"services.serviceA.environment.AWS_ACCESS_KEY_ID": xxxxxxxxxx
AWS Secret Key
"services.serviceA.environment.AWS_SECRET_ACCESS_KEY": aws"xxxx/xxxx+xxxx+"
Github authentication
"GITHUB_TOKEN": ghp_xxxxxxxxxx
JSON Web Token
"": xxxxxxx.xxxxxxxx.xxxxxxxx
Private Key
"": -----BEGIN DSA PRIVATE KEY-----
xxxxx
-----END DSA PRIVATE KEY-----
Are you ok to publish these sensitive data? [y/N]:y

you are about to publish environment variables within your OCI artifact.
please double check that you are not leaking sensitive data
Service/Config  serviceA
FOO=bar
Service/Config  serviceB
FOO=bar
QUIX=
BAR=baz
Are you ok to publish these environment variables? [y/N]:

Si rechazas la confirmación, el proceso de publicación se detiene sin enviar nada al registro.

Limitaciones

Existen limitaciones para publicar aplicaciones de Compose como artefactos OCI. No puedes publicar una configuración de Compose:

  • Con servicios que contengan montajes de vinculación (bind mounts).
  • Con servicios que contengan únicamente una sección build.
  • Que incluya archivos locales con el atributo include. Para realizar la publicación con éxito, asegúrate de que todos los archivos locales incluidos también estén publicados. Después podrás usar include para hacer referencia a estos archivos, ya que se admite el uso de include remoto.

Iniciar una aplicación de artefacto OCI

Para iniciar una aplicación de Docker Compose que utiliza un artefacto OCI, puedes emplear la bandera -f (o --file) seguida de la referencia al artefacto OCI. Esto te permite especificar un archivo de Compose almacenado como un artefacto OCI en un registro.

El prefijo oci:// indica que el archivo de Compose debe descargarse de un registro compatible con OCI en lugar de cargarse desde el sistema de archivos local.

$ docker compose -f oci://docker.io/username/my-compose-app:latest up

Para ejecutar luego la aplicación de Compose, utiliza el comando docker compose up con la bandera -f apuntando a tu artefacto OCI:

$ docker compose -f oci://docker.io/username/my-compose-app:latest up

Solución de problemas (Troubleshooting)

Cuando ejecutas una aplicación desde un artefacto OCI, Compose puede mostrar mensajes de advertencia que requieren tu confirmación para limitar el riesgo de ejecutar una aplicación maliciosa:

  • Una lista de las variables de interpolación utilizadas junto con sus valores.
  • Una lista de todas las variables de entorno utilizadas por la aplicación.
  • Si tu aplicación de artefacto OCI está utilizando otros recursos remotos, por ejemplo, a través de include.
$ REGISTRY=myregistry.com docker compose -f oci://docker.io/username/my-compose-app:latest up

Found the following variables in configuration:
VARIABLE     VALUE                SOURCE        REQUIRED    DEFAULT
REGISTRY     myregistry.com      command-line   yes
TAG          v1.0                environment    no          latest
DOCKERFILE   Dockerfile          default        no          Dockerfile
API_KEY      <unset>             none           no

Do you want to proceed with these variables? [Y/n]:y

Warning: This Compose project includes files from remote sources:
- oci://registry.example.com/stack:latest
Remote includes could potentially be malicious. Make sure you trust the source.
Do you want to continue? [y/N]:

Si aceptas iniciar la aplicación, Compose muestra el directorio donde se han descargado todos los recursos del artefacto OCI:

...
Do you want to continue? [y/N]: y

Your compose stack "oci://registry.example.com/stack:latest" is stored in "~/Library/Caches/docker-compose/964e715660d6f6c3b384e05e7338613795f7dcd3613890cfa57e3540353b9d6d"

El comando docker compose publish admite la ejecución no interactiva, lo que te permite omitir el mensaje de confirmación incluyendo la bandera -y (o --yes):

$ docker compose publish -y username/my-compose-app:latest

Siguientes pasos