mirror of
https://github.com/containers/podman.git
synced 2025-06-19 00:06:43 +08:00
Add location in DB for saving files to bind mount in
Signed-off-by: Matthew Heon <matthew.heon@gmail.com> Closes: #462 Approved by: baude
This commit is contained in:
@ -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
|
||||
|
@ -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())
|
||||
|
@ -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())
|
||||
}
|
||||
|
@ -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,
|
||||
}
|
||||
|
Reference in New Issue
Block a user