From 2c4f45ab4cef01c9c2b1fc70048e48c8c456df75 Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Tue, 19 May 2015 18:53:04 +0500 Subject: [PATCH 1/5] preload.sh --- scripts/dockerimages/scripts/preload.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 scripts/dockerimages/scripts/preload.sh diff --git a/scripts/dockerimages/scripts/preload.sh b/scripts/dockerimages/scripts/preload.sh new file mode 100755 index 00000000..69a62665 --- /dev/null +++ b/scripts/dockerimages/scripts/preload.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -e + +BASE=${1:-${PRELOAD_DIR}} +BASE=${BASE:-/mnt/preload} + +if [ -d ${BASE} ]; then + echo Preloading docker images from ${BASE}... + + for file in $(ls ${BASE}); do + if [ -f ${BASE}/${file} ]; then + CAT="cat ${BASE}/${file}" + if [[ ${file} =~ \.t?gz$ ]]; then CAT="${CAT} | gunzip"; fi + if [[ ${file} =~ \.t?xz$ ]]; then CAT="${CAT} | unxz"; fi + CAT="${CAT} | docker load" + echo loading from ${BASE}/${file} + eval ${CAT} || : + fi + done + + echo Done. +else + echo Can not preload images from ${BASE}: not a dir or does not exist. +fi + From 63bd060e2db7a4f30e7fa5d84a3a52ac9d26ffaf Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Tue, 19 May 2015 19:15:52 +0500 Subject: [PATCH 2/5] the preload container --- scripts/dockerimages/13-preload | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 scripts/dockerimages/13-preload diff --git a/scripts/dockerimages/13-preload b/scripts/dockerimages/13-preload new file mode 100644 index 00000000..660f1d92 --- /dev/null +++ b/scripts/dockerimages/13-preload @@ -0,0 +1,3 @@ +FROM base +COPY scripts/dockerimages/scripts/preload.sh / +CMD ["/preload.sh"] From 9a91accae9c488c283f7ab3b35f3add63421f51a Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Tue, 19 May 2015 19:34:34 +0500 Subject: [PATCH 3/5] preload images --- config/default.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/config/default.go b/config/default.go index 27bd9872..be7ea414 100644 --- a/config/default.go +++ b/config/default.go @@ -203,6 +203,22 @@ func NewConfig() *Config { }, LogDriver: "json-file", }, + "preload-system-images": { + Image: "preload", + Privileged: true, + Labels: project.NewSliceorMap(map[string]string{ + DETACH: "false", + SCOPE: SYSTEM, + }), + VolumesFrom: []string{ + "command-volumes", + "system-volumes", + }, + Volumes: []string{ + "/var/run/system-docker.sock:/var/run/docker.sock", + "/var/lib/system-docker/preload:/mnt/preload", + }, + }, "cloud-init-pre": { Image: "cloudinit", Privileged: true, @@ -311,6 +327,25 @@ func NewConfig() *Config { "all-volumes", }, }, + "preload-user-images": { + Image: "preload", + Privileged: true, + Labels: project.NewSliceorMap(map[string]string{ + DETACH: "false", + SCOPE: SYSTEM, + }), + Links: []string{ + "dockerwait", + }, + VolumesFrom: []string{ + "command-volumes", + "system-volumes", + }, + Volumes: []string{ + "/var/run/docker.sock:/var/run/docker.sock", + "/var/lib/docker/preload:/mnt/preload", + }, + }, "console": { Image: "console", Privileged: true, From 2dff0315523a3e71882d187198c85cc42bd31cae Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Fri, 22 May 2015 13:29:24 +0500 Subject: [PATCH 4/5] preload images: service dependencies also, log implicitly added service dependencies and remove unnecessary linking to dockerwait --- config/default.go | 4 ++++ docker/container.go | 9 +++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/config/default.go b/config/default.go index be7ea414..baa463c4 100644 --- a/config/default.go +++ b/config/default.go @@ -231,6 +231,9 @@ func NewConfig() *Config { Environment: project.NewMaporslice([]string{ "CLOUD_INIT_NETWORK=false", }), + Links: []string{ + "preload-system-images", + }, VolumesFrom: []string{ "command-volumes", "system-volumes", @@ -262,6 +265,7 @@ func NewConfig() *Config { }), Net: "host", Links: []string{ + "preload-user-images", "cloud-init-pre", "network", }, diff --git a/docker/container.go b/docker/container.go index 1813b3fd..8d95de7a 100644 --- a/docker/container.go +++ b/docker/container.go @@ -242,12 +242,6 @@ func (c *Container) requiresUserDocker() bool { return true } - for _, v := range c.ContainerCfg.Service.Volumes { - if strings.Index(v, "/var/run/docker.sock") != -1 { - return true - } - } - return false } @@ -267,10 +261,12 @@ func (c *Container) addLink(link string) { func (c *Container) parseService() { if c.requiresSyslog() { c.addLink("syslog") + log.Infof("[%v]: Implicitly linked to 'syslog'", c.Name) } if c.requiresUserDocker() { c.addLink("dockerwait") + log.Infof("[%v]: Implicitly linked to 'dockerwait'", c.Name) } else if c.ContainerCfg.Service.Image != "" { client, err := NewClient(c.dockerHost) if err != nil { @@ -281,6 +277,7 @@ func (c *Container) parseService() { i, _ := client.InspectImage(c.ContainerCfg.Service.Image) if i == nil { c.addLink("network") + log.Infof("[%v]: Implicitly linked to 'network'", c.Name) } } From 15de0a4a75fac6759f306bbc3176c4b5b4bfdd79 Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Fri, 22 May 2015 14:50:07 +0500 Subject: [PATCH 5/5] preload images from fresh files only --- scripts/dockerimages/scripts/preload.sh | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/scripts/dockerimages/scripts/preload.sh b/scripts/dockerimages/scripts/preload.sh index 69a62665..d8b67fce 100755 --- a/scripts/dockerimages/scripts/preload.sh +++ b/scripts/dockerimages/scripts/preload.sh @@ -4,17 +4,32 @@ set -e BASE=${1:-${PRELOAD_DIR}} BASE=${BASE:-/mnt/preload} +should_load() { + file=${1} + if [[ ${file} =~ \.done$ ]]; then echo false + elif [ -f ${file} ]; then + if [ ! -e ${file}.done ]; then echo true + elif [[ $(stat -c %Y ${file}) > $(stat -c %Y ${file}.done) ]]; then echo true + else echo false + fi + else echo false + fi +} + if [ -d ${BASE} ]; then echo Preloading docker images from ${BASE}... for file in $(ls ${BASE}); do - if [ -f ${BASE}/${file} ]; then - CAT="cat ${BASE}/${file}" + path=${BASE}/${file} + loading=$(should_load ${path}) + if [ ${loading} == "true" ]; then + CAT="cat ${path}" if [[ ${file} =~ \.t?gz$ ]]; then CAT="${CAT} | gunzip"; fi if [[ ${file} =~ \.t?xz$ ]]; then CAT="${CAT} | unxz"; fi CAT="${CAT} | docker load" - echo loading from ${BASE}/${file} + echo loading from ${path} eval ${CAT} || : + touch ${path}.done || : fi done