Network problems in Docker can often be “fixed” by deleting /var/lib/docker/network/files/local-kv.db. However, in some cases it might be possible to just edit the bits that are wrong. This file is a BoltDB database.
Here’s some code to extract the keys contained in the file (libkv_example.go, heavily inspired by the example code in libkv/docs/examples.md)
package main import ( "time" "log" "github.com/docker/libkv" "github.com/docker/libkv/store" "github.com/docker/libkv/store/boltdb" ) func init() { // Register boltdb store to libkv boltdb.Register() } func main() { client := "./local-kv.db" // ./ appears to be necessary // Initialize a new store kv, err := libkv.NewStore( store.BOLTDB, // or "boltdb" []string{client}, &store.Config{ Bucket: "libnetwork", ConnectionTimeout: 10*time.Second, }, ) if err != nil { log.Fatalf("Cannot create store: %v", err) } pair, err := kv.List("docker/network") for _, p := range pair { println("key:", string(p.Key)) println("value:", string(p.Value)) } }
Make sure to work on a copy of your local-kv.db file, and that you have write permissions to your copy. Also note that this script is anything but thoroughly tested.
If you’re new to go like me, here are the commands to install Go, the required libraries and run the program (if you’re on Debian):
sudo apt-get install golang-1.8-go PATH=/usr/lib/go-1.8/bin/:$PATH # feel free to try go build libkv_example.go without the go get commands # you'll most likely get an error like this: # libkv_example.go:7:5: cannot find package "github.com/docker/libkv" in any of: # ... go get github.com/docker/libkv go get go.etcd.io/bbolt go build libkv_example.go ./libkv_example