enter code here
我将我的Web应用程序和h2database作为docker容器。我已经全部设置了docker compose yml文件。现在,我需要初始化此数据库(h2database)。但是我做不到。当我进入h2database docker容器时,我在此initdb.sh中看到docker-entrypoint-initdb.d / initdb.sh,我已添加了脚本
#!/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"
但是当我尝试使用bash命令执行此initdb.sh时,它给我错误:无法找到或加载主类org.h2.tools.RunScript
我尝试了所有可能的类路径组合,还下载了不同的h2 jarfiles zip文件夹,还检查了h2 \ src \ main \ org \ h2 \ tools下的RunScript文件及其位置。所以我不明白这里是什么问题。
Error: Could not find or load main class org.h2.tools.RunScript
我的Docker-compose.yml文件:
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:
现在当我运行docker-compose命令时将创建initdb,因此我需要进入database(db)容器到initdb.sh的位置,然后将我的脚本#!/ 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”。然后,我该如何将位于桌面上的h2-1.4.190.jar文件放到database(db)容器内的该位置。我想要的是通过在docker compose期间针对它运行脚本来填充(初始化)docker数据库。请我是Docker的新手,请帮助我
答案 0 :(得分:0)
此错误表示Java找不到h2-1.4.190.jar
。
首先,您需要将h2-1.4.190.jar
放在initdb.sh
的同一文件夹中,即您的情况下为docker-entrypoint-initdb.d
。然后,在您的Dockerfile
中,我猜不是WORKDIR
的{{1}}。
然后,当执行docker-entrypoint-initdb.d
时,它打算在java -cp h2-1.4.190.jar
中而不是在WORKDIR
中找到jar。例如。如果docker-entrypoint-initdb.d
是WORKDIR
,则它将尝试在/root/
中找到h2-1.4.190.jar
,而不是在存储脚本的文件夹中找到,因此找不到该jar。
要解决此问题,您可以在dockerfile中更改/root
,或仅在WORKDIR
旁边添加:
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"
将确保它与当前正在运行的脚本位于同一文件夹,而不是在其中启动脚本的文件夹。
此外,您可以为dir=$(dirname "$0")
使用绝对目录,也可以。