Despliegue de Nexus 3 con Docker para repositorios NuGet y Docker

  1. Configuración del archivo docker-compose

Primero, necesitamos crear el archivo de configuración para docker-compose. Este archivo definirá nuestro servicio de Nexus con los parámetros necesarios.

version: '3'

servicios:
  nexus3:
    imagen: 'sonatype/nexus3:3.42.0'
    nombre_contenedor: repositorio-nexus
    reinicio: siempre
    hostname: nuget.dudusoft.cn
    privilegios: true
    entorno:
      - ZONA_HORARIA=Asia/Shanghai
    puertos:
      - '8081:8081'
      - '8088:8088'
      - '8089:8089'
    volumenes:
      - '/mnt/almacenamiento/datos-nexus:/nexus-data'

  1. Creación del contenedor

Una vez definido el archivo de configuración, procedemos a crear el contenedor usando docker-compose.

root@servidor-dns:/home/public/software/nexus# docker-compose up -d
Creando red "nexus_default" con el controlador predeterminado
Extrayendo nexus (sonatype/nexus3:3.42.0)...
3.42.0: Extrayendo desde sonatype/nexus3
d5d2e87c6892: Extracción completada
008dba906bf6: Extracción completada
b4e2142a7ee0: Extracción completada
75bdf4e3eda5: Extracción completada
754b7a6e063a: Extracción completada
54fb6fd82993: Extracción completada
484f7f034926: Extracción completada
e0a41b95cd8d: Extracción completada
Digest: sha256:7e7abd3418d507d5263460eda83e239aff758cd362f8add54d9c9846cada2533
Estado: Nueva imagen descargada para sonatype/nexus3:3.42.0
Creando nexus ... hecho
root@servidor-dns:/home/public/software/nexus#

  1. Verificación del estado del contenedor

Al verificar el estado del contneedor, observamos que está intentando reiniciarse continuamente.

root@servidor-dns:/home/public/software/nexus# docker ps
ID_CONTENEDOR   IMAGEN                            COMANDO                  CREADO              ESTADO                            PUERTOS                                                                                      NOMBRES
55b090c87180   sonatype/nexus3:3.42.0           "/opt/sonatype/nexus…"   Hace un minuto   Reiniciando (255) hace 13 segundos                                                                                              nexus

El contenedor se encuentra en un ciclo de reinicio continuo.

  1. Análisis de los registros del contenedor

Para entender qué está causando el problema, examinamos los logs del contenedor.

root@servidor-dns:/home/public/software/nexus# docker logs repositorio-nexus
mkdir: no se puede crear el directorio '../sonatype-work/nexus3/log': Permiso denegado
mkdir: no se puede crear el directorio '../sonatype-work/nexus3/tmp': Permiso denegado
Advertencia: No se puede abrir el archivo de registro: ../sonatype-work/nexus3/log/jvm.log
Advertencia: Forzando opción -XX:LogFile=/tmp/jvm.log
OpenJDK 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory

java.io.FileNotFoundException: ../sonatype-work/nexus3/tmp/i4j_ZTDnGON8hezynsMX2ZCYAVDtQog=.lock (No such file or directory)
        at java.io.RandomAccessFile.open0(Native Method)
        at java.io.RandomAccessFile.open(RandomAccessFile.java:316)
        at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
        at com.install4j.runtime.launcher.util.SingleInstance.check(SingleInstance.java:72)
        at com.install4j.runtime.launcher.util.SingleInstance.checkForCurrentLauncher(SingleInstance.java:31)
        at com.install4j.runtime.launcher.UnixLauncher.checkSingleInstance(UnixLauncher.java:88)
        at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:67)
java.io.FileNotFoundException: /nexus-data/karaf.pid (Permission denied)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:270)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
        at org.apache.karaf.main.InstanceHelper.writePid(InstanceHelper.java:126)
        at org.apache.karaf.main.Main.launch(Main.java:278)
        at org.sonatype.nexus.karaf.NexusMain.launch(NexusMain.java:113)
java.lang.RuntimeException: /nexus-data/log/karaf.log (No such file or directory)
        at org.apache.karaf.main.util.BootstrapLogManager.getDefaultHandlerInternal(BootstrapLogManager.java:102)
        at org.apache.karaf.main.util.BootstrapLogManager.getDefaultHandlersInternal(BootstrapLogManager.java:137)
        at org.apache.karaf.main.util.BootstrapLogManager.getDefaultHandlers(BootstrapLogManager.java:70)
        at org.apache.karaf.main.util.BootstrapLogManager.configureLogger(BootstrapLogManager.java:75)
        at org.apache.karaf.main.Main.launch(Main.java:279)
        at org.sonatype.nexus.karaf.NexusMain.launch(NexusMain.java:113)
Error creating bundle cache.
Unable to update instance pid: Unable to create directory /nexus-data/instances
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied

El problema es claro: el directorio del volumen montado tiene problemas de permisos. No se pueden crear los directorios necesarios dentro del volumen.

Verificación de permisos del directorio

root@servidor-dns:/mnt/almacenamiento# ls -al
total 16
drwxr-xr-x 4 root root 4096 Jul  8 10:32 .
drwxr-xr-x 3 root root 4096 Jul  8 04:16 ..
drwxr-xr-x 2 root root 4096 Jul  8 10:32 datos-nexus

root@servidor-dns:/mnt/almacenamiento# cd datos-nexus
root@servidor-dns:/mnt/almacenamiento/datos-nexus# ls -al
total 8
drwxr-xr-x 2 root root 4096 Jul  8 10:32 .
drwxr-xr-x 4 root root 4096 Jul  8 10:32 ..
root@servidor-dns:/mnt/almacenamiento/datos-nexus#

El directorio está vacío y los permisos no son los adecuados para que el contenedor pueda escribir en él.

Ajuste de permisos

root@servidor-dns:/mnt/almacenamiento# chmod -R 777 datos-nexus
root@servidor-dns:/mnt/almacenamiento#

  1. Eliminación del contenedor

Detenemos y eliminamos el contenedor para volver a crearlo con la configuración correcta.

root@servidor-dns:/home/public/software/nexus# docker-compose stop
Deteniendo nexus ... hecho
root@servidor-dns:/home/public/software/nexus# docker-compose rm
¿Está seguro? [yN] y
Eliminando nexus ... hecho
root@servidor-dns:/home/public/software/nexus#

  1. Limpieza del directorio de datos

root@servidor-dns:/mnt/almacenamiento# cd datos-nexus
root@servidor-dns:/mnt/almacenamiento/datos-nexus# ls
admin.password  cache  elasticsearch  generated-bundles  javaprefs  keystores  log     port                 tmp
blobs           db     etc            instances          karaf.pid  lock       orient  restore-from-backup
root@servidor-dns:/mnt/almacenamiento/datos-nexus# rm -Rf *
root@servidor-dns:/mnt/almacenamiento/datos-nexus# ls -al
total 8
drwxr-xr-x 2  200  200 4096 Jul  8 10:22 .
drwxr-xr-x 4 root root 4096 Jul  8 10:09 ..
root@servidor-dns:/mnt/almacenamiento/datos-nexus#

  1. Configuración del propietario del directorio

El contenedor Nexus ejecuta con un usuario específico (UID 200). Necesitamos asignar la propiedad del directorio a este usuario.

root@servidor-dns:/mnt/almacenamiento# chown -R 200:200 datos-nexus

  1. Recreación del contenedor

Para quienes no tengan problemas de configuración previa, pueden omitir los pasos anteriores y simplemente reiniciar el contenedor.

root@servidor-dns:/mnt/almacenamiento# docker restart repositorio-nexus
repositorio-nexus

  1. Verificación del estado final

root@servidor-dns:/home/public/software/nexus# docker ps
ID_CONTENEDOR   IMAGEN                            COMANDO                  CREADO         ESTADO             PUERTOS                                                                                                      NOMBRES
15cb00d125f0   sonatype/nexus3:3.42.0           "/opt/sonatype/nexus…"   hace 3 minutos   Up 6 segundos       0.0.0.0:8081->8081/tcp, :::8081->8081/tcp, 0.0.0.0:8088-8089->8088-8089/tcp, :::8088-8089->8088-8089/tcp   repositorio-nexus

El contenedor está ahora ejecutándose correctamente.

  1. Acceso a la interfaz web

Ahora podemos acceder a Nexus a través del navegador utilizando la dirección IP del servidor y el puerto configurado.

En el próximo artículo se explicará cómo configurar los repositorios NuGet y Docker en Nexus 3.

Publicado el 6-1 13:00