ckan-docker: Mejoras
Imágenes CKAN
Los archivos de configuración de la imagen Docker utilizados para construir tu proyecto CKAN se encuentran en la carpeta ckan/
. Hay dos archivos Docker:
-
Dockerfile
: está basado enmjanez/ckan-base-spatial:<version>
, una imagen base localizada en el Github Package Registry, que tiene instalado CKAN junto con todas sus dependencias, correctamente configurado y ejecutándose en uWSGI (configuración de producción). -
Dockerfile.dev
: está basado enmjanez/ckan-base-spatial:<version>-dev
también localizado en el Registro de Paquetes de Github, y extiendemjanez/ckan-base-spatial:<version>
para incluir:- Cualquier extensión clonada en la carpeta
./src
se instalará en el contenedor CKAN al arrancar Docker Compose (docker compose up
). Esto incluye instalar cualquier requisito listado en un archivorequirements.txt
(opip-requirements.txt
) y ejecutarpython setup.py develop
. - CKAN se inicia ejecutando esto:
/usr/bin/ckan -c /srv/app/ckan.ini run -H 0.0.0.0
. - Asegúrese de añadir los plugins locales a la var env
CKAN__PLUGINS
en el archivo.env
.
- Cualquier extensión clonada en la carpeta
-
Cualquier cambio personalizado en los scripts que se ejecutan durante el arranque del contenedor puede hacerse en los scripts del directorio
setup/
. Por ejemplo, si quisieras cambiar el puerto en el que se ejecuta CKAN, tendrías que hacer cambios en el archivo yaml de Docker Compose y en el archivostart_ckan.sh.override
. A continuación, tendría que añadir la siguiente línea a la Dockerfile es decir:COPY setup/start_ckan.sh.override ${APP_DIR}/start_ckan.sh
. El archivostart_ckan.sh
de la imagen local sustituirá al archivostart_ckan.sh
incluido en la imagen base.
Si obtienes un error como doesn't have execute permissions
:
Daemon error response: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/srv/app/start_ckan.sh": permission denied: unknown
Puede ser necesario dar permisos de ejecución al fichero en el Dockerfile
:
...
# Anular start_ckan.sh
COPIAR setup/start_ckan.sh.override ${APP_DIR}/start_ckan.sh
EJECUTAR chmod +x ${APP_DIR}/start_ckan.sh
...
Mejora de las imágenes CKAN
Ampliación de las imágenes base
Puedes modificar los archivos docker para construir tu propia imagen personalizada adaptada a tu proyecto, instalando cualquier extensión o requisito extra que necesites. Por ejemplo, aquí es donde se actualizaría para utilizar una imagen base CKAN diferente, es decir: ckan/ckan-base-spatial:<nueva versión>
.
Para realizar pasos extra de inicialización puedes añadir scripts a tus imágenes personalizadas y copiarlos a la carpeta /docker-entrypoint.d
(La carpeta debería crearse para ti cuando construyas la imagen). Cualquier archivo *.sh
y *.py
de esa carpeta se ejecutará justo después de que se ejecute el script de inicialización principal (prerun.py
) y justo antes de que se inicien los procesos del servidor web y del supervisor.
Por ejemplo, considere la siguiente imagen personalizada:
ckan
├── docker-entrypoint.d
│└── setup_validation.sh
├── Dockerfile
└── Dockerfile.dev
Queremos instalar una extensión como ckanext-validation que necesita crear tablas de base de datos en tiempo de arranque. Creamos un script setup_validation.sh
en una carpeta docker-entrypoint.d
con los comandos necesarios:
#!/bin/bash
# Create DB tables if not there
ckan -c /srv/app/ckan.ini validation init-db
Y luego en nuestro archivo Dockerfile.dev
instalamos la extensión y copiamos los scripts de inicialización:
FROM ckan/ckan-base-spatial:2.9.11
RUN pip install -e git+https://github.com/frictionlessdata/ckanext-validation.git#egg=ckanext-validation && \
pip install -r https://raw.githubusercontent.com/frictionlessdata/ckanext-validation/master/requirements.txt
COPY docker-entrypoint.d/* /docker-entrypoint.d/
Hay una serie de ejemplos de ampliación comentados en el archivo Dockerfile.dev
Aplicación de parches
Cuando construyas las imágenes CKAN específicas de tu proyecto (las definidas en la carpeta ckan/
), puedes aplicar parches
al núcleo de CKAN o a cualquiera de las extensiones creadas. Para ello, cree una carpeta dentro de ckan/patches
con el nombre del paquete a parchear (es decir, ckan/
).
paquete a parchear (por ejemplo ckan
o ckanext-??
). Dentro puede colocar los archivos de parche que se aplicarán al construir
las imágenes. Los parches se aplicarán en orden alfabético, por lo que puede anteponerles un prefijo secuencial si es necesario.
Por ejemplo, vea la siguiente carpeta de imágenes de ejemplo:
ckan
├── patches
│ ├── ckan
│ │ ├── 01_datasets_per_page.patch
│ │ ├── 02_groups_per_page.patch
│ │ ├── 03_or_filters.patch
│ └── ckanext-harvest
│ └── 01_resubmit_objects.patch
├── setup
├── Dockerfile
└── Dockerfile.dev
Git diff es un comando para mostrar los cambios entre dos fuentes dentro del repositorio Git. Las fuentes de datos pueden ser dos ramas diferentes, commits, ficheros, etc.
- Muestra los cambios entre el directorio de trabajo y el área de preparación:
git diff > [archivo.patch]
- Muestra los cambios entre el área de preparación y el repositorio:
git diff --staged [archivo]`
Aplicación de parches en modo desarrollo
Para aplicar parches en modo desarrollo, deberá seguir los siguientes pasos:
-
Asegúrese de que sus parches están ubicados en el directorio
ckan/patches
. Los parches deben organizarse en subdirectorios con el nombre del paquete al que van destinados (por ejemplo,ckan
ockanext-??
). Cada archivo de parche debe terminar con la extensión .patch.Por ejemplo, la estructura de directorios podría ser la siguiente:
ckan
├── patches
│ ├── ckan
│ │ ├── 01_datasets_per_page.patch
│ │ ├── 02_groups_per_page.patch
│ │ ├── 03_or_filters.patch
│ └── ckanext-harvest
│ └── 01_resubmit_objects.patch
├── setup
├── Dockerfile
└── Dockerfile.dev -
Navegue hasta el directorio
/src
. -
Aplique los parches utilizando el comando patch:
find /path/to/ckan/patches -name '*.patch' -exec patch -p1 < {} \;
Este comando buscará recursivamente en el directorio
/path/to/ckan/patches
archivos que terminen en.patch
y los aplicará usando el comando patch. Sustituyaruta/al/ckan/parches
por la ruta real a su directoriockan/parches
.
Crear una extensión en modo desarrollo
Puedes usar las instrucciones ckan extension para crear una extensión CKAN, sólo ejecutando el comando dentro del contenedor CKAN y poniendo como salida la carpeta src/
montada:
docker compose -f docker-compose.dev.yml exec ckan-dev /bin/sh -c "ckan -c /srv/app/ckan.ini generate extension --output-dir /srv/app/src_extensions"
A continuación, responda a las preguntas para configurar el plugin:
Extension's name [must begin 'ckanext-']: ckanext-newextension
Author's name []: Joe Bloggs
Author's email []: joe@bloggs.com
Your Github user or organization name []: joebloggs
Brief description of the project []: test creating a new extension
List of keywords (separated by spaces) [CKAN]: ckanext-newextension
Do you want to include code examples? [y/N]: y
Written: /srv/app/src_extensions/ckanext-newextension
Los nuevos archivos y directorios de extensión se crean en la carpeta /srv/app/src_extensions/
en el contenedor en ejecución. También existirán en el directorio local src/ ya que el directorio local /src
está montado como /srv/app/src_extensions/
en el contenedor ckan. Es posible que tenga que cambiar el propietario de su carpeta para tener los permisos adecuados.