How to load metabase's database backup inside Docker container?

When I first installed Metabase with Docker, I run the oneliner,

$ docker run -d -p 3000:3000 --name metabase metabase/metabase

Since then Iโ€™ve made a whole bunch of dashboards and questionsโ€ฆ

Iโ€™ve made a backup like this,

$ docker exec -t metabase cat metabase.db.mv.db > /tmp/metabase.db.mv.db

So now, I have the backup in my machine. Now I try loading the backup setting the MB_DB_FILE env variable, but metabase creates a new H2 databaseโ€ฆ

$ docker run -d -p 3000:3000 -v /tmp:/tmp -e "MB_DB_FILE=/tmp/metabase.db.mv.db" --name metabase metabase/metabase

How could I load a backup database inside the Docker container?

You need to set MB_DB_FILE to something like metabase.db because H2 adds the extension automatically.

So the actual file is called /tmp/metabase.db.mv.db but the env var is MB_DB_FILE=/tmp/metabase.db

So you say to name my backup metabase.db.mv.db, but run docker with MB_DB_FILE=metabase.db

That way, my backup metabase.db.mv.db gets overrided by a new Metabase H2 database (same name)

Now Iโ€™ve tried this,

Create a new docker metabase container with mapped storage volume.
$ docker stop metabase
Replaced the new database metabase.db.mv.db, with my backup (same name).
$ docker start metabase
Started the container again, but metabase.db.mv.db was overriden by a new one.

:cactus: It didnโ€™t work

Those are the cases:

  1. run a new container with mapped volume and MB_DB_FILE=metabase.db (but local file named metabase.db.mv.db)
  2. run a new container with mapped volume, stop it, replace its database with my backup, and start container again.

In both cases, Metabase overrides the backup. It doesnโ€™t load it.

do you have any updates on this issue, i am also dealing with the same problem. @autorun

Yesโ€ฆ make sure you have the backup file named โ€œmetabase.db.mv.dbโ€.
Its confusing because you have to tell โ€œMB_DB_FILE=/tmp/metabase.dbโ€ instead.
So if you have your metabase backup (metabase.db.mv.db) in ~/metabase, run this

docker run -d -v ~/metabase:/tmp -e MB_DB_FILE=/tmp/metabase.db --name metabase metabase/metabase

It is still unable to load data. I am running exactly this command. with metabase.db.mv.db in myLocation.

docker run -p 3000:3000 -v ~/myLocation:/tmp -e "MB_DB_FILE=/tmp/metabase.db" --name metabase metabase/metabase

and getting this output;

04-10 12:34:56 INFO metabase.util :: Loading Metabase...
04-10 12:34:56 INFO util.encryption :: DB details encryption is DISABLED for this Metabase instance. ๐Ÿ”“
04-10 12:35:06 INFO metabase.core :: Starting Metabase in STANDALONE mode
04-10 12:35:06 INFO metabase.core :: Launching Embedded Jetty Webserver with config:
 {:port 3000, :host "adb5e799e60f"}
04-10 12:35:06 INFO metabase.core :: Starting Metabase version v0.23.1 (df90b9e release-0.23.1) ...
04-10 12:35:06 INFO metabase.core :: System timezone is 'GMT' ...
04-10 12:35:06 DEBUG metabase.driver :: Registered driver :bigquery ๐Ÿšš
04-10 12:35:06 DEBUG metabase.driver :: Registered driver :crate ๐Ÿšš
04-10 12:35:06 DEBUG metabase.driver :: Registered driver :druid ๐Ÿšš
04-10 12:35:06 DEBUG metabase.driver :: Registered driver :googleanalytics ๐Ÿšš
04-10 12:35:06 DEBUG metabase.driver :: Registered driver :h2 ๐Ÿšš
04-10 12:35:07 DEBUG metabase.driver :: Registered driver :mongo ๐Ÿšš
04-10 12:35:07 DEBUG metabase.driver :: Registered driver :mysql ๐Ÿšš
04-10 12:35:07 DEBUG metabase.driver :: Registered driver :postgres ๐Ÿšš
04-10 12:35:07 DEBUG metabase.driver :: Registered driver :redshift ๐Ÿšš
04-10 12:35:07 DEBUG metabase.driver :: Registered driver :sqlite ๐Ÿšš
04-10 12:35:07 DEBUG metabase.driver :: Registered driver :sqlserver ๐Ÿšš
04-10 12:35:07 INFO metabase.core :: Setting up and migrating Metabase DB. Please sit tight, this may take a minute...
04-10 12:35:07 INFO metabase.db :: Verifying h2 Database Connection ...
04-10 12:35:07 INFO metabase.db :: Verify Database Connection ...  โœ…
04-10 12:35:07 INFO metabase.db :: Running Database Migrations...
04-10 12:35:07 INFO metabase.db :: Setting up Liquibase...
04-10 12:35:07 INFO metabase.db :: Liquibase is ready.
04-10 12:35:07 INFO metabase.db :: Checking if Database has unrun migrations...
04-10 12:35:31 INFO metabase.db :: Database Migrations Current ...  โœ…
com.mchange.v2.cfg.DelayedLogItem [ level -> FINE, text -> "The configuration file for resource identifier 'hocon:/reference,/application,/c3p0,/' could not be found. Skipping.", exception -> null]
04-10 12:35:31 INFO db.migrations :: Running all necessary data migrations, this may take a minute.
04-10 12:35:32 INFO db.migrations :: Finished running data migrations.
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.activity-feed ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.dependencies ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.driver-notifications ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.last-login ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.metabot-lifecycle ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.notifications ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.revision ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.sync-database ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.events :: Starting events listener: metabase.events.view-log ๐Ÿ‘‚
04-10 12:35:32 INFO metabase.task :: Loading tasks namespace: metabase.task.follow-up-emails ๐Ÿ“†
04-10 12:35:32 INFO metabase.task :: Loading tasks namespace: metabase.task.send-anonymous-stats ๐Ÿ“†
04-10 12:35:32 INFO metabase.task :: Loading tasks namespace: metabase.task.send-pulses ๐Ÿ“†
04-10 12:35:32 INFO metabase.task :: Loading tasks namespace: metabase.task.sync-databases ๐Ÿ“†
04-10 12:35:32 INFO metabase.task :: Loading tasks namespace: metabase.task.upgrade-checks ๐Ÿ“†
04-10 12:35:32 INFO metabase.core :: Looks like this is a new installation ... preparing setup wizard
04-10 12:35:32 INFO metabase.core :: Please use the following url to setup your Metabase installation:

If anyone still having this problem, here is what i did and worked well:

First, backup the metabase.db directory (yes, it is a folder inside /):

docker cp metabase:/metabase.db /home/metabase

To restore into a new container:

 docker run -d -p 3001:3000 --name metabase2 -v /home/metabase/metabase.db:/metabase.db -e "MB_DB_FILE=/metabase.db" metabase/metabase

Notice that iโ€™ve changed the exposed port to 3001 and container name to metabase2.
If i hit http://localhost:3001 then it is all good.

2 Likes

The metabase team should add this to the tutorial somewhere. You made it so much clearer. Thanks!!

By any chance do you know how to upgrade metabase in a docker container without having to make a backup but keeping the metabase.db from the older container? (I already made the backup in case something fails)

I think you have to define metabase.db as a volume in docker container.

Alternatively I run Metabase container with the following options:

-e "MB_DB_TYPE=postgres" -e "MB_DB_DBNAME=metabase" -e "MB_DB_PORT=5432" -e "MB_DB_USER=postgres" -e "MB_DB_PASS=password" -e "MB_DB_HOST=db_container_name"

I keep things separated, with metabaseโ€™s database in another container.
Everytime they release a new version of Metabase, I only have to stop metabaseโ€™s container, remove it, remove its image and run a new fresh one (with this options).