diff options
-rw-r--r-- | libpod/container.go | 6 | ||||
-rw-r--r-- | libpod/sql_state.go | 30 | ||||
-rw-r--r-- | libpod/sql_state_internal.go | 24 | ||||
-rw-r--r-- | libpod/test_common.go | 4 |
4 files changed, 54 insertions, 10 deletions
diff --git a/libpod/container.go b/libpod/container.go index 96fda27c1..95db85b70 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -148,6 +148,12 @@ type containerState struct { // Only populated if we created a network namespace for the container, // and the network namespace is currently active Routes []*types.Route `json:"routes,omitempty"` + // BindMounts contains files that will be bind-mounted into the + // container when it is mounted. + // These include /etc/hosts and /etc/resolv.conf + // This maps the path the file will be mounted to in the container to + // the path of the file on disk outside the container + BindMounts map[string]string `json:"bindMounts,omitempty"` } // ExecSession contains information on an active exec session diff --git a/libpod/sql_state.go b/libpod/sql_state.go index 41cc435cc..f583febda 100644 --- a/libpod/sql_state.go +++ b/libpod/sql_state.go @@ -16,7 +16,7 @@ import ( // DBSchema is the current DB schema version // Increments every time a change is made to the database's tables -const DBSchema = 13 +const DBSchema = 14 // SQLState is a state implementation backed by a persistent SQLite3 database type SQLState struct { @@ -105,7 +105,8 @@ func (s *SQLState) Refresh() (err error) { NetNSPath=?, ExecSessions=?, IPs=?, - Routes=?;` + Routes=?, + BindMounts=?;` if !s.valid { return ErrDBClosed @@ -136,7 +137,8 @@ func (s *SQLState) Refresh() (err error) { "", "{}", "[]", - "[]") + "[]", + "{}") if err != nil { return errors.Wrapf(err, "error refreshing database state") } @@ -274,7 +276,8 @@ func (s *SQLState) UpdateContainer(ctr *Container) error { NetNSPath, ExecSessions, IPs, - Routes + Routes, + BindMounts FROM containerState WHERE ID=?;` var ( @@ -291,6 +294,7 @@ func (s *SQLState) UpdateContainer(ctr *Container) error { execSessions string ipsJSON string routesJSON string + bindMountsJSON string ) if !s.valid { @@ -315,7 +319,8 @@ func (s *SQLState) UpdateContainer(ctr *Container) error { &netNSPath, &execSessions, &ipsJSON, - &routesJSON) + &routesJSON, + &bindMountsJSON) if err != nil { // The container may not exist in the database if err == sql.ErrNoRows { @@ -359,6 +364,12 @@ func (s *SQLState) UpdateContainer(ctr *Container) error { newState.Routes = routes } + bindMounts := make(map[string]string) + if err := json.Unmarshal([]byte(bindMountsJSON), &bindMounts); err != nil { + return errors.Wrapf(err, "error parsing container %s bind mounts JSON", ctr.ID()) + } + newState.BindMounts = bindMounts + if newState.Mountpoint != "" { newState.Mounted = true } @@ -422,7 +433,8 @@ func (s *SQLState) SaveContainer(ctr *Container) (err error) { NetNSPath=?, ExecSessions=?, IPs=?, - Routes=? + Routes=?, + BindMounts=? WHERE Id=?;` if !ctr.valid { @@ -449,6 +461,11 @@ func (s *SQLState) SaveContainer(ctr *Container) (err error) { return errors.Wrapf(err, "error marshalling container %s routes to JSON", ctr.ID()) } + bindMountsJSON, err := json.Marshal(ctr.state.BindMounts) + if err != nil { + return errors.Wrapf(err, "error marshalling container %s bind mounts to JSON", ctr.ID()) + } + if !s.valid { return ErrDBClosed } @@ -482,6 +499,7 @@ func (s *SQLState) SaveContainer(ctr *Container) (err error) { execSessionsJSON, ipsJSON, routesJSON, + bindMountsJSON, ctr.ID()) if err != nil { return errors.Wrapf(err, "error updating container %s state in database", ctr.ID()) diff --git a/libpod/sql_state_internal.go b/libpod/sql_state_internal.go index fdde45632..7729fb6ec 100644 --- a/libpod/sql_state_internal.go +++ b/libpod/sql_state_internal.go @@ -36,7 +36,8 @@ const ( containerState.NetNSPath, containerState.ExecSessions, containerState.IPs, - containerState.Routes + containerState.Routes, + containerState.BindMounts FROM containers INNER JOIN containerState ON containers.Id = containerState.Id ` @@ -278,6 +279,7 @@ func prepareDB(db *sql.DB) (err error) { ExecSessions TEXT NOT NULL, IPs TEXT NOT NULL, Routes TEXT NOT NULL, + BindMounts TEXT NOT NULL, CHECK (State>0), CHECK (OomKilled IN (0, 1)), @@ -488,6 +490,7 @@ func (s *SQLState) ctrFromScannable(row scannable) (*Container, error) { execSessions string ipsJSON string routesJSON string + bindMountsJSON string ) err := row.Scan( @@ -542,7 +545,8 @@ func (s *SQLState) ctrFromScannable(row scannable) (*Container, error) { &netNSPath, &execSessions, &ipsJSON, - &routesJSON) + &routesJSON, + &bindMountsJSON) if err != nil { if err == sql.ErrNoRows { return nil, ErrNoSuchCtr @@ -641,6 +645,12 @@ func (s *SQLState) ctrFromScannable(row scannable) (*Container, error) { ctr.state.Routes = routes } + bindMounts := make(map[string]string) + if err := json.Unmarshal([]byte(bindMountsJSON), &bindMounts); err != nil { + return nil, errors.Wrapf(err, "error parsing container %s bind mounts JSON", id) + } + ctr.state.BindMounts = bindMounts + labels := make(map[string]string) if err := json.Unmarshal([]byte(labelsJSON), &labels); err != nil { return nil, errors.Wrapf(err, "error parsing container %s labels JSON", id) @@ -778,7 +788,7 @@ func (s *SQLState) addContainer(ctr *Container, pod *Pod) (err error) { addCtrState = `INSERT INTO containerState VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, - ?, ?, ?, ? + ?, ?, ?, ?, ? );` addRegistry = "INSERT INTO registry VALUES (?, ?);" checkCtrInPod = "SELECT 1 FROM containers WHERE Id=? AND Pod=?;" @@ -835,6 +845,11 @@ func (s *SQLState) addContainer(ctr *Container, pod *Pod) (err error) { return errors.Wrapf(err, "error marshalling container %s routes to JSON", ctr.ID()) } + bindMountsJSON, err := json.Marshal(ctr.state.BindMounts) + if err != nil { + return errors.Wrapf(err, "error marshalling container %s bind mounts to JSON", ctr.ID()) + } + netNSPath := "" if ctr.state.NetNS != nil { netNSPath = ctr.state.NetNS.Path() @@ -959,7 +974,8 @@ func (s *SQLState) addContainer(ctr *Container, pod *Pod) (err error) { netNSPath, execSessionsJSON, ipsJSON, - routesJSON) + routesJSON, + bindMountsJSON) if err != nil { return errors.Wrapf(err, "error adding container %s state to database", ctr.ID()) } diff --git a/libpod/test_common.go b/libpod/test_common.go index 75d9516b1..69dcf70ac 100644 --- a/libpod/test_common.go +++ b/libpod/test_common.go @@ -67,6 +67,10 @@ func getTestContainer(id, name, locksDir string) (*Container, error) { PID: 46765, }, }, + BindMounts: map[string]string{ + "/1/2/3": "/4/5/6", + "/test/file.test": "/test2/file2.test", + }, }, valid: true, } |