From 06b53e3fc7aca2b3dae32edab08c7662d3e9e7e8 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 2 Jul 2013 12:19:25 +0000 Subject: [PATCH 1/3] store hostConfig to /tmp while container is running --- container.go | 30 ++++++++++++++++++++++++++++++ runtime.go | 4 +++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/container.go b/container.go index 508f39c0ef..f8459ecdc3 100644 --- a/container.go +++ b/container.go @@ -265,6 +265,29 @@ func (container *Container) ToDisk() (err error) { return ioutil.WriteFile(container.jsonPath(), data, 0666) } +func (container *Container) ReadTempHostConfig() (*HostConfig, error) { + data, err := ioutil.ReadFile(container.hostConfigPath()) + if err != nil { + return &HostConfig{}, err + } + hostConfig := &HostConfig{} + if err := json.Unmarshal(data, hostConfig); err != nil { + return &HostConfig{}, err + } + return hostConfig, nil +} + +func (container *Container) SaveHostConfig(hostConfig *HostConfig) (err error) { + if hostConfig == nil { + return os.Remove(container.hostConfigPath()) + } + data, err := json.Marshal(hostConfig) + if err != nil { + return + } + return ioutil.WriteFile(container.hostConfigPath(), data, 0666) +} + func (container *Container) generateLXCConfig() error { fo, err := os.Create(container.lxcConfigPath()) if err != nil { @@ -636,6 +659,7 @@ func (container *Container) Start(hostConfig *HostConfig) error { container.waitLock = make(chan struct{}) container.ToDisk() + container.SaveHostConfig(hostConfig) go container.monitor() return nil } @@ -791,6 +815,8 @@ func (container *Container) monitor() { // FIXME: why are we serializing running state to disk in the first place? //log.Printf("%s: Failed to dump configuration to the disk: %s", container.ID, err) } + // Remove temp host config + container.SaveHostConfig(nil) } func (container *Container) kill() error { @@ -970,6 +996,10 @@ func (container *Container) ReadLog(name string) (io.Reader, error) { return os.Open(container.logPath(name)) } +func (container *Container) hostConfigPath() string { + return path.Join("/tmp", container.ID+".config.host") +} + func (container *Container) jsonPath() string { return path.Join(container.root, "config.json") } diff --git a/runtime.go b/runtime.go index 06b1f8e1b9..7e728cfe6f 100644 --- a/runtime.go +++ b/runtime.go @@ -145,7 +145,7 @@ func (runtime *Runtime) Register(container *Container) error { container.State.Ghost = false container.State.setStopped(0) // assume empty host config - hostConfig := &HostConfig{} + hostConfig, _ := container.ReadTempHostConfig() if err := container.Start(hostConfig); err != nil { return err } @@ -156,6 +156,8 @@ func (runtime *Runtime) Register(container *Container) error { if err := container.ToDisk(); err != nil { return err } + // remove temp host config + container.SaveHostConfig(nil) } } } From 27a137ccab5990721298cf58aee588ca9b4200ff Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 2 Jul 2013 17:02:42 +0000 Subject: [PATCH 2/3] change file location --- container.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container.go b/container.go index f8459ecdc3..a2e0c7049c 100644 --- a/container.go +++ b/container.go @@ -997,7 +997,7 @@ func (container *Container) ReadLog(name string) (io.Reader, error) { } func (container *Container) hostConfigPath() string { - return path.Join("/tmp", container.ID+".config.host") + return path.Join(container.root, "hostconfig.json") } func (container *Container) jsonPath() string { From 3042f11666a38ea6b1da206de372bf85463db945 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 2 Jul 2013 18:02:16 +0000 Subject: [PATCH 3/3] never remove the file and try to load it in start --- container.go | 10 ++++------ runtime.go | 5 +---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/container.go b/container.go index a2e0c7049c..7acbc7ba69 100644 --- a/container.go +++ b/container.go @@ -265,7 +265,7 @@ func (container *Container) ToDisk() (err error) { return ioutil.WriteFile(container.jsonPath(), data, 0666) } -func (container *Container) ReadTempHostConfig() (*HostConfig, error) { +func (container *Container) ReadHostConfig() (*HostConfig, error) { data, err := ioutil.ReadFile(container.hostConfigPath()) if err != nil { return &HostConfig{}, err @@ -278,9 +278,6 @@ func (container *Container) ReadTempHostConfig() (*HostConfig, error) { } func (container *Container) SaveHostConfig(hostConfig *HostConfig) (err error) { - if hostConfig == nil { - return os.Remove(container.hostConfigPath()) - } data, err := json.Marshal(hostConfig) if err != nil { return @@ -491,6 +488,9 @@ func (container *Container) Attach(stdin io.ReadCloser, stdinCloser io.Closer, s func (container *Container) Start(hostConfig *HostConfig) error { container.State.lock() defer container.State.unlock() + if len(hostConfig.Binds) == 0 { + hostConfig, _ = container.ReadHostConfig() + } if container.State.Running { return fmt.Errorf("The container %s is already running.", container.ID) @@ -815,8 +815,6 @@ func (container *Container) monitor() { // FIXME: why are we serializing running state to disk in the first place? //log.Printf("%s: Failed to dump configuration to the disk: %s", container.ID, err) } - // Remove temp host config - container.SaveHostConfig(nil) } func (container *Container) kill() error { diff --git a/runtime.go b/runtime.go index 7e728cfe6f..d283540abb 100644 --- a/runtime.go +++ b/runtime.go @@ -144,8 +144,7 @@ func (runtime *Runtime) Register(container *Container) error { utils.Debugf("Restarting") container.State.Ghost = false container.State.setStopped(0) - // assume empty host config - hostConfig, _ := container.ReadTempHostConfig() + hostConfig := &HostConfig{} if err := container.Start(hostConfig); err != nil { return err } @@ -156,8 +155,6 @@ func (runtime *Runtime) Register(container *Container) error { if err := container.ToDisk(); err != nil { return err } - // remove temp host config - container.SaveHostConfig(nil) } } }