Java Docker sqlite+;弹簧靴
我有一个使用sqlite的Spring启动应用程序。当我试图创建一个容器时,我得到一个异常Java Docker sqlite+;弹簧靴,java,sqlite,spring-boot,docker,docker-compose,Java,Sqlite,Spring Boot,Docker,Docker Compose,我有一个使用sqlite的Spring启动应用程序。当我试图创建一个容器时,我得到一个异常 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaCon
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [clients]
容器似乎无法访问数据库文件
文件结构是
Dockerfile
FROM openjdk:8
ADD project-app.jar project-app.jar
ADD mydb.db mydb.db
ENTRYPOINT ["java","-jar","project-app.jar"]
EXPOSE 8082
docker compose.yml
version: '3.3'
services:
project-app:
build: ./
image: project-app:1.0
restart: always
container_name: project-app
ports:
- 8082:8082
volumes:
- /var/run/docker.sock:/var/run/docker.sock
network_mode: bridge
我尝试像添加容器一样添加sqlite,也尝试在docker compose.yml
上复制MySQL配置,但仍然得到相同的异常
编辑:浏览容器后,数据库文件似乎存在mydb.db
,但它是空的,这意味着Dockerfile不会复制数据库
4 drwxr-xr-x 1 root root 4096 Sep 6 18:27 .
4 drwxr-xr-x 1 root root 4096 Sep 6 18:27 ..
0 -rwxr-xr-x 1 root root 0 Sep 6 18:27 .dockerenv
4 drwxr-xr-x 1 root root 4096 Aug 14 11:23 bin
4 drwxr-xr-x 2 root root 4096 Mar 28 09:12 boot
0 drwxr-xr-x 5 root root 340 Sep 6 18:57 dev
4 drwxr-xr-x 1 root root 4096 Sep 6 18:27 etc
4 drwxr-xr-x 2 root root 4096 Mar 28 09:12 home
4 drwxr-xr-x 1 root root 4096 Aug 12 00:00 lib
4 drwxr-xr-x 2 root root 4096 Aug 12 00:00 lib64
4 drwxr-xr-x 2 root root 4096 Aug 12 00:00 media
4 drwxr-xr-x 2 root root 4096 Aug 12 00:00 mnt
4 drwxr-xr-x 2 root root 4096 Aug 12 00:00 opt
0 dr-xr-xr-x 145 root root 0 Sep 6 18:57 proc
4 drwx------ 1 root root 4096 Aug 14 11:25 root
4 drwxr-xr-x 1 root root 4096 Sep 6 18:27 run
4 drwxr-xr-x 1 root root 4096 Aug 14 06:24 sbin
46260 -rwxr-xr-x 1 root root 47367833 Sep 6 17:02 project-app.jar
0 -rw-r--r-- 1 root root 0 Sep 6 18:27 mydb.db
4 drwxr-xr-x 2 root root 4096 Aug 12 00:00 srv
0 dr-xr-xr-x 13 root root 0 Sep 6 18:57 sys
4 drwxrwxrwt 1 root root 4096 Sep 6 18:57 tmp
4 drwxr-xr-x 1 root root 4096 Aug 12 00:00 usr
4 drwxr-xr-x 1 root root 4096 Aug 12 00:00 var
ADD
是一个特殊的docker命令,用于URL和tar文件。大多数情况下,它只是做COPY
所做的事情,但是当您不需要ADD
的魔力时,最好使用COPY
。因此,如果用COPY
替换ADD
有效,请尝试privileged
标志是否修复了该问题。--privileged
标志为容器提供了所有功能,如cgroup控制器实施的限制。然后,容器可以执行主机可以执行的几乎所有操作李>
mydb.db
权限。如果docker引擎没有适当的权限,它将无法将文件复制到docker容器1.尝试复制而不是添加2。使用
privileged
标志授予root权限。还要检查主机中mydb.db
的权限machine@Rash如果容器需要重启主机系统之类的操作,那么您只需要--privileged
,也就是说,几乎不需要。如果容器进程以用户ID 0运行,则出于文件系统访问目的,它具有根权限。我同意。我几乎从不使用特权标志,也不推荐它,除非在docker类型的设置中使用docker。