SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
docker community
ALL HANDS #6
Desarrollando una
Extensión para Docker
Angel Borroy
Developer Evangelist, Hyland
@AngelBorroy
1 de Septiembre de 2022
SDK para
Extensiones Docker
● Introducción a Extensiones
● Primeros pasos
● Herramientas de Desarrollo
● API JavaScript
● Diseño de la Interfaz de Usuario
Las extensiones se ejecutan como
Contenedores Linux en Docker*
* Las Extensiones no están disponibles cuando se usan Contenedores Windows
SDK para Extensiones de Docker
https://docs.docker.com/desktop/extensions/
https://github.com/docker/extensions-sdk
Documentación oficial (en inglés)
Desarrollo de extensiones
Publicación de extensiones en el Marketplace
Guías para el diseño del interfaz de usuario
Referencia de la API
Código fuente del CLI y ejemplos de creación de extensiones
Extensión frontend
Extensión backend
Extensión Docker CLI
Extensión utilizando React-JS para el frontend
$ docker extension init my-extension
Dockerfile
docker-compose.yaml
metadata.json
Makefile
docker.svg
vm/
ui/
Primeros pasos
Requisitos
Docker Desktop
Node.js
Go
Make
IDE
Visual Studio Code
Imagen Docker
Datos de la Extensión
Herramientas
Icono de la Extensión
Backend
Frontend
$ docker extension
init Crea una nueva Extensión a partir de una plantilla
install Instala la Extensión en Docker Desktop a partir de una Imagen
ls Lista las Extensiones Docker instaladas en Docker Desktop
rm Elimina una Extensión de Docker Desktop
update Elimina y re-instala una Extensión de Docker Desktop
validate Valida una Extensión a partir de una Imagen o sus metadatos
version Muestra la versión de cliente y servidor
Herramientas de desarrollo
$ docker extension dev
debug Habilita el modo depuración para el UI de una Extensión
ui-source Establece un origen para el UI de una Extensión
reset Restablece el origen y deshabilita el modo depuración para el UI
Herramientas de desarrollo
$ make <target>
build-extension: docker build --tag=$(IMAGE):$(TAG) .
install-extension: build-extension
docker extension install $(IMAGE):$(TAG)
update-extension: build-extension
docker extension update $(IMAGE):$(TAG)
API para Interfaz de Usuario (UI)
API JavaScript con soporte para TypeScript
import { createDockerDesktopClient } from '@docker/extension-api-client';
export function App() {
const ddClient = createDockerDesktopClient();
}
Backend Peticiones HTTP, ejecución de comandos (sistema operativo)
Docker Ejecución de comandos Docker
Dashboard Muestra notificaciones de usuario en Docker Desktop
Navigation Navega a otro apartado de Docker Desktop
https://docs.docker.com/desktop/extensions-sdk/dev/api/overview/
Diseño de la Interfaz de Usuario (UI)
Puede utilizarse cualquier tecnología de desarrollo para la Interfaz de Usuario
(incluso simple HTML)
Sin embargo, dado que la Interfaz de Usuario de Docker Desktop está escrito en
React y Material UI es muy recomendable utilizar esta combinación
Además de la tecnología, Docker propone esta simple lista de comprobaciones para
el diseño de la Interfaz de Usuario:
• ¿Es fácil lanzar la Extensión?
• ¿Es fácil utilizar la Extensión?
• ¿Es fácil acceder a la ayuda cuando es necesario?
https://docs.docker.com/desktop/extensions-sdk/design/design-guidelines/
● Objetivo
● Componentes de la Extensión
● Estructura de la Extensión
● Despliegue y Ejecución
Alfresco
Docker Extension
https://github.com/AlfrescoLabs/alfresco-docker-extension
Objetivo
Desplegar todos los contenedores requeridos para Alfresco a través de un botón en el UI
Elimina la dependencia de un fichero externo, como docker-compose.yml
Proporciona seguimiento de la ejecución de los contenedores
Facilita la gestión de recursos
Minimiza las barreras para utilizar Alfresco
Run
aaa
Componentes de la Extensión
API
Backend Peticiones HTTP, ejecución…
Docker Ejecución de comandos Docker
Dashboard Muestra notificaciones…
Navigation Navega a otro apartado de Docker Desktop
Dockerfile
docker-compose.yaml
metadata.json
Makefile
alfresco.svg
vm/
ui/
Estructura de la Extensión
Docker
Navigation
Despliegue y Ejecución
$ make install-extension
● Respuestas de ddClient
● Utiliza el log de la Consola
JavaScript
● Probar con diferentes Sistemas
Operativos
● Probar con diferentes Temas
(oscuro / claro)
Algunos Consejos
Respuesta de ddClient (JSON)
const result = await ddClient.docker.cli.exec('info', [
'--format',
'"{{json .}}"'
])
return result.parseJsonObject()?.MemTotal
La respuesta es asíncrona, utiliza await para esperar al resultado
Utiliza el formato JSON en las invocaciones al cliente Docker
Parsea el resultado para obtener el valor de las propiedades
{
"Containers": 6,
"ContainersRunning": 0,
"ContainersPaused": 0,
"ContainersStopped": 6,
"Images": 9,
"Driver": "overlay2",
"DriverStatus": [...],
"Plugins": {...},
"NCPU": 6,
"MemTotal": 20992327680,
...
}
Respuesta de ddClient (Lista de Ids)
const result = await ddClient.docker.cli.exec('ps’, ['-q'])
var containers = result.stdout.split(/r?n|r|n/g)
En ocasiones también puedes obtener una lista simple con -q
Divide el resultado por salto de línea para obtener cada elemento
57f249e609d6
bd448227ea37
9efdaf7e7eeb
a847d20cd8af
82363cdde627
Respuesta de ddClient (Lista de JSON)
const result = await ddClient.docker.cli.exec('ps’,
'--format',
'"{{json .}}"'
])
var containers = result.stdout.split(/r?n|r|n/g)
for(let i = 0; i < containers.length; i++) {
let json = JSON.parse(containers[i])
}
Algunos comandos devuelven una lista de líneas JSON
No puede parsearse toda la respuesta como un documento JSON,
pero puede divirse el resultado por salto de línea para obtener cada
elemento JSON
{"Command":""catalina.sh ...}
{"Command":""/bin/sh -c ...}
{"Command":""/bin/sh -c ...}
{"Command":""/bin/sh -c ...}
Log de la consola JavaScript
try {
ddClient.docker...
} catch (err) {
console.log("error : ", err)
}
Utiliza los comandos a Docker en bloques try-catch
Puedes volcar los detalles del error en la consola JavaScript
Recuerda arrancar la Extensión Docker en modo desarrollo
docker extension dev debug angelborroy/alfresco-extension
Probar con diferentes Sistemas Operativos
export const stopContainers = async () => {
await ddClient.docker.cli.exec('stop', [
'$(docker ps -qf "network=alfresco")'
])
}
Funciona en Mac OS con chip Intel
Falla en Windows 10
>> Todavía está en fase BETA
¡Puedes reportar los errores que identifiques en GitHub!
Probar con diferentes Temas
Es recomendable utilizar la guía de diseño de Docker, que tiene en cuenta todos los
elementos del Interfaz Gráfico para el tema Oscuro y para el tema Claro
https://docs.docker.com/desktop/extensions-sdk/design/design-guidelines/
No obstante, recuerda revisar el resultado cuando añadas recursos como imágenes
¡Gracias!
@AngelBorroy
angel.fernandoborroy@hyland.com
https://collabnix.github.io/docker-community-extensions/
mantenida por Ajeet Singh Raina

Más contenido relacionado

Similar a Desarrollando una Extensión para Docker

Jenkins Peru Meetup Docker Ecosystem
Jenkins Peru Meetup Docker EcosystemJenkins Peru Meetup Docker Ecosystem
Jenkins Peru Meetup Docker EcosystemMario IC
 
Introducción a Docker
Introducción a DockerIntroducción a Docker
Introducción a DockerOpen Canarias
 
Introducción al desarrollo de aplicaciones para Android
Introducción al desarrollo de aplicaciones para AndroidIntroducción al desarrollo de aplicaciones para Android
Introducción al desarrollo de aplicaciones para AndroidArmando Picón Z.
 
Corriendo SQL Server en Docker
Corriendo SQL Server en DockerCorriendo SQL Server en Docker
Corriendo SQL Server en DockerJavier Villegas
 
Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019
Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019 Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019
Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019 Santi Macias Rodriguez
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Micael Gallego
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJCMicael Gallego
 
Preparación del entorno de desarrollo de android
Preparación del entorno de desarrollo de androidPreparación del entorno de desarrollo de android
Preparación del entorno de desarrollo de androidNelson Samir Ríos Ramos
 
Game of pods - Kubernetes
Game of pods - KubernetesGame of pods - Kubernetes
Game of pods - Kubernetesjdezine
 
Elias Grande - Dagda [rootedvlc4]
Elias Grande - Dagda [rootedvlc4]Elias Grande - Dagda [rootedvlc4]
Elias Grande - Dagda [rootedvlc4]RootedCON
 
Workshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los ContenedoresWorkshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los ContenedoresJesús A. Rodríguez B.
 
Docker para Data Scientist - Master en Data Science URJC
Docker para Data Scientist - Master en Data Science URJCDocker para Data Scientist - Master en Data Science URJC
Docker para Data Scientist - Master en Data Science URJCMicael Gallego
 
Seminario CLEFormacion-docker
Seminario CLEFormacion-dockerSeminario CLEFormacion-docker
Seminario CLEFormacion-dockerCLEFormación
 

Similar a Desarrollando una Extensión para Docker (20)

Jenkins Peru Meetup Docker Ecosystem
Jenkins Peru Meetup Docker EcosystemJenkins Peru Meetup Docker Ecosystem
Jenkins Peru Meetup Docker Ecosystem
 
introducción a flutter
introducción a flutterintroducción a flutter
introducción a flutter
 
Introducción a Docker
Introducción a DockerIntroducción a Docker
Introducción a Docker
 
Introducción al desarrollo de aplicaciones para Android
Introducción al desarrollo de aplicaciones para AndroidIntroducción al desarrollo de aplicaciones para Android
Introducción al desarrollo de aplicaciones para Android
 
Meetup V.E.No.M. y docker
Meetup V.E.No.M. y dockerMeetup V.E.No.M. y docker
Meetup V.E.No.M. y docker
 
Corriendo SQL Server en Docker
Corriendo SQL Server en DockerCorriendo SQL Server en Docker
Corriendo SQL Server en Docker
 
TECNIRIS47-1b.pdf
TECNIRIS47-1b.pdfTECNIRIS47-1b.pdf
TECNIRIS47-1b.pdf
 
Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019
Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019 Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019
Docker y kubernetes para desarrolladores .NET - Meetup Barcelona 2019
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
 
Jug málaga docker 101 - final
Jug málaga   docker 101 - finalJug málaga   docker 101 - final
Jug málaga docker 101 - final
 
Curso Kubernetes CodeURJC
Curso Kubernetes CodeURJCCurso Kubernetes CodeURJC
Curso Kubernetes CodeURJC
 
Introduction to docker. Stratio
Introduction to docker. StratioIntroduction to docker. Stratio
Introduction to docker. Stratio
 
Preparación del entorno de desarrollo de android
Preparación del entorno de desarrollo de androidPreparación del entorno de desarrollo de android
Preparación del entorno de desarrollo de android
 
Game of pods - Kubernetes
Game of pods - KubernetesGame of pods - Kubernetes
Game of pods - Kubernetes
 
Elias Grande - Dagda [rootedvlc4]
Elias Grande - Dagda [rootedvlc4]Elias Grande - Dagda [rootedvlc4]
Elias Grande - Dagda [rootedvlc4]
 
Workshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los ContenedoresWorkshop docker: Iniciando en el Mundo de los Contenedores
Workshop docker: Iniciando en el Mundo de los Contenedores
 
Docker para Data Scientist - Master en Data Science URJC
Docker para Data Scientist - Master en Data Science URJCDocker para Data Scientist - Master en Data Science URJC
Docker para Data Scientist - Master en Data Science URJC
 
Docker containers-itb-2021
Docker containers-itb-2021Docker containers-itb-2021
Docker containers-itb-2021
 
Primeros pasos con Docker
Primeros pasos con DockerPrimeros pasos con Docker
Primeros pasos con Docker
 
Seminario CLEFormacion-docker
Seminario CLEFormacion-dockerSeminario CLEFormacion-docker
Seminario CLEFormacion-docker
 

Más de Angel Borroy López

Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Using Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherUsing Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherAngel Borroy López
 
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Angel Borroy López
 
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1Angel Borroy López
 
Docker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoDocker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoAngel Borroy López
 
Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Angel Borroy López
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseAngel Borroy López
 
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeCSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeAngel Borroy López
 
Alfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAlfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAngel Borroy López
 
Collaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoCollaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoAngel Borroy López
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfAngel Borroy López
 
Deploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsDeploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsAngel Borroy López
 
Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Angel Borroy López
 
(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in AlfrescoAngel Borroy López
 
A Practical Introduction to Apache Solr
A Practical Introduction to Apache SolrA Practical Introduction to Apache Solr
A Practical Introduction to Apache SolrAngel Borroy López
 

Más de Angel Borroy López (20)

Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Using Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherUsing Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms together
 
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
 
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
 
Docker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoDocker Init with Templates for Alfresco
Docker Init with Templates for Alfresco
 
Before & After Docker Init
Before & After Docker InitBefore & After Docker Init
Before & After Docker Init
 
Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
 
Using Podman with Alfresco
Using Podman with AlfrescoUsing Podman with Alfresco
Using Podman with Alfresco
 
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeCSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
 
Alfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAlfresco Embedded Activiti Engine
Alfresco Embedded Activiti Engine
 
Alfresco Transform Core 3.0.0
Alfresco Transform Core 3.0.0Alfresco Transform Core 3.0.0
Alfresco Transform Core 3.0.0
 
Collaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoCollaborative Editing Tools for Alfresco
Collaborative Editing Tools for Alfresco
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdf
 
Deploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsDeploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP Platforms
 
Introduction to AWS
Introduction to AWSIntroduction to AWS
Introduction to AWS
 
Alfresco Certificates
Alfresco Certificates Alfresco Certificates
Alfresco Certificates
 
Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0
 
(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco
 
A Practical Introduction to Apache Solr
A Practical Introduction to Apache SolrA Practical Introduction to Apache Solr
A Practical Introduction to Apache Solr
 

Último

Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 

Último (7)

Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 

Desarrollando una Extensión para Docker

  • 1. docker community ALL HANDS #6 Desarrollando una Extensión para Docker Angel Borroy Developer Evangelist, Hyland @AngelBorroy 1 de Septiembre de 2022
  • 2. SDK para Extensiones Docker ● Introducción a Extensiones ● Primeros pasos ● Herramientas de Desarrollo ● API JavaScript ● Diseño de la Interfaz de Usuario
  • 3. Las extensiones se ejecutan como Contenedores Linux en Docker* * Las Extensiones no están disponibles cuando se usan Contenedores Windows
  • 4. SDK para Extensiones de Docker https://docs.docker.com/desktop/extensions/ https://github.com/docker/extensions-sdk Documentación oficial (en inglés) Desarrollo de extensiones Publicación de extensiones en el Marketplace Guías para el diseño del interfaz de usuario Referencia de la API Código fuente del CLI y ejemplos de creación de extensiones Extensión frontend Extensión backend Extensión Docker CLI Extensión utilizando React-JS para el frontend
  • 5. $ docker extension init my-extension Dockerfile docker-compose.yaml metadata.json Makefile docker.svg vm/ ui/ Primeros pasos Requisitos Docker Desktop Node.js Go Make IDE Visual Studio Code Imagen Docker Datos de la Extensión Herramientas Icono de la Extensión Backend Frontend
  • 6. $ docker extension init Crea una nueva Extensión a partir de una plantilla install Instala la Extensión en Docker Desktop a partir de una Imagen ls Lista las Extensiones Docker instaladas en Docker Desktop rm Elimina una Extensión de Docker Desktop update Elimina y re-instala una Extensión de Docker Desktop validate Valida una Extensión a partir de una Imagen o sus metadatos version Muestra la versión de cliente y servidor Herramientas de desarrollo
  • 7. $ docker extension dev debug Habilita el modo depuración para el UI de una Extensión ui-source Establece un origen para el UI de una Extensión reset Restablece el origen y deshabilita el modo depuración para el UI Herramientas de desarrollo $ make <target> build-extension: docker build --tag=$(IMAGE):$(TAG) . install-extension: build-extension docker extension install $(IMAGE):$(TAG) update-extension: build-extension docker extension update $(IMAGE):$(TAG)
  • 8. API para Interfaz de Usuario (UI) API JavaScript con soporte para TypeScript import { createDockerDesktopClient } from '@docker/extension-api-client'; export function App() { const ddClient = createDockerDesktopClient(); } Backend Peticiones HTTP, ejecución de comandos (sistema operativo) Docker Ejecución de comandos Docker Dashboard Muestra notificaciones de usuario en Docker Desktop Navigation Navega a otro apartado de Docker Desktop https://docs.docker.com/desktop/extensions-sdk/dev/api/overview/
  • 9. Diseño de la Interfaz de Usuario (UI) Puede utilizarse cualquier tecnología de desarrollo para la Interfaz de Usuario (incluso simple HTML) Sin embargo, dado que la Interfaz de Usuario de Docker Desktop está escrito en React y Material UI es muy recomendable utilizar esta combinación Además de la tecnología, Docker propone esta simple lista de comprobaciones para el diseño de la Interfaz de Usuario: • ¿Es fácil lanzar la Extensión? • ¿Es fácil utilizar la Extensión? • ¿Es fácil acceder a la ayuda cuando es necesario? https://docs.docker.com/desktop/extensions-sdk/design/design-guidelines/
  • 10. ● Objetivo ● Componentes de la Extensión ● Estructura de la Extensión ● Despliegue y Ejecución Alfresco Docker Extension https://github.com/AlfrescoLabs/alfresco-docker-extension
  • 11. Objetivo Desplegar todos los contenedores requeridos para Alfresco a través de un botón en el UI Elimina la dependencia de un fichero externo, como docker-compose.yml Proporciona seguimiento de la ejecución de los contenedores Facilita la gestión de recursos Minimiza las barreras para utilizar Alfresco Run
  • 12. aaa Componentes de la Extensión API Backend Peticiones HTTP, ejecución… Docker Ejecución de comandos Docker Dashboard Muestra notificaciones… Navigation Navega a otro apartado de Docker Desktop Dockerfile docker-compose.yaml metadata.json Makefile alfresco.svg vm/ ui/
  • 13. Estructura de la Extensión Docker Navigation
  • 14. Despliegue y Ejecución $ make install-extension
  • 15. ● Respuestas de ddClient ● Utiliza el log de la Consola JavaScript ● Probar con diferentes Sistemas Operativos ● Probar con diferentes Temas (oscuro / claro) Algunos Consejos
  • 16. Respuesta de ddClient (JSON) const result = await ddClient.docker.cli.exec('info', [ '--format', '"{{json .}}"' ]) return result.parseJsonObject()?.MemTotal La respuesta es asíncrona, utiliza await para esperar al resultado Utiliza el formato JSON en las invocaciones al cliente Docker Parsea el resultado para obtener el valor de las propiedades { "Containers": 6, "ContainersRunning": 0, "ContainersPaused": 0, "ContainersStopped": 6, "Images": 9, "Driver": "overlay2", "DriverStatus": [...], "Plugins": {...}, "NCPU": 6, "MemTotal": 20992327680, ... }
  • 17. Respuesta de ddClient (Lista de Ids) const result = await ddClient.docker.cli.exec('ps’, ['-q']) var containers = result.stdout.split(/r?n|r|n/g) En ocasiones también puedes obtener una lista simple con -q Divide el resultado por salto de línea para obtener cada elemento 57f249e609d6 bd448227ea37 9efdaf7e7eeb a847d20cd8af 82363cdde627
  • 18. Respuesta de ddClient (Lista de JSON) const result = await ddClient.docker.cli.exec('ps’, '--format', '"{{json .}}"' ]) var containers = result.stdout.split(/r?n|r|n/g) for(let i = 0; i < containers.length; i++) { let json = JSON.parse(containers[i]) } Algunos comandos devuelven una lista de líneas JSON No puede parsearse toda la respuesta como un documento JSON, pero puede divirse el resultado por salto de línea para obtener cada elemento JSON {"Command":""catalina.sh ...} {"Command":""/bin/sh -c ...} {"Command":""/bin/sh -c ...} {"Command":""/bin/sh -c ...}
  • 19. Log de la consola JavaScript try { ddClient.docker... } catch (err) { console.log("error : ", err) } Utiliza los comandos a Docker en bloques try-catch Puedes volcar los detalles del error en la consola JavaScript Recuerda arrancar la Extensión Docker en modo desarrollo docker extension dev debug angelborroy/alfresco-extension
  • 20. Probar con diferentes Sistemas Operativos export const stopContainers = async () => { await ddClient.docker.cli.exec('stop', [ '$(docker ps -qf "network=alfresco")' ]) } Funciona en Mac OS con chip Intel Falla en Windows 10 >> Todavía está en fase BETA ¡Puedes reportar los errores que identifiques en GitHub!
  • 21. Probar con diferentes Temas Es recomendable utilizar la guía de diseño de Docker, que tiene en cuenta todos los elementos del Interfaz Gráfico para el tema Oscuro y para el tema Claro https://docs.docker.com/desktop/extensions-sdk/design/design-guidelines/ No obstante, recuerda revisar el resultado cuando añadas recursos como imágenes