enter code here Tengo mi aplicación web y h2database como contenedores de Docker. Tengo Docker Compone el archivo YML todo el conjunto. Ahora, necesito inicializar esta base de datos (H2Database). Pero no puedo hacerlo. Cuando voy al contenedor H2Database Docker, veo Docker-entryPoint-initdb.d / initdb.sh dentro de este initdb.sh he agregado mi script

#!/bin/bash
java -cp  h2-1.4.190.jar org.h2.tools.RunScript \
          -script /App1/BasePl/sql-scripts/h2/common-scripts/BasePl-schema-h2.sql \ -url "jdbc:h2:http://localhost/code1/Demo2./BasePl"

Pero cuando intento ejecutar este initDB.sh usando Bash Command, me da un error: no se pudo encontrar ni cargar la clase principal org.h2.tools.runScript

He intentado todas las combinaciones de ruta de clase posibles y también descargamos diferentes carpetas de cremalleras H2 Jarfiles H2 y también revisaron el archivo RUNScript debajo de H2 \ SRC \ Main \ Org \ H2 \ Herramientas y está allí. Así que no entiendo cuál es el problema aquí.

Error: Could not find or load main class org.h2.tools.RunScript

My Docker-compone.yml archivo:

version: '3'
services:
  baseplapplication:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
        BASEPL_HOME: "/usr/local/BASEPL"  

    ports:
      - "882:8080"
    volumes: 
      - basepl_data:/var/bio
    depends_on:
      - db
    links:
      - db
  db:
    image: "buildo/h2database"

    volumes:
      - ./dumps/init.sh:/docker-entrypoint-initdb.d/initdb.sh    
      - h2data:/var/lib/h2database

    ports:
      - "8082:8082"
volumes:
        basepl_data:
        h2data:

Ahora, el initDB se creará cuando ejecuto el comando de composición DOCKER y, por lo tanto, debo ingresar el contenedor de la base de datos (DB) a la ubicación de initdb.sh y luego poner mi script #! / bin / bash java -cp h2-1.4.190.jar org.h2.tools.runScript \ -Script /App1/basepl/sql-scripts/h2/common-scripts/basepl-schema-h2.sql \ -url "jdbc: h2: http: //localhost/code1/demo2./basepl ". ¿Cómo podría poner mi archivo H2-1.4.190.jar que se encuentra en mi escritorio a esa ubicación dentro del contenedor de la base de datos (DB)? Todo lo que quiero es rellenar (inicializar) la base de datos de Docker ejecutando un script contra él durante el compensación de Docker. Por favor soy nuevo en Docker, así que ayúdame.

0
Abhijot Mann 27 jun. 2019 a las 17:10

1 respuesta

La mejor respuesta

Este error significa que Java no encontró h2-1.4.190.jar.

Primero, necesita poner h2-1.4.190.jar en la misma carpeta de initdb.sh, es decir, docker-entrypoint-initdb.d en su caso. Luego, en su Dockerfile, el WORKDIR Supongo que no es docker-entrypoint-initdb.d.

Luego, cuando hace java -cp h2-1.4.190.jar, tiene la intención de encontrar el frasco en WORKDIR, no en docker-entrypoint-initdb.d. P.ej. Si WORKDIR es /root/, entonces intentará encontrar h2-1.4.190.jar en /root, no en la carpeta almacenar el script, para que no pueda encontrar el frasco.

Para superar esto, puede cambiar WORKDIR en DockerFile, o simplemente agregue junto a init.db.sh:

#!/bin/bash
dir=$(dirname "$0")
java -cp "$dir/h2-1.4.190.jar" org.h2.tools.RunScript \
      -script /App1/BasePl/sql-scripts/h2/common-scripts/BasePl-schema-h2.sql \ -url "jdbc:h2:http://localhost/code1/Demo2./BasePl"

El dir=$(dirname "$0") asegurará que es la misma carpeta del script que ejecuta actual, no la carpeta donde iniciar el script.

Además, puede usar absoluto dir para h2-1.4.190.jar, también está bien.

0
atline 28 jun. 2019 a las 02:07