Connecting to an H2 Database in a Docker Container

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:

  • Apache, PHP, WordPress caching issue in Docker container
  • getting java.net.UnknownHostException while running GOCD docker container in QNAP
  • Use Eureka despite having random external port of docker containers
  • With commited DOCKER container, the new container failed to run TOMCAT9 in Raspberry PI 3
  • Connect to RPC Server in Docker
  • Connecting go and postgres with docker-compose
  • 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

  • What are the best approaches to run 100 parallel test on protractor?
  • docker speeds up python, why?
  • How to use Liberty 8.5.5.9 Docker
  • Docker-compose ps not showing any output
  • Docker cannot run on build when running container with a different user
  • Root user in Elasticsearch 2.4.0 in Docker container
  • 2 Solutions collect form web for “Connecting to an H2 Database in a Docker Container”

    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”)

    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.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.