Reputation: 46940
I have a basic Spring Boot Data JPA project. The h2 database that I'm connecting to is located at /tmp/customerdb.h2.db
. When running the application using mvn spring-boot:run
everything works fine. The application connects to the database, adds records, and prints the added records to the console.
I then build a docker container, and run it. The docker file looks like this:
FROM java:8
VOLUME /tmp
ADD jpa-docker-1.0.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar",/app.jar"]
When I run the container I get the following error:
2015-06-12 19:25:57.200 WARN 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 42102, SQLState: 42S02
2015-06-12 19:25:57.200 ERROR 1 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Table "CUSTOMER" not found; SQL statement:
So it looks like the application can't see the database. The connection URL looks like this:
spring.datasource.url=jdbc:h2:/tmp/customerdb
As I mentioned, this works fine when running outside the docker container. I'm assuming that the line in the Dockerfile VOLUME /tmp
creates the /tmp
directory inside the container, along with all the files it contains, such that the database is visible, but this seems like it's not working. Thoughts?
TIA, - Ole
Upvotes: 1
Views: 16553
Reputation: 2398
You should use docker data volumes. When running your container you specify the parameter:
-v <host folder>:<container folder>
This way, the on the host machine is mapped, inside the container
for instance:
docker run -v /tmp:/tmp -d yourcontainer
Your application inside the container looks for the file /tmp/customerdb.h2.db
, which actually is on the host at /tmp/customerdb.h2.db
where the db file actually exists (in general you could use different paths on the guest and the host; in your example it just happens that the host and guest folders are both on the same location "/tmp")
Upvotes: 2
Reputation: 46940
This is the solution. First I added the database docker build directory containing the Dockerfile
. Then I update the Dockerfile
with the following line:
ADD customerdb.h2.db /tmp/customerdb.h2.db
The application can now connect to the database inside the container. Note that the database contained in the volume /tmp/
is is confined to the container and different from the database I copied to the /tmp/
directory on my workstation.
Upvotes: 2