mirror of https://github.com/docker/docs.git
Add clean if start fail
This commit is contained in:
parent
2b92aa71f9
commit
664acd2971
48
container.go
48
container.go
|
@ -567,6 +567,8 @@ func (container *Container) Start(hostConfig *HostConfig) error {
|
||||||
container.State.Lock()
|
container.State.Lock()
|
||||||
defer container.State.Unlock()
|
defer container.State.Unlock()
|
||||||
|
|
||||||
|
startFct := func(hostConfig *HostConfig) error {
|
||||||
|
|
||||||
if hostConfig == nil { // in docker start of docker restart we want to reuse previous HostConfigFile
|
if hostConfig == nil { // in docker start of docker restart we want to reuse previous HostConfigFile
|
||||||
hostConfig, _ = container.ReadHostConfig()
|
hostConfig, _ = container.ReadHostConfig()
|
||||||
}
|
}
|
||||||
|
@ -824,6 +826,12 @@ func (container *Container) Start(hostConfig *HostConfig) error {
|
||||||
go container.monitor(hostConfig)
|
go container.monitor(hostConfig)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
err := startFct(hostConfig)
|
||||||
|
if err != nil {
|
||||||
|
container.cleanup()
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (container *Container) Run() error {
|
func (container *Container) Run() error {
|
||||||
hostConfig := &HostConfig{}
|
hostConfig := &HostConfig{}
|
||||||
|
@ -981,6 +989,28 @@ func (container *Container) monitor(hostConfig *HostConfig) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
|
container.cleanup()
|
||||||
|
|
||||||
|
// Re-create a brand new stdin pipe once the container exited
|
||||||
|
if container.Config.OpenStdin {
|
||||||
|
container.stdin, container.stdinPipe = io.Pipe()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release the lock
|
||||||
|
close(container.waitLock)
|
||||||
|
|
||||||
|
if err := container.ToDisk(); err != nil {
|
||||||
|
// FIXME: there is a race condition here which causes this to fail during the unit tests.
|
||||||
|
// If another goroutine was waiting for Wait() to return before removing the container's root
|
||||||
|
// from the filesystem... At this point it may already have done so.
|
||||||
|
// This is because State.setStopped() has already been called, and has caused Wait()
|
||||||
|
// to return.
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (container *Container) cleanup() {
|
||||||
container.releaseNetwork()
|
container.releaseNetwork()
|
||||||
if container.Config.OpenStdin {
|
if container.Config.OpenStdin {
|
||||||
if err := container.stdin.Close(); err != nil {
|
if err := container.stdin.Close(); err != nil {
|
||||||
|
@ -1003,24 +1033,6 @@ func (container *Container) monitor(hostConfig *HostConfig) {
|
||||||
if err := container.Unmount(); err != nil {
|
if err := container.Unmount(); err != nil {
|
||||||
log.Printf("%v: Failed to umount filesystem: %v", container.ID, err)
|
log.Printf("%v: Failed to umount filesystem: %v", container.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Re-create a brand new stdin pipe once the container exited
|
|
||||||
if container.Config.OpenStdin {
|
|
||||||
container.stdin, container.stdinPipe = io.Pipe()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release the lock
|
|
||||||
close(container.waitLock)
|
|
||||||
|
|
||||||
if err := container.ToDisk(); err != nil {
|
|
||||||
// FIXME: there is a race condition here which causes this to fail during the unit tests.
|
|
||||||
// If another goroutine was waiting for Wait() to return before removing the container's root
|
|
||||||
// from the filesystem... At this point it may already have done so.
|
|
||||||
// This is because State.setStopped() has already been called, and has caused Wait()
|
|
||||||
// to return.
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (container *Container) kill() error {
|
func (container *Container) kill() error {
|
||||||
|
|
Loading…
Reference in New Issue