- 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'
- 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#
- 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.
- 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#
- 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#
- 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#
- 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
- 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
- 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.
- 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.