From 5ee3c58d2549c25fa4464963831a28a99407b6cd Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 13 Aug 2013 12:02:17 +0000 Subject: [PATCH 01/78] Add USER instruction --- buildfile.go | 5 +++++ buildfile_test.go | 11 +++++++++++ docs/sources/use/builder.rst | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/buildfile.go b/buildfile.go index 5a2662646e..06ca331a40 100644 --- a/buildfile.go +++ b/buildfile.go @@ -197,6 +197,11 @@ func (b *buildFile) CmdExpose(args string) error { return b.commit("", b.config.Cmd, fmt.Sprintf("EXPOSE %v", ports)) } +func (b *buildFile) CmdUser(args string) error { + b.config.User = args + return b.commit("", b.config.Cmd, fmt.Sprintf("USER %v", args)) +} + func (b *buildFile) CmdInsert(args string) error { return fmt.Errorf("INSERT has been deprecated. Please use ADD instead") } diff --git a/buildfile_test.go b/buildfile_test.go index d89c40d16c..14986161d8 100644 --- a/buildfile_test.go +++ b/buildfile_test.go @@ -270,6 +270,17 @@ func TestBuildMaintainer(t *testing.T) { } } +func TestBuildUser(t *testing.T) { + img := buildImage(testContextTemplate{` + from {IMAGE} + user dockerio + `, nil, nil}, t, nil, true) + + if img.Config.User != "dockerio" { + t.Fail() + } +} + func TestBuildEnv(t *testing.T) { img := buildImage(testContextTemplate{` from {IMAGE} diff --git a/docs/sources/use/builder.rst b/docs/sources/use/builder.rst index d111e335ab..98c6beaccb 100644 --- a/docs/sources/use/builder.rst +++ b/docs/sources/use/builder.rst @@ -203,6 +203,14 @@ to the entrypoint. The ``VOLUME`` instruction will add one or more new volumes to any container created from the image. +3.10 USER +--------- + + ``USER daemon`` + +The ``USER`` instruction sets the username or UID to use when running +the image. + 4. Dockerfile Examples ====================== From c7cda86e847d541efbc4fc8ce834d924b2b98bf1 Mon Sep 17 00:00:00 2001 From: Brian Olsen Date: Tue, 13 Aug 2013 22:30:08 +0200 Subject: [PATCH 02/78] Don't read from stdout in hijack unless attached. Fixes #1503 --- commands.go | 26 +++++++++++++++++--------- commands_test.go | 6 ++---- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/commands.go b/commands.go index 056bcbfb56..d0a1c6b1e8 100644 --- a/commands.go +++ b/commands.go @@ -1460,15 +1460,18 @@ func (cli *DockerCli) CmdRun(args ...string) error { v := url.Values{} v.Set("logs", "1") v.Set("stream", "1") + var out io.Writer if config.AttachStdin { v.Set("stdin", "1") } if config.AttachStdout { v.Set("stdout", "1") + out = cli.out } if config.AttachStderr { v.Set("stderr", "1") + out = cli.out } signals := make(chan os.Signal, 1) @@ -1482,7 +1485,7 @@ func (cli *DockerCli) CmdRun(args ...string) error { } }() - if err := cli.hijack("POST", "/containers/"+runResult.ID+"/attach?"+v.Encode(), config.Tty, cli.in, cli.out); err != nil { + if err := cli.hijack("POST", "/containers/"+runResult.ID+"/attach?"+v.Encode(), config.Tty, cli.in, out); err != nil { utils.Debugf("Error hijack: %s", err) return err } @@ -1645,11 +1648,14 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea rwc, br := clientconn.Hijack() defer rwc.Close() - receiveStdout := utils.Go(func() error { - _, err := io.Copy(out, br) - utils.Debugf("[hijack] End of stdout") - return err - }) + var receiveStdout (chan error) + if out != nil { + receiveStdout = utils.Go(func() error { + _, err := io.Copy(out, br) + utils.Debugf("[hijack] End of stdout") + return err + }) + } if in != nil && setRawTerminal && cli.isTerminal && os.Getenv("NORAW") == "" { oldState, err := term.SetRawTerminal(cli.terminalFd) @@ -1677,9 +1683,11 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea return nil }) - if err := <-receiveStdout; err != nil { - utils.Debugf("Error receiveStdout: %s", err) - return err + if out != nil { + if err := <-receiveStdout; err != nil { + utils.Debugf("Error receiveStdout: %s", err) + return err + } } if !cli.isTerminal { diff --git a/commands_test.go b/commands_test.go index ac30cc73f9..9686849aaa 100644 --- a/commands_test.go +++ b/commands_test.go @@ -255,7 +255,7 @@ func TestRunAttachStdin(t *testing.T) { ch := make(chan struct{}) go func() { defer close(ch) - cli.CmdRun("-i", "-a", "stdin", unitTestImageID, "sh", "-c", "echo hello && cat") + cli.CmdRun("-i", "-a", "stdin", unitTestImageID, "sh", "-c", "echo hello && cat && sleep 5") }() // Send input to the command, close stdin @@ -283,12 +283,10 @@ func TestRunAttachStdin(t *testing.T) { // wait for CmdRun to return setTimeout(t, "Waiting for CmdRun timed out", 5*time.Second, func() { - // Unblock hijack end - stdout.Read([]byte{}) <-ch }) - setTimeout(t, "Waiting for command to exit timed out", 5*time.Second, func() { + setTimeout(t, "Waiting for command to exit timed out", 10*time.Second, func() { container.Wait() }) From f11fb706f6f54a0a06e80b7d4326a14ce50c1611 Mon Sep 17 00:00:00 2001 From: Andreas Savvides Date: Fri, 16 Aug 2013 12:07:37 +0100 Subject: [PATCH 03/78] Adding direct reference to contribution guidelines --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ed2709158f..ffe5f0dca7 100644 --- a/README.md +++ b/README.md @@ -301,8 +301,7 @@ Contributing to Docker ====================== Want to hack on Docker? Awesome! There are instructions to get you -started on the website: -http://docs.docker.io/en/latest/contributing/contributing/ +started [here](CONTRIBUTING.md). They are probably not perfect, please let us know if anything feels wrong or incomplete. From 20b1e19641d94b5e71ecee7a9703eb392a81cf9a Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 16 Aug 2013 13:31:50 +0000 Subject: [PATCH 04/78] add loading message --- runtime.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/runtime.go b/runtime.go index 0f97c01cba..86ce725177 100644 --- a/runtime.go +++ b/runtime.go @@ -207,19 +207,29 @@ func (runtime *Runtime) Destroy(container *Container) error { } func (runtime *Runtime) restore() error { + wheel := "-\\|/" + if os.Getenv("DEBUG") == "" { + fmt.Printf("Loading containers: ") + } dir, err := ioutil.ReadDir(runtime.repository) if err != nil { return err } - for _, v := range dir { + for i, v := range dir { id := v.Name() container, err := runtime.Load(id) + if i%21 == 0 && os.Getenv("DEBUG") == "" { + fmt.Printf("\b%c", wheel[i%4]) + } if err != nil { utils.Debugf("Failed to load container %v: %v", id, err) continue } utils.Debugf("Loaded container %v", container.ID) } + if os.Getenv("DEBUG") == "" { + fmt.Printf("\bdone.\n") + } return nil } From 5325703c2758b394de3e12723dd8dc89b1df9b29 Mon Sep 17 00:00:00 2001 From: Matthew Mueller Date: Sat, 17 Aug 2013 21:54:10 -0700 Subject: [PATCH 05/78] updated default --- docs/sources/commandline/cli.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/commandline/cli.rst b/docs/sources/commandline/cli.rst index 6d96886473..9f8c296fe6 100644 --- a/docs/sources/commandline/cli.rst +++ b/docs/sources/commandline/cli.rst @@ -15,7 +15,7 @@ To list available commands, either run ``docker`` with no parameters or execute $ sudo docker Usage: docker [OPTIONS] COMMAND [arg...] - -H=[tcp://127.0.0.1:4243]: tcp://host:port to bind/connect to or unix://path/to/socket to use + -H=[unix:///var/run/docker.sock]: tcp://host:port to bind/connect to or unix://path/to/socket to use A self-sufficient runtime for linux containers. From f409c119168b145157ff5329fd10ad0a8725d341 Mon Sep 17 00:00:00 2001 From: Matt Mueller Date: Sat, 17 Aug 2013 22:10:06 -0700 Subject: [PATCH 06/78] add to cli --- commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands.go b/commands.go index 056bcbfb56..a74a23fe92 100644 --- a/commands.go +++ b/commands.go @@ -72,7 +72,7 @@ func (cli *DockerCli) CmdHelp(args ...string) error { return nil } } - help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[tcp://%s:%d]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTHTTPHOST, DEFAULTHTTPPORT) + help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix:///var/run/docker.sock]: tcp://host:port (ex. tcp://%s:%d) to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTHTTPHOST, DEFAULTHTTPPORT) for _, command := range [][]string{ {"attach", "Attach to a running container"}, {"build", "Build a container from a Dockerfile"}, From b22c9731102abbaf42e8d7e37e179ef56b945ccd Mon Sep 17 00:00:00 2001 From: Song Gao Date: Sun, 18 Aug 2013 21:44:46 -0500 Subject: [PATCH 07/78] Added escape sequence to tutorial --- docs/sources/use/basics.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/sources/use/basics.rst b/docs/sources/use/basics.rst index 411e1c30d1..b4f93b432b 100644 --- a/docs/sources/use/basics.rst +++ b/docs/sources/use/basics.rst @@ -33,6 +33,8 @@ Running an interactive shell # Run an interactive shell in the ubuntu image, # allocate a tty, attach stdin and stdout + # To detach the tty without exiting the shell, + # use the escape sequence Ctrl-p + Ctrl-q sudo docker run -i -t ubuntu /bin/bash Why ``sudo``? From 18962d0ff33cfa6ba2976aa459c766acfd23c1bf Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 16 Aug 2013 14:29:40 +0000 Subject: [PATCH 08/78] load authConfig only when needed and fix useless WARNING --- auth/auth.go | 8 ++++---- commands.go | 25 ++++++++++++++++++------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/auth/auth.go b/auth/auth.go index 003a6e737c..91314877c7 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -76,7 +76,7 @@ func LoadConfig(rootPath string) (*ConfigFile, error) { configFile := ConfigFile{Configs: make(map[string]AuthConfig), rootPath: rootPath} confFile := path.Join(rootPath, CONFIGFILE) if _, err := os.Stat(confFile); err != nil { - return &configFile, ErrConfigFileMissing + return &configFile, nil //missing file is not an error } b, err := ioutil.ReadFile(confFile) if err != nil { @@ -86,13 +86,13 @@ func LoadConfig(rootPath string) (*ConfigFile, error) { if err := json.Unmarshal(b, &configFile.Configs); err != nil { arr := strings.Split(string(b), "\n") if len(arr) < 2 { - return nil, fmt.Errorf("The Auth config file is empty") + return &configFile, fmt.Errorf("The Auth config file is empty") } authConfig := AuthConfig{} origAuth := strings.Split(arr[0], " = ") authConfig.Username, authConfig.Password, err = decodeAuth(origAuth[1]) if err != nil { - return nil, err + return &configFile, err } origEmail := strings.Split(arr[1], " = ") authConfig.Email = origEmail[1] @@ -101,7 +101,7 @@ func LoadConfig(rootPath string) (*ConfigFile, error) { for k, authConfig := range configFile.Configs { authConfig.Username, authConfig.Password, err = decodeAuth(authConfig.Auth) if err != nil { - return nil, err + return &configFile, err } authConfig.Auth = "" configFile.Configs[k] = authConfig diff --git a/commands.go b/commands.go index 056bcbfb56..8e0ba3b45b 100644 --- a/commands.go +++ b/commands.go @@ -303,6 +303,8 @@ func (cli *DockerCli) CmdLogin(args ...string) error { return nil } + cli.LoadConfigFile() + var oldState *term.State if *flUsername == "" || *flPassword == "" || *flEmail == "" { oldState, err = term.SetRawTerminal(cli.terminalFd) @@ -498,6 +500,7 @@ func (cli *DockerCli) CmdInfo(args ...string) error { } if len(out.IndexServerAddress) != 0 { + cli.LoadConfigFile() u := cli.configFile.Configs[out.IndexServerAddress].Username if len(u) > 0 { fmt.Fprintf(cli.out, "Username: %v\n", u) @@ -838,12 +841,18 @@ func (cli *DockerCli) CmdPush(args ...string) error { return nil } + cli.LoadConfigFile() + // If we're not using a custom registry, we know the restrictions // applied to repository names and can warn the user in advance. // Custom repositories can have different rules, and we must also // allow pushing by image ID. if len(strings.SplitN(name, "/", 2)) == 1 { - return fmt.Errorf("Impossible to push a \"root\" repository. Please rename your repository in / (ex: %s/%s)", cli.configFile.Configs[auth.IndexServerAddress()].Username, name) + username := cli.configFile.Configs[auth.IndexServerAddress()].Username + if username == "" { + username = "" + } + return fmt.Errorf("Impossible to push a \"root\" repository. Please rename your repository in / (ex: %s/%s)", username, name) } v := url.Values{} @@ -1745,6 +1754,14 @@ func Subcmd(name, signature, description string) *flag.FlagSet { return flags } +func (cli *DockerCli) LoadConfigFile() (err error) { + cli.configFile, err = auth.LoadConfig(os.Getenv("HOME")) + if err != nil { + fmt.Fprintf(cli.err, "WARNING: %s\n", err) + } + return err +} + func NewDockerCli(in io.ReadCloser, out, err io.Writer, proto, addr string) *DockerCli { var ( isTerminal = false @@ -1761,15 +1778,9 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, proto, addr string) *Doc if err == nil { err = out } - - configFile, e := auth.LoadConfig(os.Getenv("HOME")) - if e != nil { - fmt.Fprintf(err, "WARNING: %s\n", e) - } return &DockerCli{ proto: proto, addr: addr, - configFile: configFile, in: in, out: out, err: err, From 646afab28d8ccadf81e1d18055335739b6b983d1 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Mon, 19 Aug 2013 12:05:47 +0000 Subject: [PATCH 09/78] improve version --- commands.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/commands.go b/commands.go index 899a8e2f1a..9d0b0968d1 100644 --- a/commands.go +++ b/commands.go @@ -19,6 +19,7 @@ import ( "os/signal" "path/filepath" "reflect" + "runtime" "strconv" "strings" "syscall" @@ -433,6 +434,12 @@ func (cli *DockerCli) CmdVersion(args ...string) error { return nil } + fmt.Fprintf(cli.out, "Client version: %s\n", VERSION) + fmt.Fprintf(cli.out, "Go version (client): %s\n", runtime.Version()) + if GITCOMMIT != "" { + fmt.Fprintf(cli.out, "Git commit (client): %s\n", GITCOMMIT) + } + body, _, err := cli.call("GET", "/version", nil) if err != nil { return err @@ -444,13 +451,12 @@ func (cli *DockerCli) CmdVersion(args ...string) error { utils.Debugf("Error unmarshal: body: %s, err: %s\n", body, err) return err } - fmt.Fprintf(cli.out, "Client version: %s\n", VERSION) fmt.Fprintf(cli.out, "Server version: %s\n", out.Version) if out.GitCommit != "" { - fmt.Fprintf(cli.out, "Git commit: %s\n", out.GitCommit) + fmt.Fprintf(cli.out, "Git commit (version): %s\n", out.GitCommit) } if out.GoVersion != "" { - fmt.Fprintf(cli.out, "Go version: %s\n", out.GoVersion) + fmt.Fprintf(cli.out, "Go version (server): %s\n", out.GoVersion) } release := utils.GetReleaseVersion() From b21f89862076397b63eb3ac4a19b9125b6f6477a Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Mon, 19 Aug 2013 12:34:30 +0000 Subject: [PATCH 10/78] assume ip_forwarding = 1 by default --- api.go | 2 +- container.go | 2 +- runtime.go | 10 +++++----- server.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api.go b/api.go index 18f42c446d..41edc4f4c5 100644 --- a/api.go +++ b/api.go @@ -526,7 +526,7 @@ func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r out.Warnings = append(out.Warnings, "Your kernel does not support memory swap capabilities. Limitation discarded.") } - if !srv.runtime.capabilities.IPv4Forwarding { + if srv.runtime.capabilities.IPv4ForwardingDisabled { log.Println("Warning: IPv4 forwarding is disabled.") out.Warnings = append(out.Warnings, "IPv4 forwarding is disabled.") } diff --git a/container.go b/container.go index 472ae3990d..62007ed624 100644 --- a/container.go +++ b/container.go @@ -548,7 +548,7 @@ func (container *Container) Start(hostConfig *HostConfig) error { container.Config.MemorySwap = -1 } - if !container.runtime.capabilities.IPv4Forwarding { + if container.runtime.capabilities.IPv4ForwardingDisabled { log.Printf("WARNING: IPv4 forwarding is disabled. Networking will not work") } diff --git a/runtime.go b/runtime.go index 0f97c01cba..7525680a0e 100644 --- a/runtime.go +++ b/runtime.go @@ -15,9 +15,9 @@ import ( ) type Capabilities struct { - MemoryLimit bool - SwapLimit bool - IPv4Forwarding bool + MemoryLimit bool + SwapLimit bool + IPv4ForwardingDisabled bool } type Runtime struct { @@ -244,8 +244,8 @@ func (runtime *Runtime) UpdateCapabilities(quiet bool) { } content, err3 := ioutil.ReadFile("/proc/sys/net/ipv4/ip_forward") - runtime.capabilities.IPv4Forwarding = err3 == nil && len(content) > 0 && content[0] == '1' - if !runtime.capabilities.IPv4Forwarding && !quiet { + runtime.capabilities.IPv4ForwardingDisabled = err3 != nil || len(content) == 0 || content[0] != '1' + if runtime.capabilities.IPv4ForwardingDisabled && !quiet { log.Printf("WARNING: IPv4 forwarding is disabled.") } } diff --git a/server.go b/server.go index 561d3c7cfe..d86319d0dc 100644 --- a/server.go +++ b/server.go @@ -269,7 +269,7 @@ func (srv *Server) DockerInfo() *APIInfo { Images: imgcount, MemoryLimit: srv.runtime.capabilities.MemoryLimit, SwapLimit: srv.runtime.capabilities.SwapLimit, - IPv4Forwarding: srv.runtime.capabilities.IPv4Forwarding, + IPv4Forwarding: !srv.runtime.capabilities.IPv4ForwardingDisabled, Debug: os.Getenv("DEBUG") != "", NFd: utils.GetTotalUsedFds(), NGoroutines: runtime.NumGoroutine(), From 75f4fd978d234efbc3a5c5c55ea162a9a68246d9 Mon Sep 17 00:00:00 2001 From: Andy Rothfusz Date: Mon, 19 Aug 2013 19:13:26 -0700 Subject: [PATCH 11/78] Fix #1330 and #1149. Improve CMD, ENTRYPOINT, and attach docs. --- docs/sources/commandline/command/attach.rst | 48 ++++++++++- docs/sources/use/builder.rst | 96 +++++++++++++++++++-- 2 files changed, 134 insertions(+), 10 deletions(-) diff --git a/docs/sources/commandline/command/attach.rst b/docs/sources/commandline/command/attach.rst index 4c4c189d8f..12ed802a02 100644 --- a/docs/sources/commandline/command/attach.rst +++ b/docs/sources/commandline/command/attach.rst @@ -10,4 +10,50 @@ Usage: docker attach CONTAINER - Attach to a running container + Attach to a running container. + +You can detach from the container again (and leave it running) with +``CTRL-c`` (for a quiet exit) or ``CTRL-\`` to get a stacktrace of +the Docker client when it quits. + +To stop a container, use ``docker stop`` + +To kill the container, use ``docker kill`` + +Examples: +--------- + +.. code-block:: bash + + $ ID=$(sudo docker run -d ubuntu /usr/bin/top -b) + $ sudo docker attach $ID + top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 + Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie + Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st + Mem: 373572k total, 355560k used, 18012k free, 27872k buffers + Swap: 786428k total, 0k used, 786428k free, 221740k cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 1 root 20 0 17200 1116 912 R 0 0.3 0:00.03 top + + top - 02:05:55 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 + Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie + Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st + Mem: 373572k total, 355244k used, 18328k free, 27872k buffers + Swap: 786428k total, 0k used, 786428k free, 221776k cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top + + + top - 02:05:58 up 3:06, 0 users, load average: 0.01, 0.02, 0.05 + Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie + Cpu(s): 0.2%us, 0.3%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st + Mem: 373572k total, 355780k used, 17792k free, 27880k buffers + Swap: 786428k total, 0k used, 786428k free, 221776k cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top + ^C$ + $ sudo docker stop $ID + diff --git a/docs/sources/use/builder.rst b/docs/sources/use/builder.rst index de765a5467..fcb17c6c05 100644 --- a/docs/sources/use/builder.rst +++ b/docs/sources/use/builder.rst @@ -102,11 +102,50 @@ control. 3.4 CMD ------- - ``CMD `` +CMD has three forms: -The ``CMD`` instruction sets the command to be executed when running -the image. This is functionally equivalent to running ``docker commit --run '{"Cmd": }'`` outside the builder. +* ``CMD ["executable","param1","param2"]`` (like an *exec*, preferred form) +* ``CMD ["param1","param2"]`` (as *default parameters to ENTRYPOINT*) +* ``CMD command param1 param2`` (as a *shell*) + +There can only be one CMD in a Dockerfile. If you list more than one +CMD then only the last CMD will take effect. + +**The main purpose of a CMD is to provide defaults for an executing +container.** These defaults can include an executable, or they can +omit the executable, in which case you must specify an ENTRYPOINT as +well. + +When used in the shell or exec formats, the ``CMD`` instruction sets +the command to be executed when running the image. This is +functionally equivalent to running ``docker commit -run '{"Cmd": +}'`` outside the builder. + +If you use the *shell* form of the CMD, then the ```` will +execute in ``/bin/sh -c``: + +.. code-block:: bash + + FROM ubuntu + CMD echo "This is a test." | wc - + +If you want to **run your** ```` **without a shell** then you +must express the command as a JSON array and give the full path to the +executable. **This array form is the preferred format of CMD.** Any +additional parameters must be individually expressed as strings in the +array: + +.. code-block:: bash + + FROM ubuntu + CMD ["/usr/bin/wc","--help"] + +If you would like your container to run the same executable every +time, then you should consider using ``ENTRYPOINT`` in combination +with ``CMD``. See :ref:`entrypoint_def`. + +If the user specifies arguments to ``docker run`` then they will +override the default specified in CMD. .. note:: Don't confuse ``RUN`` with ``CMD``. ``RUN`` actually runs a @@ -186,16 +225,55 @@ The copy obeys the following rules: directories in its path. All new files and directories are created with mode 0755, uid and gid 0. +.. _entrypoint_def: + 3.8 ENTRYPOINT -------------- - ``ENTRYPOINT ["/bin/echo"]`` +ENTRYPOINT has two forms: -The ``ENTRYPOINT`` instruction adds an entry command that will not be -overwritten when arguments are passed to docker run, unlike the +* ``ENTRYPOINT ["executable", "param1", "param2"]`` (like an *exec*, + preferred form) +* ``ENTRYPOINT command param1 param2`` (as a *shell*) + +There can only be one ``ENTRYPOINT`` in a Dockerfile. If you have more +than one ``ENTRYPOINT``, then only the last one in the Dockerfile will +have an effect. + +An ``ENTRYPOINT`` helps you to configure a container that you can run +as an executable. That is, when you specify an ``ENTRYPOINT``, then +the whole container runs as if it was just that executable. + +The ``ENTRYPOINT`` instruction adds an entry command that will **not** +be overwritten when arguments are passed to ``docker run``, unlike the behavior of ``CMD``. This allows arguments to be passed to the -entrypoint. i.e. ``docker run -d`` will pass the "-d" argument -to the entrypoint. +entrypoint. i.e. ``docker run -d`` will pass the "-d" +argument to the ENTRYPOINT. + +You can specify parameters either in the ENTRYPOINT JSON array (as in +"like an exec" above), or by using a CMD statement. Parameters in the +ENTRYPOINT will not be overridden by the ``docker run`` arguments, but +parameters specified via CMD will be overridden by ``docker run`` +arguments. + +Like a ``CMD``, you can specify a plain string for the ENTRYPOINT and +it will execute in ``/bin/sh -c``: + +.. code-block:: bash + + FROM ubuntu + ENTRYPOINT wc -l - + +For example, that Dockerfile's image will *always* take stdin as input +("-") and print the number of lines ("-l"). If you wanted to make +this optional but default, you could use a CMD: + +.. code-block:: bash + + FROM ubuntu + CMD ["-l", "-"] + ENTRYPOINT ["/usr/bin/wc"] + 3.9 VOLUME ---------- From 41973d41e950249cd630f193a4d9250e3b3740e5 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 20 Aug 2013 11:52:37 +0000 Subject: [PATCH 12/78] fix typo --- commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands.go b/commands.go index 9d0b0968d1..8f31b24f7e 100644 --- a/commands.go +++ b/commands.go @@ -453,7 +453,7 @@ func (cli *DockerCli) CmdVersion(args ...string) error { } fmt.Fprintf(cli.out, "Server version: %s\n", out.Version) if out.GitCommit != "" { - fmt.Fprintf(cli.out, "Git commit (version): %s\n", out.GitCommit) + fmt.Fprintf(cli.out, "Git commit (server): %s\n", out.GitCommit) } if out.GoVersion != "" { fmt.Fprintf(cli.out, "Go version (server): %s\n", out.GoVersion) From 2c147dd721c5a92fa86af0ab4a6b9b9ebcd8d546 Mon Sep 17 00:00:00 2001 From: Tyler Brock Date: Tue, 20 Aug 2013 18:08:15 -0400 Subject: [PATCH 13/78] add mongodb image example --- docs/sources/examples/mongodb.rst | 98 +++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 docs/sources/examples/mongodb.rst diff --git a/docs/sources/examples/mongodb.rst b/docs/sources/examples/mongodb.rst new file mode 100644 index 0000000000..e351b9b384 --- /dev/null +++ b/docs/sources/examples/mongodb.rst @@ -0,0 +1,98 @@ +:title: Building a Docker Image with MongoDB +:description: How to build a Docker image with MongoDB pre-installed +:keywords: docker, example, package installation, networking, mongodb + +.. _mongodb_image: + +Building an Image with MongoDB +============================== + +.. include:: example_header.inc + +The goal of this example is to show how you can build your own +docker images with MongoDB preinstalled. We will do that by +constructing a Dockerfile that downloads a base image, adds an +apt source and installs the database software on Ubuntu. + +Creating a ``Dockerfile`` ++++++++++++++++++++++++++ + +Create an empty file called ``Dockerfile``: + +.. code-block:: bash + + touch Dockerfile + +Next, define the parent image you want to use to build your own image on top of. +Here, we’ll use `CentOS `_ (tag: ``latest``) +available on the `docker index`_: + +.. code-block:: bash + + FROM ubuntu:latest + +Since we want to be running the latest version of MongoDB we'll need to add the +10gen repo to our apt sources list. + +.. code-block:: bash + + # Add 10gen official apt source to the sources list + RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 + RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list + +Then, we don't want Ubuntu to complain about init not being available so we'll +divert /sbin/initctl to /bin/true so it thinks everything is working. + +.. code-block:: bash + + # Hack for initctl not being available in Ubuntu + RUN dpkg-divert --local --rename --add /sbin/initctl + RUN ln -s /bin/true /sbin/initctl + +Afterwards we'll be able to update our apt repositories and install MongoDB + +.. code-block:: bash + + # Install MongoDB + RUN apt-get update + RUN apt-get install mongodb-10gen + +To run MongoDB we'll have to create the default data directory (because we want it to +run without needing to provide a special configuration file) + +.. code-block:: bash + + # Create the MongoDB data directory + RUN mkdir -p /data/db + +Finally, we'll expose the standard port that MongoDB runs on (27107) + +.. code-block:: bash + + EXPOSE 27017 + +Now, lets build the image which will go through the ``Dockerfile`` we made and +run all of the commands. + +.. code-block:: bash + + docker build -t /mongodb . + +Now you should be able to run ``mongod`` as a daemon and be able to connect on +the local port! + +.. code-block:: bash + + # Regular style + MONGO_ID=$(docker run -d /mongodb mongod) + + # Lean and mean + MONGO_ID=$(docker run -d /mongodb mongod --noprealloc --smallfiles) + + # Check the logs out + docker logs $MONGO_ID + + # Connect and play around + mongo --port + +Sweet! From aa2ab5143b82cb63e061fe735b8c9ca9f84e0c55 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Tue, 6 Aug 2013 20:46:50 -0700 Subject: [PATCH 14/78] Deprecate dockerbuilder in favor of a standard Dockerfile --- hack/dockerbuilder/Dockerfile | 36 --------------------------- hack/dockerbuilder/MAINTAINERS | 1 - hack/dockerbuilder/dockerbuilder | 42 -------------------------------- 3 files changed, 79 deletions(-) delete mode 100644 hack/dockerbuilder/Dockerfile delete mode 100644 hack/dockerbuilder/MAINTAINERS delete mode 100644 hack/dockerbuilder/dockerbuilder diff --git a/hack/dockerbuilder/Dockerfile b/hack/dockerbuilder/Dockerfile deleted file mode 100644 index 496ee45e7a..0000000000 --- a/hack/dockerbuilder/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -# DESCRIPTION Build a container capable of producing official binary and -# PPA packages and uploading them to S3 and Launchpad -# VERSION 1.2 -# DOCKER_VERSION 0.4 -# AUTHOR Solomon Hykes -# Daniel Mizyrycki -# BUILD_CMD docker build -t dockerbuilder . -# RUN_CMD docker run -e AWS_ID="$AWS_ID" -e AWS_KEY="$AWS_KEY" -e GPG_KEY="$GPG_KEY" -e PUBLISH_PPA="$PUBLISH_PPA" dockerbuilder -# -# ENV_VARIABLES AWS_ID, AWS_KEY: S3 credentials for uploading Docker binary and tarball -# GPG_KEY: Signing key for docker package -# PUBLISH_PPA: 0 for staging release, 1 for production release -# -from ubuntu:12.04 -maintainer Solomon Hykes -# Workaround the upstart issue -run dpkg-divert --local --rename --add /sbin/initctl -run ln -s /bin/true /sbin/initctl -# Enable universe and gophers PPA -run DEBIAN_FRONTEND=noninteractive apt-get install -y -q python-software-properties -run add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe" -run add-apt-repository -y ppa:dotcloud/docker-golang/ubuntu -run apt-get update -# Packages required to checkout, build and upload docker -run DEBIAN_FRONTEND=noninteractive apt-get install -y -q s3cmd curl -run curl -s -o /go.tar.gz https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz -run tar -C /usr/local -xzf /go.tar.gz -run echo "export PATH=/usr/local/go/bin:$PATH" > /.bashrc -run echo "export PATH=/usr/local/go/bin:$PATH" > /.bash_profile -run DEBIAN_FRONTEND=noninteractive apt-get install -y -q git build-essential -# Packages required to build an ubuntu package -run DEBIAN_FRONTEND=noninteractive apt-get install -y -q golang-stable debhelper autotools-dev devscripts -# Copy dockerbuilder files into the container -add . /src -run cp /src/dockerbuilder /usr/local/bin/ && chmod +x /usr/local/bin/dockerbuilder -cmd ["dockerbuilder"] diff --git a/hack/dockerbuilder/MAINTAINERS b/hack/dockerbuilder/MAINTAINERS deleted file mode 100644 index 5dfc881420..0000000000 --- a/hack/dockerbuilder/MAINTAINERS +++ /dev/null @@ -1 +0,0 @@ -Daniel Mizyrycki (@mzdaniel) diff --git a/hack/dockerbuilder/dockerbuilder b/hack/dockerbuilder/dockerbuilder deleted file mode 100644 index 9fa05ce11e..0000000000 --- a/hack/dockerbuilder/dockerbuilder +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -set -x -set -e - -export PATH=/usr/local/go/bin:$PATH - -PACKAGE=github.com/dotcloud/docker - -if [ $# -gt 1 ]; then - echo "Usage: $0 [REVISION]" - exit 1 -fi - -export REVISION=$1 - -if [ -z "$AWS_ID" -o -z "$AWS_KEY" ]; then - echo "Warning: either AWS_ID or AWS_KEY environment variable not set. Won't upload to S3." -else - /bin/echo -e "[default]\naccess_key = $AWS_ID\nsecret_key = $AWS_KEY\n" > /.s3cfg -fi - -if [ -z "$GPG_KEY" ]; then - echo "Warning: environment variable GPG_KEY is not set. Ubuntu package upload will not succeed." - NO_UBUNTU=1 -fi - -rm -fr docker-release -git clone https://github.com/dotcloud/docker docker-release -cd docker-release -if [ -z "$REVISION" ]; then - make release -else - make release RELEASE_VERSION=$REVISION -fi - -# Remove credentials from container -rm -f /.s3cfg - -if [ -z "$NO_UBUNTU" ]; then - export PATH=`echo $PATH | sed 's#/usr/local/go/bin:##g'` - (cd packaging/ubuntu && make ubuntu) -fi From 9087ef9a770789e6987cd1ca4396d6b20a446724 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Tue, 6 Aug 2013 20:49:55 -0700 Subject: [PATCH 15/78] Move VERSION to a dedicated file to facilitate automated builds and releases --- VERSION | 1 + commands.go | 3 +-- docker/docker.go | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 0000000000..53978e5317 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.5.1-dev diff --git a/commands.go b/commands.go index 899a8e2f1a..e538fc7765 100644 --- a/commands.go +++ b/commands.go @@ -27,10 +27,9 @@ import ( "unicode" ) -const VERSION = "0.5.3-dev" - var ( GITCOMMIT string + VERSION string ) func (cli *DockerCli) getMethod(name string) (reflect.Method, bool) { diff --git a/docker/docker.go b/docker/docker.go index a48865bfa3..bd1b4e9333 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -16,6 +16,7 @@ import ( var ( GITCOMMIT string + VERSION string ) func main() { @@ -52,6 +53,7 @@ func main() { os.Setenv("DEBUG", "1") } docker.GITCOMMIT = GITCOMMIT + docker.VERSION = VERSION if *flDaemon { if flag.NArg() != 0 { flag.Usage() From 9fce6f662ae3e31832bbc45938e509824bea67d5 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Tue, 6 Aug 2013 20:51:12 -0700 Subject: [PATCH 16/78] docker -v: show version and build information without making remote connections --- docker/docker.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker/docker.go b/docker/docker.go index bd1b4e9333..6ac0c9379d 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -26,6 +26,7 @@ func main() { return } // FIXME: Switch d and D ? (to be more sshd like) + flVersion := flag.Bool("v", false, "Print version information and quit") flDaemon := flag.Bool("d", false, "Daemon mode") flDebug := flag.Bool("D", false, "Debug mode") flAutoRestart := flag.Bool("r", false, "Restart previously running containers") @@ -37,6 +38,10 @@ func main() { flHosts := docker.ListOpts{fmt.Sprintf("unix://%s", docker.DEFAULTUNIXSOCKET)} flag.Var(&flHosts, "H", "tcp://host:port to bind/connect to or unix://path/to/socket to use") flag.Parse() + if *flVersion { + showVersion() + return + } if len(flHosts) > 1 { flHosts = flHosts[1:] //trick to display a nice default value in the usage } @@ -76,6 +81,10 @@ func main() { } } +func showVersion() { + fmt.Printf("Docker version %s, build %s\n", VERSION, GITCOMMIT) +} + func createPidFile(pidfile string) error { if pidString, err := ioutil.ReadFile(pidfile); err == nil { pid, err := strconv.Atoi(string(pidString)) From 89ee5242291c50402973ffb73fe1dbbf5820e44c Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Tue, 6 Aug 2013 21:00:50 -0700 Subject: [PATCH 17/78] Good-bye, ugly mega-Makefile. Docker can now be built with docker, with the help of a simple very simple shell script. --- Dockerfile | 21 +++++------ Makefile | 95 -------------------------------------------------- make.sh | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 105 deletions(-) delete mode 100644 Makefile create mode 100755 make.sh diff --git a/Dockerfile b/Dockerfile index a7a7724ce5..1905f056a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,8 @@ docker-version 0.4.2 from ubuntu:12.04 maintainer Solomon Hykes # Build dependencies +run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list +run apt-get update run apt-get install -y -q curl run apt-get install -y -q git # Install Go @@ -11,24 +13,23 @@ env PATH /usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bi env GOPATH /go env CGO_ENABLED 0 run cd /tmp && echo 'package main' > t.go && go test -a -i -v +# Ubuntu stuff +run apt-get install -y -q ruby1.9.3 rubygems +run gem install fpm +run apt-get install -y -q reprepro +# Install s3cmd 1.0.1 (earlier versions don't support env variables in the config) +run apt-get install -y -q python-pip +run pip install s3cmd +run /bin/echo -e '[default]\naccess_key=$AWS_ID\nsecret_key=$AWS_KEY\n' > /.s3cfg # Download dependencies run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/dotcloud/tar/ REV=d06045a6d9; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV -# Run dependencies -run apt-get install -y iptables -# lxc requires updating ubuntu sources -run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list -run apt-get update -run apt-get install -y lxc -run apt-get install -y aufs-tools # Docker requires code.google.com/p/go.net/websocket run apt-get install -y -q mercurial run PKG=code.google.com/p/go.net REV=78ad7f42aa2e; hg clone https://$PKG /go/src/$PKG && cd /go/src/$PKG && hg checkout -r $REV # Upload docker source add . /go/src/github.com/dotcloud/docker # Build the binary -run cd /go/src/github.com/dotcloud/docker/docker && go install -ldflags "-X main.GITCOMMIT '??' -d -w" -env PATH /usr/local/go/bin:/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin -cmd ["docker"] +run cd /go/src/github.com/dotcloud/docker && ./make.sh diff --git a/Makefile b/Makefile deleted file mode 100644 index dd365dc30e..0000000000 --- a/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -DOCKER_PACKAGE := github.com/dotcloud/docker -RELEASE_VERSION := $(shell git tag | grep -E "v[0-9\.]+$$" | sort -nr | head -n 1) -SRCRELEASE := docker-$(RELEASE_VERSION) -BINRELEASE := docker-$(RELEASE_VERSION).tgz -BUILD_SRC := build_src -BUILD_PATH := ${BUILD_SRC}/src/${DOCKER_PACKAGE} - -GIT_ROOT := $(shell git rev-parse --show-toplevel) -BUILD_DIR := $(CURDIR)/.gopath - -GOPATH ?= $(BUILD_DIR) -export GOPATH - -GO_OPTIONS ?= -a -ldflags='-w -d' -ifeq ($(VERBOSE), 1) -GO_OPTIONS += -v -endif - -GIT_COMMIT = $(shell git rev-parse --short HEAD) -GIT_STATUS = $(shell test -n "`git status --porcelain`" && echo "+CHANGES") - -BUILD_OPTIONS = -a -ldflags "-X main.GITCOMMIT $(GIT_COMMIT)$(GIT_STATUS) -d -w" - -SRC_DIR := $(GOPATH)/src - -DOCKER_DIR := $(SRC_DIR)/$(DOCKER_PACKAGE) -DOCKER_MAIN := $(DOCKER_DIR)/docker - -DOCKER_BIN_RELATIVE := bin/docker -DOCKER_BIN := $(CURDIR)/$(DOCKER_BIN_RELATIVE) - -.PHONY: all clean test hack release srcrelease $(BINRELEASE) $(SRCRELEASE) $(DOCKER_BIN) $(DOCKER_DIR) - -all: $(DOCKER_BIN) - -$(DOCKER_BIN): $(DOCKER_DIR) - @mkdir -p $(dir $@) - @(cd $(DOCKER_MAIN); CGO_ENABLED=0 go build $(GO_OPTIONS) $(BUILD_OPTIONS) -o $@) - @echo $(DOCKER_BIN_RELATIVE) is created. - -$(DOCKER_DIR): - @mkdir -p $(dir $@) - @if [ -h $@ ]; then rm -f $@; fi; ln -sf $(CURDIR)/ $@ - @(cd $(DOCKER_MAIN); go get -d $(GO_OPTIONS)) - -whichrelease: - echo $(RELEASE_VERSION) - -release: $(BINRELEASE) - s3cmd -P put $(BINRELEASE) s3://get.docker.io/builds/`uname -s`/`uname -m`/docker-$(RELEASE_VERSION).tgz - s3cmd -P put docker-latest.tgz s3://get.docker.io/builds/`uname -s`/`uname -m`/docker-latest.tgz - s3cmd -P put $(SRCRELEASE)/bin/docker s3://get.docker.io/builds/`uname -s`/`uname -m`/docker - echo $(RELEASE_VERSION) > latest ; s3cmd -P put latest s3://get.docker.io/latest ; rm latest - -srcrelease: $(SRCRELEASE) -deps: $(DOCKER_DIR) - -# A clean checkout of $RELEASE_VERSION, with vendored dependencies -$(SRCRELEASE): - rm -fr $(SRCRELEASE) - git clone $(GIT_ROOT) $(SRCRELEASE) - cd $(SRCRELEASE); git checkout -q $(RELEASE_VERSION) - -# A binary release ready to be uploaded to a mirror -$(BINRELEASE): $(SRCRELEASE) - rm -f $(BINRELEASE) - cd $(SRCRELEASE); make; cp -R bin docker-$(RELEASE_VERSION); tar -f ../$(BINRELEASE) -zv -c docker-$(RELEASE_VERSION) - cd $(SRCRELEASE); cp -R bin docker-latest; tar -f ../docker-latest.tgz -zv -c docker-latest -clean: - @rm -rf $(dir $(DOCKER_BIN)) -ifeq ($(GOPATH), $(BUILD_DIR)) - @rm -rf $(BUILD_DIR) -else ifneq ($(DOCKER_DIR), $(realpath $(DOCKER_DIR))) - @rm -f $(DOCKER_DIR) -endif - -test: - # Copy docker source and dependencies for testing - rm -rf ${BUILD_SRC}; mkdir -p ${BUILD_PATH} - tar --exclude=${BUILD_SRC} -cz . | tar -xz -C ${BUILD_PATH} - GOPATH=${CURDIR}/${BUILD_SRC} go get -d - # Do the test - sudo -E GOPATH=${CURDIR}/${BUILD_SRC} CGO_ENABLED=0 go test ${GO_OPTIONS} - -testall: all - @(cd $(DOCKER_DIR); CGO_ENABLED=0 sudo -E go test ./... $(GO_OPTIONS)) - -fmt: - @gofmt -s -l -w . - -hack: - cd $(CURDIR)/hack && vagrant up - -ssh-dev: - cd $(CURDIR)/hack && vagrant ssh diff --git a/make.sh b/make.sh new file mode 100755 index 0000000000..8365b7bc2a --- /dev/null +++ b/make.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +# This script builds various binary artifacts from a checkout of the docker source code. +# +# Requirements: +# - The current directory should be a checkout of the docker source code (http://github.com/dotcloud/docker). Whatever version is checked out will be built. +# - The script is intented to be run as part of a docker build, as defined in the Dockerfile at the root of the source. +# - If you don't call this script from the official Dockerfile, or a container built by the official Dockerfile, you're probably doing it wrong. +# + +set -e +set -x + +VERSION=`cat ./VERSION` +GIT_COMMIT=$(git rev-parse --short HEAD) +GIT_CHANGES=$(test -n "`git status --porcelain`" && echo "+CHANGES") + +# "bundles" indicate the different types of build artifacts: static binary, ubuntu package, etc. + +# Build docker as a static binary file +bundle_binary() { + mkdir -p bundles/$VERSION/binary + go build -o bundles/$VERSION/binary/docker-$VERSION -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" ./docker +} + + +# Build docker's test suite as a collection of binary files (one per sub-package to test) +bundle_test() { + mkdir -p bundles/$VERSION/test + for test_dir in `find_test_dirs`; do + test_binary=` + cd $test_dir + go test -c -v -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" >&2 + find . -maxdepth 1 -type f -name '*.test' -executable + ` + cp $test_dir/$test_binary bundles/$VERSION/test/ + done + +} + +# Build docker as an ubuntu package using FPM and REPREPRO (sue me). +# bundle_binary must be called first. +bundle_ubuntu() { + mkdir -p bundles/$VERSION/ubuntu + + DIR=$(mktemp -d) + + # Generate an upstart config file (ubuntu-specific) + mkdir -p $DIR/etc/init + cat > $DIR/etc/init/docker.conf < $APTDIR/conf/distributions < Date: Tue, 6 Aug 2013 21:16:13 -0700 Subject: [PATCH 18/78] release.sh: publish a full release of docker to a S3 bucket, including static binary and a full APT repository with install instructions --- release.sh | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 release.sh diff --git a/release.sh b/release.sh new file mode 100755 index 0000000000..e9acc2a1e1 --- /dev/null +++ b/release.sh @@ -0,0 +1,81 @@ +#!/bin/sh + +# This script looks for bundles built by make.sh, and releases them on a public S3 bucket. +# +# Bundles should be available for the VERSION string passed as argument. +# +# The correct way to call this script is inside a container built by the official Dockerfile +# at the root of the docker source code. The Dockerfile, make.sh and release.sh should all +# be from the same source code revision. + +set -x +set -e + +# Print a usage message and exit. +usage() { + echo "Usage: $0 VERSION BUCKET" + echo "For example: $0 0.5.1-dev sandbox.get.docker.io" + exit 1 +} + +VERSION=$1 +BUCKET=$2 +[ -z "$VERSION" ] && usage +[ -z "$BUCKET" ] && usage + +setup_s3() { + # Try creating the bucket. Ignore errors (it might already exist). + s3cmd --acl-public mb $BUCKET 2>/dev/null || true +} + +# write_to_s3 uploads the contents of standard input to the specified S3 url. +write_to_s3() { + DEST=$1 + F=`mktemp` + cat > $F + s3cmd --acl-public put $F $DEST + rm -f $F +} + +s3_url() { + echo "http://$BUCKET.s3.amazonaws.com" +} + +# Upload the 'ubuntu' bundle to S3: +# 1. A full APT repository is published at $BUCKET/ubuntu/ +# 2. Instructions for using the APT repository are uploaded at $BUCKET/ubuntu/info +release_ubuntu() { + s3cmd --acl-public --verbose --delete-removed --follow-symlinks sync bundles/$VERSION/ubuntu/apt/ s3://$BUCKET/ubuntu/ + cat < Date: Tue, 6 Aug 2013 21:16:51 -0700 Subject: [PATCH 19/78] Update release checklist. Still needs work. --- hack/RELEASE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/RELEASE.md b/hack/RELEASE.md index 5cf407745a..0abcf150df 100644 --- a/hack/RELEASE.md +++ b/hack/RELEASE.md @@ -50,7 +50,7 @@ up-to-date. - Remote API: fix a bug in the optional unix socket transport ``` -### 3. Change VERSION in commands.go +### 3. Change the contents of the VERSION file ### 4. Run all tests From bdbac9f7a1dd31bd5d78f50eb9fa3b3793d1d13b Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Fri, 9 Aug 2013 16:08:11 -0700 Subject: [PATCH 20/78] Upgrade Dockerfile with new dependency --- Dockerfile | 3 ++- VERSION | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1905f056a8..34e23b14df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,7 @@ run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt run apt-get update run apt-get install -y -q curl run apt-get install -y -q git +run apt-get install -y -q mercurial # Install Go run curl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz env PATH /usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin @@ -28,7 +29,7 @@ run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/ run PKG=github.com/dotcloud/tar/ REV=d06045a6d9; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV # Docker requires code.google.com/p/go.net/websocket run apt-get install -y -q mercurial -run PKG=code.google.com/p/go.net REV=78ad7f42aa2e; hg clone https://$PKG /go/src/$PKG && cd /go/src/$PKG && hg checkout -r $REV +run PKG=code.google.com/p/go.net/ REV=84a4013f96e0; hg clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && hg checkout $REV # Upload docker source add . /go/src/github.com/dotcloud/docker # Build the binary diff --git a/VERSION b/VERSION index 53978e5317..12805ec824 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.1-dev +0.5.2-dev From d750060f0c39db4b88f14aa413fc1f81706a4373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 9 Aug 2013 16:47:07 -0700 Subject: [PATCH 21/78] add "|| true" otherwise "set -e" kills us if the repo is clean --- make.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make.sh b/make.sh index 8365b7bc2a..9a6986bb07 100755 --- a/make.sh +++ b/make.sh @@ -13,7 +13,7 @@ set -x VERSION=`cat ./VERSION` GIT_COMMIT=$(git rev-parse --short HEAD) -GIT_CHANGES=$(test -n "`git status --porcelain`" && echo "+CHANGES") +GIT_CHANGES=$(test -n "`git status --porcelain`" && echo "+CHANGES" || true) # "bundles" indicate the different types of build artifacts: static binary, ubuntu package, etc. From d9f769930be1c361ac69f9d8479774f37bb39d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 9 Aug 2013 17:38:48 -0700 Subject: [PATCH 22/78] =?UTF-8?q?Cosmetic=20changes:=20rewrapping,=20``=20?= =?UTF-8?q?=E2=86=92=20$()=E2=80=A6=20before=20starting=20the=20real=20wor?= =?UTF-8?q?k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- make.sh | 50 +++++++++++++++++++++++++++++++++----------------- release.sh | 13 +++++++------ 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/make.sh b/make.sh index 9a6986bb07..411271895b 100755 --- a/make.sh +++ b/make.sh @@ -1,41 +1,54 @@ #!/bin/sh -# This script builds various binary artifacts from a checkout of the docker source code. +# This script builds various binary artifacts from a checkout of the docker +# source code. # # Requirements: -# - The current directory should be a checkout of the docker source code (http://github.com/dotcloud/docker). Whatever version is checked out will be built. -# - The script is intented to be run as part of a docker build, as defined in the Dockerfile at the root of the source. -# - If you don't call this script from the official Dockerfile, or a container built by the official Dockerfile, you're probably doing it wrong. +# - The current directory should be a checkout of the docker source code +# (http://github.com/dotcloud/docker). Whatever version is checked out +# will be built. +# - The VERSION file, at the root of the repository, should exist, and +# will be used as Docker binary version and package version. +# - The hash of the git commit will also be included in the Docker binary, +# with the suffix +CHANGES if the repository isn't clean. +# - The script is intented to be run as part of a docker build, as defined +# in the Dockerfile at the root of the source. In other words: +# DO NOT CALL THIS SCRIPT DIRECTLY. +# - The right way to call this script is to invoke "docker build ." from +# your checkout of the Docker repository. # set -e set -x -VERSION=`cat ./VERSION` +VERSION=$(cat ./VERSION) GIT_COMMIT=$(git rev-parse --short HEAD) -GIT_CHANGES=$(test -n "`git status --porcelain`" && echo "+CHANGES" || true) +GIT_CHANGES=$(test -n "$(git status --porcelain)" && echo "+CHANGES" || true) -# "bundles" indicate the different types of build artifacts: static binary, ubuntu package, etc. +# Each "bundle" is a different type of build artefact: static binary, Ubuntu +# package, etc. -# Build docker as a static binary file +# Build Docker as a static binary file bundle_binary() { mkdir -p bundles/$VERSION/binary - go build -o bundles/$VERSION/binary/docker-$VERSION -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" ./docker + go build -o bundles/$VERSION/binary/docker-$VERSION \ + -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" \ + ./docker } -# Build docker's test suite as a collection of binary files (one per sub-package to test) +# Build Docker's test suite as a collection of binary files (one per +# sub-package to test) bundle_test() { mkdir -p bundles/$VERSION/test - for test_dir in `find_test_dirs`; do - test_binary=` + for test_dir in $(find_test_dirs); do + test_binary=$( cd $test_dir go test -c -v -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" >&2 find . -maxdepth 1 -type f -name '*.test' -executable - ` + ) cp $test_dir/$test_binary bundles/$VERSION/test/ done - } # Build docker as an ubuntu package using FPM and REPREPRO (sue me). @@ -84,10 +97,13 @@ EOF } -# This helper function walks the current directory looking for directories holding Go test files, -# and prints their paths on standard output, one per line. +# This helper function walks the current directory looking for directories +# holding Go test files, and prints their paths on standard output, one per +# line. find_test_dirs() { - find . -name '*_test.go' | { while read f; do dirname $f; done; } | sort -u + find . -name '*_test.go' | + { while read f; do dirname $f; done; } | + sort -u } diff --git a/release.sh b/release.sh index e9acc2a1e1..58e6dd3ceb 100755 --- a/release.sh +++ b/release.sh @@ -1,12 +1,13 @@ #!/bin/sh -# This script looks for bundles built by make.sh, and releases them on a public S3 bucket. +# This script looks for bundles built by make.sh, and releases them on a +# public S3 bucket. # # Bundles should be available for the VERSION string passed as argument. # -# The correct way to call this script is inside a container built by the official Dockerfile -# at the root of the docker source code. The Dockerfile, make.sh and release.sh should all -# be from the same source code revision. +# The correct way to call this script is inside a container built by the +# official Dockerfile at the root of the Docker source code. The Dockerfile, +# make.sh and release.sh should all be from the same source code revision. set -x set -e @@ -48,9 +49,9 @@ release_ubuntu() { s3cmd --acl-public --verbose --delete-removed --follow-symlinks sync bundles/$VERSION/ubuntu/apt/ s3://$BUCKET/ubuntu/ cat < Date: Fri, 9 Aug 2013 17:43:02 -0700 Subject: [PATCH 23/78] Add a check to make sure that make.sh only runs within a container. --- make.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/make.sh b/make.sh index 411271895b..63bb31bdb5 100755 --- a/make.sh +++ b/make.sh @@ -21,6 +21,16 @@ set -e set -x +# We're a nice, sexy, little shell script, and people might try to run us; +# but really, they shouldn't. We want to be in a container! +RESOLVCONF=$(readlink --canonicalize /etc/resolv.conf) +grep -q "$RESOLVCONF" /proc/mounts || { + echo "# I will only run within a container." + echo "# Try this instead:" + echo "docker build ." + exit 1 +} + VERSION=$(cat ./VERSION) GIT_COMMIT=$(git rev-parse --short HEAD) GIT_CHANGES=$(test -n "$(git status --porcelain)" && echo "+CHANGES" || true) From ff30eb96b67a0ab078553a769456bf6669a29214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 9 Aug 2013 18:08:06 -0700 Subject: [PATCH 24/78] Protect the release.sh script against accidental use. Infer VERSION automatically. --- Dockerfile | 2 +- release.sh | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 34e23b14df..1c07b9024c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ run apt-get install -y -q reprepro # Install s3cmd 1.0.1 (earlier versions don't support env variables in the config) run apt-get install -y -q python-pip run pip install s3cmd -run /bin/echo -e '[default]\naccess_key=$AWS_ID\nsecret_key=$AWS_KEY\n' > /.s3cfg +run /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY\n' > /.s3cfg # Download dependencies run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV diff --git a/release.sh b/release.sh index 58e6dd3ceb..4d589e3126 100755 --- a/release.sh +++ b/release.sh @@ -14,15 +14,33 @@ set -e # Print a usage message and exit. usage() { - echo "Usage: $0 VERSION BUCKET" - echo "For example: $0 0.5.1-dev sandbox.get.docker.io" + cat < Date: Fri, 9 Aug 2013 18:10:04 -0700 Subject: [PATCH 25/78] Running the build image will now execute release.sh automatically. --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 1c07b9024c..b5ff537bce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,3 +34,4 @@ run PKG=code.google.com/p/go.net/ REV=84a4013f96e0; hg clone http://$PKG /go/s add . /go/src/github.com/dotcloud/docker # Build the binary run cd /go/src/github.com/dotcloud/docker && ./make.sh +cmd cd /go/src/github.com/dotcloud/docker && ./release.sh From ab4fb9bbfaabccc99e30dd104352dd110f3fd6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 9 Aug 2013 18:18:33 -0700 Subject: [PATCH 26/78] Add a check for S3 bucket access. --- release.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/release.sh b/release.sh index 4d589e3126..f029435296 100755 --- a/release.sh +++ b/release.sh @@ -40,11 +40,16 @@ EOF cd /go/src/github.com/dotcloud/docker/ VERSION=$(cat VERSION) -BUCKET=s3://$AWS_S3_BUCKET +BUCKET=$AWS_S3_BUCKET setup_s3() { # Try creating the bucket. Ignore errors (it might already exist). s3cmd --acl-public mb $BUCKET 2>/dev/null || true + # Check access to the bucket. + # s3cmd has no useful exit status, so we cannot check that. + # Instead, we check if it outputs anything on standard output. + # (When there are problems, it uses standard error instead.) + s3cmd info s3://$BUCKET | grep -q . } # write_to_s3 uploads the contents of standard input to the specified S3 url. From bfee2c726e75181df3250248a45f89d3c2b0a812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 9 Aug 2013 18:23:48 -0700 Subject: [PATCH 27/78] Polish instructions a little bit. --- make.sh | 11 +++++++++++ release.sh | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/make.sh b/make.sh index 63bb31bdb5..fd354efe1e 100755 --- a/make.sh +++ b/make.sh @@ -121,6 +121,17 @@ main() { bundle_binary bundle_ubuntu #bundle_test + cat < Date: Mon, 12 Aug 2013 20:16:08 -0700 Subject: [PATCH 28/78] Install python-magic (it helps s3cmd) and a convenience /src symlink --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index b5ff537bce..22a5896ca6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ run apt-get install -y -q reprepro # Install s3cmd 1.0.1 (earlier versions don't support env variables in the config) run apt-get install -y -q python-pip run pip install s3cmd +run pip install python-magic run /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY\n' > /.s3cfg # Download dependencies run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV @@ -32,6 +33,7 @@ run apt-get install -y -q mercurial run PKG=code.google.com/p/go.net/ REV=84a4013f96e0; hg clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && hg checkout $REV # Upload docker source add . /go/src/github.com/dotcloud/docker +run ln -s /go/src/github.com/dotcloud/docker /src # Build the binary run cd /go/src/github.com/dotcloud/docker && ./make.sh cmd cd /go/src/github.com/dotcloud/docker && ./release.sh From 5b0eaef60264a8a5461d85272e00c6721a19d868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Mon, 12 Aug 2013 20:16:55 -0700 Subject: [PATCH 29/78] Run reprepro from release, incrementally (it needs S3 credentials). Add virtual package. --- make.sh | 51 ++++++++++++++++++++++++++++++++++----------------- release.sh | 19 +++++++++++++++++-- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/make.sh b/make.sh index fd354efe1e..05796b5d14 100755 --- a/make.sh +++ b/make.sh @@ -35,6 +35,16 @@ VERSION=$(cat ./VERSION) GIT_COMMIT=$(git rev-parse --short HEAD) GIT_CHANGES=$(test -n "$(git status --porcelain)" && echo "+CHANGES" || true) +PACKAGE_URL="http://www.docker.io/" +PACKAGE_MAINTAINER="docker@dotcloud.com" +PACKAGE_DESCRIPTION="lxc-docker is a Linux container runtime +Docker complements LXC with a high-level API which operates at the process +level. It runs unix processes with strong guarantees of isolation and +repeatability across servers. +Docker is a great building block for automating distributed systems: +large-scale web deployments, database clusters, continuous deployment systems, +private PaaS, service-oriented architectures, etc." + # Each "bundle" is a different type of build artefact: static binary, Ubuntu # package, etc. @@ -66,7 +76,7 @@ bundle_test() { bundle_ubuntu() { mkdir -p bundles/$VERSION/ubuntu - DIR=$(mktemp -d) + DIR=$(pwd)/bundles/$VERSION/ubuntu/build # Generate an upstart config file (ubuntu-specific) mkdir -p $DIR/etc/init @@ -87,23 +97,30 @@ EOF ( cd bundles/$VERSION/ubuntu - fpm -s dir -t deb -n lxc-docker -v $VERSION -a all --prefix / -C $DIR . + fpm -s dir -C $DIR \ + --name lxc-docker-$VERSION --version $VERSION \ + --architecture $(dpkg-architecture -qDEB_HOST_ARCH) \ + --prefix / \ + --depends lxc --depends aufs-tools \ + --description "$PACKAGE_DESCRIPTION" \ + --maintainer "$PACKAGE_MAINTAINER" \ + --conflicts lxc-docker-virtual-package \ + --provides lxc-docker-virtual-package \ + --replaces lxc-docker-virtual-package \ + --url "$PACKAGE_URL" \ + --vendor "$PACKAGE_VENDOR" \ + -t deb . + mkdir empty + fpm -s dir -C empty \ + --name lxc-docker --version $VERSION \ + --architecture all \ + --depends lxc-docker-$VERSION \ + --description "$PACKAGE_DESCRIPTION" \ + --maintainer "$PACKAGE_MAINTAINER" \ + --url "$PACKAGE_URL" \ + --vendor "$PACKAGE_VENDOR" \ + -t deb . ) - rm -fr $DIR - - - # Setup the APT repo - APTDIR=bundles/$VERSION/ubuntu/apt - mkdir -p $APTDIR/conf - cat > $APTDIR/conf/distributions </dev/null || true + s3cmd --acl-public mb s3://$BUCKET 2>/dev/null || true # Check access to the bucket. # s3cmd has no useful exit status, so we cannot check that. # Instead, we check if it outputs anything on standard output. @@ -69,7 +69,22 @@ s3_url() { # 1. A full APT repository is published at $BUCKET/ubuntu/ # 2. Instructions for using the APT repository are uploaded at $BUCKET/ubuntu/info release_ubuntu() { - s3cmd --acl-public --verbose --delete-removed --follow-symlinks sync bundles/$VERSION/ubuntu/apt/ s3://$BUCKET/ubuntu/ + # Setup the APT repo + APTDIR=bundles/$VERSION/ubuntu/apt + mkdir -p $APTDIR/conf $APTDIR/db + s3cmd sync s3://$BUCKET/ubuntu/db/ $APTDIR/db/ || true + cat > $APTDIR/conf/distributions < Date: Tue, 13 Aug 2013 17:25:12 -0700 Subject: [PATCH 30/78] Update to go 1.1.2. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 22a5896ca6..218a187c39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ run apt-get install -y -q curl run apt-get install -y -q git run apt-get install -y -q mercurial # Install Go -run curl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz +run curl -s https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz | tar -v -C /usr/local -xz env PATH /usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin env GOPATH /go env CGO_ENABLED 0 From 87872006ceda36adc9d1e51e34177f4ba716542f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Wed, 14 Aug 2013 10:41:23 -0700 Subject: [PATCH 31/78] Repository should also have i386 index, since Ubuntu is multi-arch by default --- make.sh | 5 +++-- release.sh | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/make.sh b/make.sh index 05796b5d14..572170ed36 100755 --- a/make.sh +++ b/make.sh @@ -35,6 +35,7 @@ VERSION=$(cat ./VERSION) GIT_COMMIT=$(git rev-parse --short HEAD) GIT_CHANGES=$(test -n "$(git status --porcelain)" && echo "+CHANGES" || true) +PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)" PACKAGE_URL="http://www.docker.io/" PACKAGE_MAINTAINER="docker@dotcloud.com" PACKAGE_DESCRIPTION="lxc-docker is a Linux container runtime @@ -99,7 +100,7 @@ EOF cd bundles/$VERSION/ubuntu fpm -s dir -C $DIR \ --name lxc-docker-$VERSION --version $VERSION \ - --architecture $(dpkg-architecture -qDEB_HOST_ARCH) \ + --architecture "$PACKAGE_ARCHITECTURE" \ --prefix / \ --depends lxc --depends aufs-tools \ --description "$PACKAGE_DESCRIPTION" \ @@ -113,7 +114,7 @@ EOF mkdir empty fpm -s dir -C empty \ --name lxc-docker --version $VERSION \ - --architecture all \ + --architecture "$PACKAGE_ARCHITECTURE" \ --depends lxc-docker-$VERSION \ --description "$PACKAGE_DESCRIPTION" \ --maintainer "$PACKAGE_MAINTAINER" \ diff --git a/release.sh b/release.sh index f4ba6fb83e..dacde5d3fe 100755 --- a/release.sh +++ b/release.sh @@ -76,7 +76,7 @@ release_ubuntu() { cat > $APTDIR/conf/distributions < Date: Wed, 14 Aug 2013 17:02:55 -0700 Subject: [PATCH 32/78] Implement apt-secure repository signing. --- Dockerfile | 2 +- make.sh | 3 +++ release.sh | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 218a187c39..1dcadc45f4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,7 @@ run cd /tmp && echo 'package main' > t.go && go test -a -i -v # Ubuntu stuff run apt-get install -y -q ruby1.9.3 rubygems run gem install fpm -run apt-get install -y -q reprepro +run apt-get install -y -q reprepro dpkg-sig # Install s3cmd 1.0.1 (earlier versions don't support env variables in the config) run apt-get install -y -q python-pip run pip install s3cmd diff --git a/make.sh b/make.sh index 572170ed36..78ea004d00 100755 --- a/make.sh +++ b/make.sh @@ -106,7 +106,9 @@ EOF --description "$PACKAGE_DESCRIPTION" \ --maintainer "$PACKAGE_MAINTAINER" \ --conflicts lxc-docker-virtual-package \ + --provides lxc-docker \ --provides lxc-docker-virtual-package \ + --replaces lxc-docker \ --replaces lxc-docker-virtual-package \ --url "$PACKAGE_URL" \ --vendor "$PACKAGE_VENDOR" \ @@ -147,6 +149,7 @@ AWS_ACCESS_KEY, and AWS_SECRET_KEY environment variables: docker run -e AWS_S3_BUCKET=get-staging.docker.io \\ AWS_ACCESS_KEY=AKI1234... \\ AWS_SECRET_KEY=sEs3mE... \\ + GPG_PASSPHRASE=sesame... \\ image_id_or_name ############################################################################### EOF diff --git a/release.sh b/release.sh index dacde5d3fe..f4047cc172 100755 --- a/release.sh +++ b/release.sh @@ -22,12 +22,15 @@ To run, I need: AWS_S3_BUCKET; - to be provided with AWS credentials for this S3 bucket, in environment variables AWS_ACCESS_KEY and AWS_SECRET_KEY; +- the passphrase to unlock the GPG key which will sign the deb packages + (passed as environment variable GPG_PASSPHRASE); - a generous amount of good will and nice manners. The canonical way to run me is to run the image produced by the Dockerfile: e.g.:" docker run -e AWS_S3_BUCKET=get-staging.docker.io \\ AWS_ACCESS_KEY=AKI1234... \\ - AWS_SECRET_KEY=sEs3mE... \\ + AWS_SECRET_KEY=sEs4mE... \\ + GPG_PASSPHRASE=m0resEs4mE... \\ f0058411 EOF exit 1 @@ -36,6 +39,7 @@ EOF [ "$AWS_S3_BUCKET" ] || usage [ "$AWS_ACCESS_KEY" ] || usage [ "$AWS_SECRET_KEY" ] || usage +[ "$GPG_PASSPHRASE" ] || usage [ -d /go/src/github.com/dotcloud/docker/ ] || usage cd /go/src/github.com/dotcloud/docker/ @@ -69,6 +73,26 @@ s3_url() { # 1. A full APT repository is published at $BUCKET/ubuntu/ # 2. Instructions for using the APT repository are uploaded at $BUCKET/ubuntu/info release_ubuntu() { + # Make sure that we have our keys + mkdir -p /.gnupg/ + s3cmd sync s3://$BUCKET/ubuntu/.gnupg/ /.gnupg/ || true + gpg --list-keys releasedocker >/dev/null || { + gpg --gen-key --batch < bundles/$VERSION/ubuntu/gpg + s3cmd --acl-public put bundles/$VERSION/ubuntu/gpg s3://$BUCKET/gpg + + # Upload repo + s3cmd --acl-public sync $APTDIR/ s3://$BUCKET/ubuntu/ cat < /etc/apt/sources.list.d/docker.list +# Then import the repository key +curl $(s3_url $BUCKET)/gpg | apt-key add - +# Install docker +apt-get update ; apt-get install lxc-docker EOF echo "APT repository uploaded. Instructions available at $(s3_url $BUCKET)/ubuntu/info" } From 5b630d436dc94c26fb551269508f76f110c618bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Wed, 14 Aug 2013 18:01:13 -0700 Subject: [PATCH 33/78] If there are changes, add the timestamp to the package version. --- make.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/make.sh b/make.sh index 78ea004d00..0e2e63bb0a 100755 --- a/make.sh +++ b/make.sh @@ -32,8 +32,13 @@ grep -q "$RESOLVCONF" /proc/mounts || { } VERSION=$(cat ./VERSION) -GIT_COMMIT=$(git rev-parse --short HEAD) -GIT_CHANGES=$(test -n "$(git status --porcelain)" && echo "+CHANGES" || true) +PKGVERSION="$VERSION" +GITCOMMIT=$(git rev-parse --short HEAD) +if test -n "$(git status --porcelain)" +then + GITCOMMIT="$GITCOMMIT+CHANGES" + PKGVERSION="$PKGVERSION-$(date +%Y%m%d%H%M%S)-$GITCOMMIT" +fi PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)" PACKAGE_URL="http://www.docker.io/" @@ -53,7 +58,7 @@ private PaaS, service-oriented architectures, etc." bundle_binary() { mkdir -p bundles/$VERSION/binary go build -o bundles/$VERSION/binary/docker-$VERSION \ - -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" \ + -ldflags "-X main.GITCOMMIT $GITCOMMIT -X main.VERSION $VERSION -d -w" \ ./docker } @@ -65,7 +70,7 @@ bundle_test() { for test_dir in $(find_test_dirs); do test_binary=$( cd $test_dir - go test -c -v -ldflags "-X main.GITCOMMIT $GIT_COMMIT$GIT_CHANGES -X main.VERSION $VERSION -d -w" >&2 + go test -c -v -ldflags "-X main.GITCOMMIT $GITCOMMIT -X main.VERSION $VERSION -d -w" >&2 find . -maxdepth 1 -type f -name '*.test' -executable ) cp $test_dir/$test_binary bundles/$VERSION/test/ @@ -99,7 +104,7 @@ EOF ( cd bundles/$VERSION/ubuntu fpm -s dir -C $DIR \ - --name lxc-docker-$VERSION --version $VERSION \ + --name lxc-docker-$VERSION --version $PKGVERSION \ --architecture "$PACKAGE_ARCHITECTURE" \ --prefix / \ --depends lxc --depends aufs-tools \ @@ -115,7 +120,7 @@ EOF -t deb . mkdir empty fpm -s dir -C empty \ - --name lxc-docker --version $VERSION \ + --name lxc-docker --version $PKGVERSION \ --architecture "$PACKAGE_ARCHITECTURE" \ --depends lxc-docker-$VERSION \ --description "$PACKAGE_DESCRIPTION" \ From 0469e47674f01d3f71e979d4597eb81371f124d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Wed, 14 Aug 2013 18:35:17 -0700 Subject: [PATCH 34/78] Release script also takes care of index file (if the S3 bucket is WS-enabled) --- contrib/install.sh | 10 +++++----- make.sh | 21 +++++++++++---------- release.sh | 17 ++++++++++++++++- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/contrib/install.sh b/contrib/install.sh index 04340e2acb..3cf7169a07 100755 --- a/contrib/install.sh +++ b/contrib/install.sh @@ -35,10 +35,10 @@ else fi fi -echo "Downloading docker binary and uncompressing into /usr/local/bin..." -curl -s https://get.docker.io/builds/$(uname -s)/$(uname -m)/docker-latest.tgz | -tar -C /usr/local/bin --strip-components=1 -zxf- \ -docker-latest/docker +echo "Downloading docker binary to /usr/local/bin..." +curl -s https://get.docker.io/builds/$(uname -s)/$(uname -m)/docker-latest \ + > /usr/local/bin/docker +chmod +x /usr/local/bin/docker if [ -f /etc/init/dockerd.conf ] then @@ -50,7 +50,7 @@ description "Docker daemon" start on filesystem or runlevel [2345] stop on runlevel [!2345] respawn -exec env LANG="en_US.UTF-8" /usr/local/bin/docker -d +exec /usr/local/bin/docker -d EOF fi diff --git a/make.sh b/make.sh index 0e2e63bb0a..06bc2f0203 100755 --- a/make.sh +++ b/make.sh @@ -51,6 +51,16 @@ Docker is a great building block for automating distributed systems: large-scale web deployments, database clusters, continuous deployment systems, private PaaS, service-oriented architectures, etc." +UPSTART_SCRIPT='description "Docker daemon" + +start on filesystem or runlevel [2345] +stop on runlevel [!2345] + +respawn + +exec docker -d +' + # Each "bundle" is a different type of build artefact: static binary, Ubuntu # package, etc. @@ -86,16 +96,7 @@ bundle_ubuntu() { # Generate an upstart config file (ubuntu-specific) mkdir -p $DIR/etc/init - cat > $DIR/etc/init/docker.conf < $DIR/etc/init/docker.conf # Copy the binary mkdir -p $DIR/usr/bin diff --git a/release.sh b/release.sh index f4047cc172..4237070de4 100755 --- a/release.sh +++ b/release.sh @@ -48,12 +48,14 @@ BUCKET=$AWS_S3_BUCKET setup_s3() { # Try creating the bucket. Ignore errors (it might already exist). - s3cmd --acl-public mb s3://$BUCKET 2>/dev/null || true + s3cmd mb s3://$BUCKET 2>/dev/null || true # Check access to the bucket. # s3cmd has no useful exit status, so we cannot check that. # Instead, we check if it outputs anything on standard output. # (When there are problems, it uses standard error instead.) s3cmd info s3://$BUCKET | grep -q . + # Make the bucket accessible through website endpoints. + s3cmd ws-create --ws-index index --ws-error error s3://$BUCKET } # write_to_s3 uploads the contents of standard input to the specified S3 url. @@ -152,10 +154,23 @@ EOF fi } +# Upload the index script +release_index() { + ( + if [ "$BUCKET" != "get.docker.io" ] + then + sed s,https://get.docker.io/,http://$BUCKET.s3.amazonaws.com/, contrib/install.sh + else + cat contrib/install.sh + fi + ) | write_to_s3 s3://$BUCKET/index +} + main() { setup_s3 release_binary release_ubuntu + release_index } main From c8c69a1499c195cae1669e7cbd4cf96ad19181fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 16 Aug 2013 11:59:20 -0700 Subject: [PATCH 35/78] Bump to 0.5.3 (VERSION file) --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 12805ec824..be14282b7f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.2-dev +0.5.3 From a8059059c6d6e83cac23fd84e552d4d98ccf3e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 16 Aug 2013 15:30:50 -0700 Subject: [PATCH 36/78] +CHANGES is now -dirty (works better in URLs), and we have postinstall and prerm jobs. --- make.sh | 18 ++++++++++++++++-- release.sh | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/make.sh b/make.sh index 06bc2f0203..b4af798354 100755 --- a/make.sh +++ b/make.sh @@ -10,7 +10,7 @@ # - The VERSION file, at the root of the repository, should exist, and # will be used as Docker binary version and package version. # - The hash of the git commit will also be included in the Docker binary, -# with the suffix +CHANGES if the repository isn't clean. +# with the suffix -dirty if the repository isn't clean. # - The script is intented to be run as part of a docker build, as defined # in the Dockerfile at the root of the source. In other words: # DO NOT CALL THIS SCRIPT DIRECTLY. @@ -36,7 +36,7 @@ PKGVERSION="$VERSION" GITCOMMIT=$(git rev-parse --short HEAD) if test -n "$(git status --porcelain)" then - GITCOMMIT="$GITCOMMIT+CHANGES" + GITCOMMIT="$GITCOMMIT-dirty" PKGVERSION="$PKGVERSION-$(date +%Y%m%d%H%M%S)-$GITCOMMIT" fi @@ -102,10 +102,24 @@ bundle_ubuntu() { mkdir -p $DIR/usr/bin cp bundles/$VERSION/binary/docker-$VERSION $DIR/usr/bin/docker + # Generate postinstall/prerm scripts + cat >/tmp/postinstall </tmp/prerm < /etc/apt/sources.list.d/docker.l # Then import the repository key curl $(s3_url $BUCKET)/gpg | apt-key add - # Install docker -apt-get update ; apt-get install lxc-docker +apt-get update ; apt-get install -y lxc-docker EOF echo "APT repository uploaded. Instructions available at $(s3_url $BUCKET)/ubuntu/info" } From b5a48eaed34b81253334575fccf5cb6f1b01fc61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 16 Aug 2013 16:05:16 -0700 Subject: [PATCH 37/78] Moved release scripts to hack/release and updated instructions. --- Dockerfile | 4 +- hack/RELEASE.md | 133 -------------------------- hack/release/README.md | 106 ++++++++++++++++++++ make.sh => hack/release/make.sh | 0 release.sh => hack/release/release.sh | 0 5 files changed, 108 insertions(+), 135 deletions(-) delete mode 100644 hack/RELEASE.md create mode 100644 hack/release/README.md rename make.sh => hack/release/make.sh (100%) rename release.sh => hack/release/release.sh (100%) diff --git a/Dockerfile b/Dockerfile index 1dcadc45f4..08019070b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,5 +35,5 @@ run PKG=code.google.com/p/go.net/ REV=84a4013f96e0; hg clone http://$PKG /go/s add . /go/src/github.com/dotcloud/docker run ln -s /go/src/github.com/dotcloud/docker /src # Build the binary -run cd /go/src/github.com/dotcloud/docker && ./make.sh -cmd cd /go/src/github.com/dotcloud/docker && ./release.sh +run cd /go/src/github.com/dotcloud/docker && hack/release/make.sh +cmd cd /go/src/github.com/dotcloud/docker && hack/release/release.sh diff --git a/hack/RELEASE.md b/hack/RELEASE.md deleted file mode 100644 index 0abcf150df..0000000000 --- a/hack/RELEASE.md +++ /dev/null @@ -1,133 +0,0 @@ -## A maintainer's guide to releasing Docker - -So you're in charge of a docker release? Cool. Here's what to do. - -If your experience deviates from this document, please document the changes to keep it -up-to-date. - - -### 1. Pull from master and create a release branch - - ```bash - $ git checkout master - $ git pull - $ git checkout -b bump_$VERSION - ``` - -### 2. Update CHANGELOG.md - - You can run this command for reference: - - ```bash - LAST_VERSION=$(git tag | grep -E "v[0-9\.]+$" | sort -nr | head -n 1) - git log $LAST_VERSION..HEAD - ``` - - Each change should be formatted as ```BULLET CATEGORY: DESCRIPTION``` - - * BULLET is either ```-```, ```+``` or ```*```, to indicate a bugfix, - new feature or upgrade, respectively. - - * CATEGORY should describe which part of the project is affected. - Valid categories are: - * Builder - * Documentation - * Hack - * Packaging - * Remote API - * Runtime - - * DESCRIPTION: a concise description of the change that is relevant to the end-user, - using the present tense. - Changes should be described in terms of how they affect the user, for example "new feature - X which allows Y", "fixed bug which caused X", "increased performance of Y". - - EXAMPLES: - - ``` - + Builder: 'docker build -t FOO' applies the tag FOO to the newly built container. - * Runtime: improve detection of kernel version - - Remote API: fix a bug in the optional unix socket transport - ``` - -### 3. Change the contents of the VERSION file - -### 4. Run all tests - - ```bash - $ make test - ``` - -### 5. Commit and create a pull request - - ```bash - $ git add commands.go CHANGELOG.md - $ git commit -m "Bump version to $VERSION" - $ git push origin bump_$VERSION - ``` - -### 6. Get 2 other maintainers to validate the pull request - -### 7. Merge the pull request and apply tags - - ```bash - $ git checkout master - $ git merge bump_$VERSION - $ git tag -a v$VERSION # Don't forget the v! - $ git tag -f -a latest - $ git push - $ git push --tags - ``` - -### 8. Publish binaries - - To run this you will need access to the release credentials. - Get them from [the infrastructure maintainers](https://github.com/dotcloud/docker/blob/master/hack/infrastructure/MAINTAINERS). - - ```bash - $ RELEASE_IMAGE=image_provided_by_infrastructure_maintainers - $ BUILD=$(docker run -d -e RELEASE_PPA=0 $RELEASE_IMAGE) - ``` - - This will do 2 things: - - * It will build and upload the binaries on http://get.docker.io - * It will *test* the release on our Ubuntu PPA (a PPA is a community repository for ubuntu packages) - - Wait for the build to complete. - - ```bash - $ docker wait $BUILD # This should print 0. If it doesn't, your build failed. - ``` - - Check that the output looks OK. Here's an example of a correct output: - - ```bash - $ docker logs 2>&1 b4e7c8299d73 | grep -e 'Public URL' -e 'Successfully uploaded' - Public URL of the object is: http://get.docker.io.s3.amazonaws.com/builds/Linux/x86_64/docker-v0.4.7.tgz - Public URL of the object is: http://get.docker.io.s3.amazonaws.com/builds/Linux/x86_64/docker-latest.tgz - Successfully uploaded packages. - ``` - - If you don't see 3 lines similar to this, something might be wrong. Check the full logs and try again. - - -### 9. Publish Ubuntu packages - - If everything went well in the previous step, you can finalize the release by submitting the Ubuntu - packages. - - ```bash - $ RELEASE_IMAGE=image_provided_by_infrastructure_maintainers - $ docker run -e RELEASE_PPA=1 $RELEASE_IMAGE - ``` - - If that goes well, Ubuntu Precise package is in its way. It will take anywhere from 0.5 to 30 hours - for the builders to complete their job depending on builder demand at this time. At this point, Quantal - and Raring packages need to be created using the Launchpad interface: - https://launchpad.net/~dotcloud/+archive/lxc-docker/+packages - - Notify [the packager maintainers](https://github.com/dotcloud/docker/blob/master/packaging/MAINTAINERS) - who will ensure PPA is ready. - - Congratulations! You're done diff --git a/hack/release/README.md b/hack/release/README.md new file mode 100644 index 0000000000..f01bb3a60b --- /dev/null +++ b/hack/release/README.md @@ -0,0 +1,106 @@ +## A maintainer's guide to releasing Docker + +So you're in charge of a Docker release? Cool. Here's what to do. + +If your experience deviates from this document, please document the changes +to keep it up-to-date. + + +### 1. Pull from master and create a release branch + +```bash +git checkout master +git pull +git checkout -b bump_$VERSION +``` + +### 2. Update CHANGELOG.md + +You can run this command for reference: + +```bash +LAST_VERSION=$(git tag | grep -E "v[0-9\.]+$" | sort -nr | head -n 1) +git log $LAST_VERSION..HEAD +``` + +Each change should be formatted as ```BULLET CATEGORY: DESCRIPTION``` + +* BULLET is either ```-```, ```+``` or ```*```, to indicate a bugfix, + new feature or upgrade, respectively. + +* CATEGORY should describe which part of the project is affected. + Valid categories are: + * Builder + * Documentation + * Hack + * Packaging + * Remote API + * Runtime + +* DESCRIPTION: a concise description of the change that is relevant to the + end-user, using the present tense. Changes should be described in terms + of how they affect the user, for example "new feature X which allows Y", + "fixed bug which caused X", "increased performance of Y". + +EXAMPLES: + +``` ++ Builder: 'docker build -t FOO' applies the tag FOO to the newly built + container. +* Runtime: improve detection of kernel version +- Remote API: fix a bug in the optional unix socket transport +``` + +### 3. Change the contents of the VERSION file + +### 4. Run all tests + +```bash +go test +``` + +### 5. Commit and create a pull request + +```bash +git add CHANGELOG.md +git commit -m "Bump version to $VERSION" +git push origin bump_$VERSION +``` + +### 6. Get 2 other maintainers to validate the pull request + +### 7. Merge the pull request and apply tags + +```bash +git checkout master +git merge bump_$VERSION +git tag -a v$VERSION # Don't forget the v! +git tag -f -a latest +git push +git push --tags +``` + +### 8. Publish binaries + +To run this you will need access to the release credentials. +Get them from [the infrastructure maintainers]( +https://github.com/dotcloud/docker/blob/master/hack/infrastructure/MAINTAINERS). + +```bash +docker build -t releasedocker . +docker run \ + -e AWS_S3_BUCKET=get-nightly.docker.io \ + -e AWS_ACCESS_KEY=$(cat ~/.aws/access_key) \ + -e AWS_SECRET_KEY=$(cat ~/.aws/secret_key) \ + -e GPG_PASSPHRASE=supersecretsesame \ + releasedocker +``` + +It will build and upload the binaries on the specified bucket (you should +use get-nightly.docker.io for general testing, and once everything is fine, +switch to get.docker.io). + + +### 9. Rejoice! + +Congratulations! You're done. diff --git a/make.sh b/hack/release/make.sh similarity index 100% rename from make.sh rename to hack/release/make.sh diff --git a/release.sh b/hack/release/release.sh similarity index 100% rename from release.sh rename to hack/release/release.sh From e06372d6f434ae64f3cbafddee5491d1e2570584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 16 Aug 2013 16:10:12 -0700 Subject: [PATCH 38/78] Update packaging/README to point to hack/release --- packaging/README.md | 12 ++++++++++++ packaging/README.rst | 8 -------- 2 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 packaging/README.md delete mode 100644 packaging/README.rst diff --git a/packaging/README.md b/packaging/README.md new file mode 100644 index 0000000000..1efe79ab90 --- /dev/null +++ b/packaging/README.md @@ -0,0 +1,12 @@ +# Docker packaging + +This directory has one subdirectory per packaging distribution. +At minimum, each of these subdirectories should contain a +README.$DISTRIBUTION explaining how to create the native +docker package and how to install it. + +**Important:** the debian and ubuntu directories are here for +reference only. Since we experienced many issues with Launchpad, +we gave up on using it to have a Docker PPA (at least, for now!) +and we are using a simpler process. +See [/hack/release](../hack/release) for details. diff --git a/packaging/README.rst b/packaging/README.rst deleted file mode 100644 index 7e927ccffe..0000000000 --- a/packaging/README.rst +++ /dev/null @@ -1,8 +0,0 @@ -Docker packaging -================ - -This directory has one subdirectory per packaging distribution. -At minimum, each of these subdirectories should contain a -README.$DISTRIBUTION explaining how to create the native -docker package and how to install it. - From 885afebe07c79f54df9c1c4a8c71fcb323f3c944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Tue, 20 Aug 2013 19:36:42 -0700 Subject: [PATCH 39/78] Bump up VERSION file to 0.5.3-dev --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index be14282b7f..aaa0831b0d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.3 +0.5.3-dev From 8a7c0495e0251c9b74db2c74d09397fb158ed512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Tue, 20 Aug 2013 20:49:16 -0700 Subject: [PATCH 40/78] =?UTF-8?q?Remove=20-x=20flag=20=E2=80=94=20we=20do?= =?UTF-8?q?=20not=20want=20to=20be=20*that*=20verbose.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hack/release/make.sh | 1 - hack/release/release.sh | 1 - 2 files changed, 2 deletions(-) diff --git a/hack/release/make.sh b/hack/release/make.sh index b4af798354..a9395832bf 100755 --- a/hack/release/make.sh +++ b/hack/release/make.sh @@ -19,7 +19,6 @@ # set -e -set -x # We're a nice, sexy, little shell script, and people might try to run us; # but really, they shouldn't. We want to be in a container! diff --git a/hack/release/release.sh b/hack/release/release.sh index 0ce9ab3596..4d5bd00b22 100755 --- a/hack/release/release.sh +++ b/hack/release/release.sh @@ -9,7 +9,6 @@ # official Dockerfile at the root of the Docker source code. The Dockerfile, # make.sh and release.sh should all be from the same source code revision. -set -x set -e # Print a usage message and exit. From 215094903a9574953af915f5b93c89858d626473 Mon Sep 17 00:00:00 2001 From: Matt Mueller Date: Wed, 21 Aug 2013 02:08:32 -0700 Subject: [PATCH 41/78] update help --- commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands.go b/commands.go index a74a23fe92..96aa14118a 100644 --- a/commands.go +++ b/commands.go @@ -72,7 +72,7 @@ func (cli *DockerCli) CmdHelp(args ...string) error { return nil } } - help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix:///var/run/docker.sock]: tcp://host:port (ex. tcp://%s:%d) to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTHTTPHOST, DEFAULTHTTPPORT) + help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=[unix://%s]: tcp://host:port to bind/connect to or unix://path/to/socket to use\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", DEFAULTUNIXSOCKET) for _, command := range [][]string{ {"attach", "Attach to a running container"}, {"build", "Build a container from a Dockerfile"}, From 2f6ce27fde04456284457ff686c8f78ab9bd6d71 Mon Sep 17 00:00:00 2001 From: pysqz Date: Wed, 21 Aug 2013 22:37:58 +0800 Subject: [PATCH 42/78] Make sure 'Ghost' container is available with allocated IP --- container.go | 25 ++++++++++++++++++++++--- network.go | 17 ++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/container.go b/container.go index 472ae3990d..0fae60402c 100644 --- a/container.go +++ b/container.go @@ -20,6 +20,7 @@ import ( "strings" "syscall" "time" + "net" ) type Container struct { @@ -778,10 +779,28 @@ func (container *Container) allocateNetwork() error { return nil } - iface, err := container.runtime.networkManager.Allocate() - if err != nil { - return err + var iface *NetworkInterface + var err error + if !container.State.Ghost { + iface, err = container.runtime.networkManager.Allocate() + if err != nil { + return err + } + } else { + manager := container.runtime.networkManager + if manager.disabled { + iface = &NetworkInterface{disabled: true} + } else { + iface = &NetworkInterface{ + IPNet: net.IPNet{IP: net.ParseIP(container.NetworkSettings.IPAddress), Mask: manager.bridgeNetwork.Mask}, + Gateway: manager.bridgeNetwork.IP, + manager: manager, + } + ipNum := ipToInt(iface.IPNet.IP) + manager.ipAllocator.inUse[ipNum] = struct{}{} + } } + container.NetworkSettings.PortMapping = make(map[string]PortMapping) container.NetworkSettings.PortMapping["Tcp"] = make(PortMapping) container.NetworkSettings.PortMapping["Udp"] = make(PortMapping) diff --git a/network.go b/network.go index dd0fe2dd41..c2673bd803 100644 --- a/network.go +++ b/network.go @@ -635,10 +635,25 @@ func (manager *NetworkManager) Allocate() (*NetworkInterface, error) { return &NetworkInterface{disabled: true}, nil } - ip, err := manager.ipAllocator.Acquire() + var ip net.IP + var err error + + ip, err = manager.ipAllocator.Acquire() if err != nil { return nil, err } + // avoid duplicate IP + ipNum := ipToInt(ip) + firstIP := manager.ipAllocator.network.IP.To4().Mask(manager.ipAllocator.network.Mask) + firstIPNum := ipToInt(firstIP) + 1 + + if firstIPNum == ipNum { + ip, err = manager.ipAllocator.Acquire() + if err != nil { + return nil, err + } + } + iface := &NetworkInterface{ IPNet: net.IPNet{IP: ip, Mask: manager.bridgeNetwork.Mask}, Gateway: manager.bridgeNetwork.IP, From 467dbb75f10ae97e785a127a7547a5015cbb2a99 Mon Sep 17 00:00:00 2001 From: Deni Bertovic Date: Wed, 21 Aug 2013 17:28:13 +0200 Subject: [PATCH 43/78] small fix to docs regarding adding docker groups --- docs/sources/use/basics.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/sources/use/basics.rst b/docs/sources/use/basics.rst index 411e1c30d1..eef6740599 100644 --- a/docs/sources/use/basics.rst +++ b/docs/sources/use/basics.rst @@ -41,7 +41,7 @@ Why ``sudo``? The ``docker`` daemon always runs as root, and since ``docker`` version 0.5.2, ``docker`` binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user *root*, and so, -by default, you can access it with ``sudo``. +by default, you can access it with ``sudo``. Starting in version 0.5.3, if you create a Unix group called *docker* and add users to it, then the ``docker`` daemon will make the @@ -56,6 +56,8 @@ you don't need to add ``sudo`` to all the client commands. sudo groupadd docker # Add the ubuntu user to the docker group + # You may have to logout and log back in again for + # this to take effect sudo gpasswd -a ubuntu docker # Restart the docker daemon From f5bd13721666366879e3a9681df8442181448ffc Mon Sep 17 00:00:00 2001 From: Andy Rothfusz Date: Wed, 21 Aug 2013 12:09:40 -0700 Subject: [PATCH 44/78] Add mongodb example --- docs/sources/examples/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/sources/examples/index.rst b/docs/sources/examples/index.rst index 58da18e344..2664b95e54 100644 --- a/docs/sources/examples/index.rst +++ b/docs/sources/examples/index.rst @@ -21,3 +21,4 @@ Contents: running_ssh_service couchdb_data_volumes postgresql_service + mongodb From d6f53049c4ec4513a136bfd512dafe166c4ad901 Mon Sep 17 00:00:00 2001 From: Tyler Brock Date: Wed, 21 Aug 2013 23:48:32 -0400 Subject: [PATCH 45/78] Some fixes for MongoDB example --- docs/sources/examples/mongodb.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/sources/examples/mongodb.rst b/docs/sources/examples/mongodb.rst index e351b9b384..c8b46c2544 100644 --- a/docs/sources/examples/mongodb.rst +++ b/docs/sources/examples/mongodb.rst @@ -24,7 +24,7 @@ Create an empty file called ``Dockerfile``: touch Dockerfile Next, define the parent image you want to use to build your own image on top of. -Here, we’ll use `CentOS `_ (tag: ``latest``) +Here, we’ll use `Ubuntu `_ (tag: ``latest``) available on the `docker index`_: .. code-block:: bash @@ -65,11 +65,14 @@ run without needing to provide a special configuration file) # Create the MongoDB data directory RUN mkdir -p /data/db -Finally, we'll expose the standard port that MongoDB runs on (27107) +Finally, we'll expose the standard port that MongoDB runs on (27107) as well as +add an entrypoint that runs the standard --help command by default. .. code-block:: bash EXPOSE 27017 + ENTRYPOINT [ "/usr/bin/mongod" ] + CMD [ "--help" ] Now, lets build the image which will go through the ``Dockerfile`` we made and run all of the commands. From 3f802f4a13cc9d35118420f7c769a8b3531476c8 Mon Sep 17 00:00:00 2001 From: Marco Hennings Date: Thu, 22 Aug 2013 13:23:05 +0200 Subject: [PATCH 46/78] Fix race conditions in parallel pull During parallel pull of a repostiory it can happen that the same layer is pulled more than once. To fix this I have extended the locking code to - avoid multiple pulls of the same image - avoid multiple pulls of the same layer If an error occurs the other layers are awaited before returning as leaving the scope before the go routines leave causes crashes of the server sometimes if the download status is updated while the http stream is already closed Beside this I have extended status display. --- server.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/server.go b/server.go index e1b4bd1bbf..fc41424827 100644 --- a/server.go +++ b/server.go @@ -419,19 +419,30 @@ func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgID, endpoin if err != nil { return err } - + out.Write(sf.FormatProgress(utils.TruncateID(imgID), "Pulling", "dependend layers")) // FIXME: Try to stream the images? // FIXME: Launch the getRemoteImage() in goroutines + for _, id := range history { + + // ensure no two downloads of the same layer happen at the same time + if err := srv.poolAdd("pull", "layer:"+id); err != nil { + utils.Debugf("Image (id: %s) pull is already running, skipping: %v", id, err) + return nil + } + defer srv.poolRemove("pull", "layer:"+id) + if !srv.runtime.graph.Exists(id) { out.Write(sf.FormatProgress(utils.TruncateID(id), "Pulling", "metadata")) imgJSON, imgSize, err := r.GetRemoteImageJSON(id, endpoint, token) if err != nil { + out.Write(sf.FormatProgress(utils.TruncateID(id), "Error", "pulling dependend layers")) // FIXME: Keep going in case of error? return err } img, err := NewImgJSON(imgJSON) if err != nil { + out.Write(sf.FormatProgress(utils.TruncateID(id), "Error", "pulling dependend layers")) return fmt.Errorf("Failed to parse json: %s", err) } @@ -439,13 +450,17 @@ func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgID, endpoin out.Write(sf.FormatProgress(utils.TruncateID(id), "Pulling", "fs layer")) layer, err := r.GetRemoteImageLayer(img.ID, endpoint, token) if err != nil { + out.Write(sf.FormatProgress(utils.TruncateID(id), "Error", "pulling dependend layers")) return err } defer layer.Close() if err := srv.runtime.graph.Register(imgJSON, utils.ProgressReader(layer, imgSize, out, sf.FormatProgress(utils.TruncateID(id), "Downloading", "%8v/%v (%v)"), sf, false), img); err != nil { + out.Write(sf.FormatProgress(utils.TruncateID(id), "Error", "downloading dependend layers")) return err } } + out.Write(sf.FormatProgress(utils.TruncateID(id), "Download", "complete")) + } return nil } @@ -493,29 +508,57 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, localName downloadImage := func(img *registry.ImgData) { if askedTag != "" && img.Tag != askedTag { utils.Debugf("(%s) does not match %s (id: %s), skipping", img.Tag, askedTag, img.ID) - errors <- nil + if parallel { + errors <- nil + } return } if img.Tag == "" { utils.Debugf("Image (id: %s) present in this repository but untagged, skipping", img.ID) - errors <- nil + if parallel { + errors <- nil + } return } + + // ensure no two downloads of the same image happen at the same time + if err := srv.poolAdd("pull", "img:"+img.ID); err != nil { + utils.Debugf("Image (id: %s) pull is already running, skipping: %v", img.ID, err) + if parallel { + errors <- nil + } + return + } + defer srv.poolRemove("pull", "img:"+img.ID) + out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Pulling", fmt.Sprintf("image (%s) from %s", img.Tag, localName))) success := false + var lastErr error for _, ep := range repoData.Endpoints { + out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Pulling", fmt.Sprintf("image (%s) from %s, endpoint: %s", img.Tag, localName, ep))) if err := srv.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil { - out.Write(sf.FormatStatus(utils.TruncateID(img.ID), "Error while retrieving image for tag: %s (%s); checking next endpoint", askedTag, err)) + // Its not ideal that only the last error is returned, it would be better to concatenate the errors. + // As the error is also given to the output stream the user will see the error. + lastErr = err + out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Error pulling", fmt.Sprintf("image (%s) from %s, endpoint: %s, %s", img.Tag, localName, ep, err))) continue } success = true break } if !success { - errors <- fmt.Errorf("Could not find repository on any of the indexed registries.") + out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Error pulling", fmt.Sprintf("image (%s) from %s, %s", img.Tag, localName, lastErr))) + if parallel { + errors <- fmt.Errorf("Could not find repository on any of the indexed registries.") + return + } + } + out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Download", "complete")) + + if parallel { + errors <- nil } - errors <- nil } if parallel { @@ -524,15 +567,18 @@ func (srv *Server) pullRepository(r *registry.Registry, out io.Writer, localName downloadImage(image) } } - if parallel { + var lastError error for i := 0; i < len(repoData.ImgList); i++ { if err := <-errors; err != nil { - return err + lastError = err } } - } + if lastError != nil { + return lastError + } + } for tag, id := range tagsList { if askedTag != "" && tag != askedTag { continue From 551092f9c0da2244c60b75d893ef847f915ca604 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Thu, 15 Aug 2013 23:35:03 +0000 Subject: [PATCH 47/78] Add lxc-conf flag to allow custom lxc options --- container.go | 27 +++++++++++++++-- container_test.go | 32 ++++++++++++++++++++- docs/sources/api/docker_remote_api_v1.4.rst | 3 +- docs/sources/commandline/command/run.rst | 2 +- lxc_template.go | 13 +++++++++ utils.go | 21 ++++++++++++++ utils_test.go | 17 +++++++++++ 7 files changed, 109 insertions(+), 6 deletions(-) diff --git a/container.go b/container.go index 62007ed624..7de3539b2f 100644 --- a/container.go +++ b/container.go @@ -86,6 +86,7 @@ type Config struct { type HostConfig struct { Binds []string ContainerIDFile string + LxcConf []KeyValuePair } type BindMap struct { @@ -98,6 +99,11 @@ var ( ErrInvaidWorikingDirectory = errors.New("The working directory is invalid. It needs to be an absolute path.") ) +type KeyValuePair struct { + Key string + Value string +} + func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, *flag.FlagSet, error) { cmd := Subcmd("run", "[OPTIONS] IMAGE [COMMAND] [ARG...]", "Run a command in a new container") if len(args) > 0 && args[0] != "--help" { @@ -140,6 +146,9 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, flVolumesFrom := cmd.String("volumes-from", "", "Mount volumes from the specified container") flEntrypoint := cmd.String("entrypoint", "", "Overwrite the default entrypoint of the image") + var flLxcOpts ListOpts + cmd.Var(&flLxcOpts, "lxc-conf", "Add custom lxc options -lxc-conf=\"lxc.cgroup.cpuset.cpus = 0,1\"") + if err := cmd.Parse(args); err != nil { return nil, nil, cmd, err } @@ -187,6 +196,12 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, entrypoint = []string{*flEntrypoint} } + var lxcConf []KeyValuePair + lxcConf, err := parseLxcConfOpts(flLxcOpts) + if err != nil { + return nil, nil, cmd, err + } + config := &Config{ Hostname: *flHostname, PortSpecs: flPorts, @@ -212,6 +227,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, hostConfig := &HostConfig{ Binds: binds, ContainerIDFile: *flContainerIDFile, + LxcConf: lxcConf, } if capabilities != nil && *flMemory > 0 && !capabilities.SwapLimit { @@ -315,7 +331,7 @@ func (container *Container) SaveHostConfig(hostConfig *HostConfig) (err error) { return ioutil.WriteFile(container.hostConfigPath(), data, 0666) } -func (container *Container) generateLXCConfig() error { +func (container *Container) generateLXCConfig(hostConfig *HostConfig) error { fo, err := os.Create(container.lxcConfigPath()) if err != nil { return err @@ -324,6 +340,11 @@ func (container *Container) generateLXCConfig() error { if err := LxcTemplateCompiled.Execute(fo, container); err != nil { return err } + if hostConfig != nil { + if err := LxcHostConfigTemplateCompiled.Execute(fo, hostConfig); err != nil { + return err + } + } return nil } @@ -520,7 +541,7 @@ func (container *Container) Start(hostConfig *HostConfig) error { container.State.Lock() defer container.State.Unlock() - if len(hostConfig.Binds) == 0 { + if len(hostConfig.Binds) == 0 && len(hostConfig.LxcConf) == 0 { hostConfig, _ = container.ReadHostConfig() } @@ -645,7 +666,7 @@ func (container *Container) Start(hostConfig *HostConfig) error { } } - if err := container.generateLXCConfig(); err != nil { + if err := container.generateLXCConfig(hostConfig); err != nil { return err } diff --git a/container_test.go b/container_test.go index 3752615a3c..ba48ceb47a 100644 --- a/container_test.go +++ b/container_test.go @@ -1070,7 +1070,7 @@ func TestLXCConfig(t *testing.T) { t.Fatal(err) } defer runtime.Destroy(container) - container.generateLXCConfig() + container.generateLXCConfig(nil) grepFile(t, container.lxcConfigPath(), "lxc.utsname = foobar") grepFile(t, container.lxcConfigPath(), fmt.Sprintf("lxc.cgroup.memory.limit_in_bytes = %d", mem)) @@ -1078,6 +1078,36 @@ func TestLXCConfig(t *testing.T) { fmt.Sprintf("lxc.cgroup.memory.memsw.limit_in_bytes = %d", mem*2)) } +func TestCustomLxcConfig(t *testing.T) { + runtime := mkRuntime(t) + defer nuke(runtime) + container, err := NewBuilder(runtime).Create(&Config{ + Image: GetTestImage(runtime).ID, + Cmd: []string{"/bin/true"}, + + Hostname: "foobar", + }, + ) + if err != nil { + t.Fatal(err) + } + defer runtime.Destroy(container) + hostConfig := &HostConfig{LxcConf: []KeyValuePair{ + { + Key: "lxc.utsname", + Value: "docker", + }, + { + Key: "lxc.cgroup.cpuset.cpus", + Value: "0,1", + }, + }} + + container.generateLXCConfig(hostConfig) + grepFile(t, container.lxcConfigPath(), "lxc.utsname = docker") + grepFile(t, container.lxcConfigPath(), "lxc.cgroup.cpuset.cpus = 0,1") +} + func BenchmarkRunSequencial(b *testing.B) { runtime := mkRuntime(b) defer nuke(runtime) diff --git a/docs/sources/api/docker_remote_api_v1.4.rst b/docs/sources/api/docker_remote_api_v1.4.rst index 14dbfd7c3f..d512de9ca3 100644 --- a/docs/sources/api/docker_remote_api_v1.4.rst +++ b/docs/sources/api/docker_remote_api_v1.4.rst @@ -356,7 +356,8 @@ Start a container Content-Type: application/json { - "Binds":["/tmp:/tmp"] + "Binds":["/tmp:/tmp"], + "LxcConf":{"lxc.utsname":"docker"} } **Example response**: diff --git a/docs/sources/commandline/command/run.rst b/docs/sources/commandline/command/run.rst index bd78ea473f..cd283669e6 100644 --- a/docs/sources/commandline/command/run.rst +++ b/docs/sources/commandline/command/run.rst @@ -30,7 +30,7 @@ -volumes-from="": Mount all volumes from the given container. -entrypoint="": Overwrite the default entrypoint set by the image. -w="": Working directory inside the container - + -lxc-conf=[]: Add custom lxc options -lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" Examples -------- diff --git a/lxc_template.go b/lxc_template.go index 2ed05ad168..d357c02b43 100644 --- a/lxc_template.go +++ b/lxc_template.go @@ -121,7 +121,16 @@ lxc.cgroup.cpu.shares = {{.Config.CpuShares}} {{end}} ` +const LxcHostConfigTemplate = ` +{{if .LxcConf}} +{{range $pair := .LxcConf}} +{{$pair.Key}} = {{$pair.Value}} +{{end}} +{{end}} +` + var LxcTemplateCompiled *template.Template +var LxcHostConfigTemplateCompiled *template.Template func getMemorySwap(config *Config) int64 { // By default, MemorySwap is set to twice the size of RAM. @@ -141,4 +150,8 @@ func init() { if err != nil { panic(err) } + LxcHostConfigTemplateCompiled, err = template.New("lxc-hostconfig").Funcs(funcMap).Parse(LxcHostConfigTemplate) + if err != nil { + panic(err) + } } diff --git a/utils.go b/utils.go index b8f264fdb4..aed8ffdd76 100644 --- a/utils.go +++ b/utils.go @@ -1,6 +1,7 @@ package docker import ( + "fmt" "strings" ) @@ -146,3 +147,23 @@ func MergeConfig(userConf, imageConf *Config) { } } } + +func parseLxcConfOpts(opts ListOpts) ([]KeyValuePair, error) { + out := make([]KeyValuePair, len(opts)) + for i, o := range opts { + k, v, err := parseLxcOpt(o) + if err != nil { + return nil, err + } + out[i] = KeyValuePair{Key: k, Value: v} + } + return out, nil +} + +func parseLxcOpt(opt string) (string, string, error) { + parts := strings.SplitN(opt, "=", 2) + if len(parts) != 2 { + return "", "", fmt.Errorf("Unable to parse lxc conf option: %s", opt) + } + return strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]), nil +} diff --git a/utils_test.go b/utils_test.go index 5c37e9e8ec..e8aae17186 100644 --- a/utils_test.go +++ b/utils_test.go @@ -301,3 +301,20 @@ func TestMergeConfigPublicPortNotHonored(t *testing.T) { t.Fail() } } + +func TestParseLxcConfOpt(t *testing.T) { + opts := []string{"lxc.utsname=docker", "lxc.utsname = docker "} + + for _, o := range opts { + k, v, err := parseLxcOpt(o) + if err != nil { + t.FailNow() + } + if k != "lxc.utsname" { + t.Fail() + } + if v != "docker" { + t.Fail() + } + } +} From 093b85b72f7a0fcda292816716e795543b3a72eb Mon Sep 17 00:00:00 2001 From: shin- Date: Thu, 22 Aug 2013 21:15:31 +0200 Subject: [PATCH 48/78] Use additional decorator in RequestFactory to pass meta headers to registry --- api.go | 18 +++++++++++++++--- buildfile.go | 2 +- server.go | 17 ++++++++++------- utils/http.go | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/api.go b/api.go index 41edc4f4c5..9e094231b5 100644 --- a/api.go +++ b/api.go @@ -101,7 +101,7 @@ func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Reque if err != nil { return err } - status, err := auth.Login(authConfig, srv.HTTPRequestFactory()) + status, err := auth.Login(authConfig, srv.HTTPRequestFactory(nil)) if err != nil { return err } @@ -399,7 +399,13 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht } sf := utils.NewStreamFormatter(version > 1.0) if image != "" { //pull - if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}, version > 1.3); err != nil { + metaHeaders := map[string][]string{} + for k, v := range r.Header { + if strings.HasPrefix(k, "X-Meta-") { + metaHeaders[k] = v + } + } + if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}, metaHeaders, version > 1.3); err != nil { if sf.Used() { w.Write(sf.FormatError(err)) return nil @@ -468,6 +474,12 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { authConfig := &auth.AuthConfig{} + metaHeaders := map[string][]string{} + for k, v := range r.Header { + if strings.HasPrefix(k, "X-Meta-") { + metaHeaders[k] = v + } + } if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil { return err } @@ -483,7 +495,7 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http w.Header().Set("Content-Type", "application/json") } sf := utils.NewStreamFormatter(version > 1.0) - if err := srv.ImagePush(name, w, sf, authConfig); err != nil { + if err := srv.ImagePush(name, w, sf, authConfig, metaHeaders); err != nil { if sf.Used() { w.Write(sf.FormatError(err)) return nil diff --git a/buildfile.go b/buildfile.go index 64c4503c9a..4c8db2c60e 100644 --- a/buildfile.go +++ b/buildfile.go @@ -56,7 +56,7 @@ func (b *buildFile) CmdFrom(name string) error { if err != nil { if b.runtime.graph.IsNotExist(err) { remote, tag := utils.ParseRepositoryTag(name) - if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil, true); err != nil { + if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil, nil, true); err != nil { return err } image, err = b.runtime.repositories.LookupImage(name) diff --git a/server.go b/server.go index fc41424827..646cb44877 100644 --- a/server.go +++ b/server.go @@ -102,7 +102,7 @@ func (srv *Server) ContainerExport(name string, out io.Writer) error { } func (srv *Server) ImagesSearch(term string) ([]APISearch, error) { - r, err := registry.NewRegistry(srv.runtime.root, nil, srv.HTTPRequestFactory()) + r, err := registry.NewRegistry(srv.runtime.root, nil, srv.HTTPRequestFactory(nil)) if err != nil { return nil, err } @@ -632,8 +632,8 @@ func (srv *Server) poolRemove(kind, key string) error { return nil } -func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, parallel bool) error { - r, err := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory()) +func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string, parallel bool) error { + r, err := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory(metaHeaders)) if err != nil { return err } @@ -780,7 +780,7 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID, } // FIXME: Allow to interrupt current push when new push of same image is done. -func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error { +func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string) error { if err := srv.poolAdd("push", localName); err != nil { return err } @@ -794,7 +794,7 @@ func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFo out = utils.NewWriteFlusher(out) img, err := srv.runtime.graph.Get(localName) - r, err2 := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory()) + r, err2 := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory(metaHeaders)) if err2 != nil { return err2 } @@ -1267,10 +1267,13 @@ func NewServer(flGraphPath string, autoRestart, enableCors bool, dns ListOpts) ( return srv, nil } -func (srv *Server) HTTPRequestFactory() *utils.HTTPRequestFactory { +func (srv *Server) HTTPRequestFactory(metaHeaders map[string][]string) *utils.HTTPRequestFactory { if srv.reqFactory == nil { ud := utils.NewHTTPUserAgentDecorator(srv.versionInfos()...) - factory := utils.NewHTTPRequestFactory(ud) + md := &utils.HTTPMetaHeadersDecorator{ + Headers: metaHeaders, + } + factory := utils.NewHTTPRequestFactory(ud, md) srv.reqFactory = factory } return srv.reqFactory diff --git a/utils/http.go b/utils/http.go index 8c1e4b7a79..1332ce816d 100644 --- a/utils/http.go +++ b/utils/http.go @@ -93,6 +93,20 @@ func (self *HTTPUserAgentDecorator) ChangeRequest(req *http.Request) (newReq *ht return req, nil } +type HTTPMetaHeadersDecorator struct { + Headers map[string][]string +} + +func (self *HTTPMetaHeadersDecorator) ChangeRequest(req *http.Request) (newReq *http.Request, err error) { + if self.Headers == nil { + return req, nil + } + for k, v := range self.Headers { + req.Header[k] = v + } + return req, nil +} + // HTTPRequestFactory creates an HTTP request // and applies a list of decorators on the request. type HTTPRequestFactory struct { From f4a4f1ca875a1f68d5950e67b34b57542f504ecd Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Thu, 22 Aug 2013 21:09:50 +0000 Subject: [PATCH 49/78] Bump to 0.6.0 --- CHANGELOG.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++ VERSION | 2 +- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfbd86cd75..b4b4d9e9e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,99 @@ # Changelog +## 0.6.0 (2013-08-22) +- Runtime: Load authConfig only when needed and fix useless WARNING ++ Runtime: Add lxc-conf flag to allow custom lxc options +- Runtime: Fix race conditions in parallel pull +- Runtime: Improve CMD, ENTRYPOINT, and attach docs. +* Documentation: Small fix to docs regarding adding docker groups +* Documentation: Add MongoDB image example ++ Builder: Add USER instruction do Dockerfile +* Documentation: updated default -H docs +* Remote API: Sort Images by most recent creation date. ++ Builder: Add workdir support for the Buildfile ++ Runtime: Add an option to set the working directory +- Runtime: Show tag used when image is missing +* Documentation: Update readme with dependencies for building +* Documentation: Add instructions for creating and using the docker group +* Remote API: Reworking opaque requests in registry module +- Runtime: Fix Graph ByParent() to generate list of child images per parent image. +* Runtime: Add Image name to LogEvent tests +* Documentation: Add sudo to examples and installation to documentation ++ Hack: Bash Completion: Limit commands to containers of a relevant state +* Remote API: Add image name in /events +* Runtime: Apply volumes-from before creating volumes +- Runtime: Make docker run handle SIGINT/SIGTERM +- Runtime: Prevent crash when .dockercfg not readable +* Hack: Add docker dependencies coverage testing into docker-ci ++ Runtime: Add -privileged flag and relevant tests, docs, and examples ++ Packaging: Docker-brew 0.5.2 support and memory footprint reduction +- Runtime: Install script should be fetched over https, not http. +* Packaging: Add new docker dependencies into docker-ci +* Runtime: Use Go 1.1.2 for dockerbuilder +* Registry: Improve auth push +* Runtime: API, issue 1471: Use groups for socket permissions +* Documentation: PostgreSQL service example in documentation +* Contrib: bash completion script +* Tests: Improve TestKillDifferentUser to prevent timeout on buildbot +* Documentation: Fix typo in docs for docker run -dns +* Documentation: Adding a reference to ps -a +- Runtime: Correctly detect IPv4 forwarding +- Packaging: Revert "docker.upstart: avoid spawning a `sh` process" +* Runtime: Use ranged for loop on channels +- Runtime: Fix typo: fmt.Sprint -> fmt.Sprintf +- Tests: Fix typo in TestBindMounts (runContainer called without image) +* Runtime: add websocket support to /container//attach/ws +* Runtime: Mount /dev/shm as a tmpfs +- Builder: Only count known instructions as build steps +- Builder: Fix docker build and docker events output +- Runtime: switch from http to https for get.docker.io +* Tests: Improve TestGetContainersTop so it does not rely on sleep ++ Packaging: Docker-brew and Docker standard library +* Testing: Add some tests in server and utils ++ Packaging: Release docker with docker +- Builder: Make sure ENV instruction within build perform a commit each time +* Packaging: Fix the upstart script generated by get.docker.io +- Runtime: fix small \n error un docker build +* Runtime: Let userland proxy handle container-bound traffic +* Runtime: Updated the Docker CLI to specify a value for the "Host" header. +* Runtime: Add warning when net.ipv4.ip_forwarding = 0 +* Registry: Registry unit tests + mock registry +* Runtime: fixed #910. print user name to docker info output +- Builder: Forbid certain paths within docker build ADD +- Runtime: change network range to avoid conflict with EC2 DNS +* Tests: Relax the lo interface test to allow iface index != 1 +* Documentation: Suggest installing linux-headers by default. +* Documentation: Change the twitter handle +* Client: Add docker cp command and copy api endpoint to copy container files/folders to the host +* Remote API: Use mime pkg to parse Content-Type +- Runtime: Reduce connect and read timeout when pinging the registry +* Documentation: Update amazon.rst to explain that Vagrant is not necessary for running Docker on ec2 +* Packaging: Enabled the docs to generate manpages. +* Runtime: Parallel pull +- Runtime: Handle ip route showing mask-less IP addresses +* Documentation: Clarify Amazon EC2 installation +* Documentation: 'Base' image is deprecated and should no longer be referenced in the docs. +* Runtime: Fix to "Inject dockerinit at /.dockerinit" +* Runtime: Allow ENTRYPOINT without CMD +- Runtime: Always consider localhost as a domain name when parsing the FQN repos name +* Remote API: 650 http utils and user agent field +* Documentation: fix a typo in the ubuntu installation guide +- Builder: Repository name (and optionally a tag) in build usage +* Documentation: Move note about officially supported kernel +* Packaging: Revert "Bind daemon to 0.0.0.0 in Vagrant. +* Builder: Add no cache for docker build +* Runtime: Add hostname to environment +* Runtime: Add last stable version in `docker version` +- Builder: Make sure ADD will create everything in 0755 +* Documentation: Add ufw doc +* Tests: Add registry functional test to docker-ci +- Documentation: Solved the logo being squished in Safari +- Runtime: Use utils.ParseRepositoryTag instead of strings.Split(name, ":") in server.ImageDelete +* Runtime: Refactor checksum +- Runtime: Improve connect message with socket error +* Documentation: Added information about Docker's high level tools over LXC. +* Don't read from stdout when only attached to stdin + ## 0.5.3 (2013-08-13) * Runtime: Use docker group for socket permissions - Runtime: Spawn shell within upstart script diff --git a/VERSION b/VERSION index aaa0831b0d..a918a2aa18 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.3-dev +0.6.0 From 2191419f4cb5c452b02102a37d154fee6ca536e3 Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Thu, 22 Aug 2013 23:12:28 +0100 Subject: [PATCH 50/78] Removed duplicate mercurial install command --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 08019070b3..e34261fe1e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,8 +28,6 @@ run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/dotcloud/tar/ REV=d06045a6d9; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV -# Docker requires code.google.com/p/go.net/websocket -run apt-get install -y -q mercurial run PKG=code.google.com/p/go.net/ REV=84a4013f96e0; hg clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && hg checkout $REV # Upload docker source add . /go/src/github.com/dotcloud/docker From 1c6af604e824d8fa2896c4906f05a0a3729c8e52 Mon Sep 17 00:00:00 2001 From: shin- Date: Fri, 23 Aug 2013 04:32:09 +0200 Subject: [PATCH 51/78] Fixed: ImagePull in runtime test --- runtime_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime_test.go b/runtime_test.go index 8819df2221..83ada6dd21 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -101,7 +101,7 @@ func init() { // If the unit test is not found, try to download it. if img, err := globalRuntime.repositories.LookupImage(unitTestImageName); err != nil || img.ID != unitTestImageID { // Retrieve the Image - if err := srv.ImagePull(unitTestImageName, "", os.Stdout, utils.NewStreamFormatter(false), nil, true); err != nil { + if err := srv.ImagePull(unitTestImageName, "", os.Stdout, utils.NewStreamFormatter(false), nil, nil, true); err != nil { panic(err) } } From 3396a183c61b66dd60458f67049a50b393e760f8 Mon Sep 17 00:00:00 2001 From: Abhiraj Butala Date: Fri, 23 Aug 2013 01:28:58 -0700 Subject: [PATCH 52/78] Update docker_remote_api.rst --- docs/sources/api/docker_remote_api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/api/docker_remote_api.rst b/docs/sources/api/docker_remote_api.rst index 17fe3b82e3..82db83d507 100644 --- a/docs/sources/api/docker_remote_api.rst +++ b/docs/sources/api/docker_remote_api.rst @@ -165,7 +165,7 @@ Initial version Docker Remote API Client Libraries ================================== -These libraries have been not tested by the Docker Maintainers for +These libraries have not been tested by the Docker Maintainers for compatibility. Please file issues with the library owners. If you find more library implementations, please list them in Docker doc bugs and we will add the libraries here. From 72cfa3de3584d8cade530360e0e5997a06981e7a Mon Sep 17 00:00:00 2001 From: unclejack Date: Fri, 23 Aug 2013 19:13:30 +0300 Subject: [PATCH 53/78] use libffi-dev, don't build it from sources --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e34261fe1e..8694f07c37 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ env GOPATH /go env CGO_ENABLED 0 run cd /tmp && echo 'package main' > t.go && go test -a -i -v # Ubuntu stuff -run apt-get install -y -q ruby1.9.3 rubygems +run apt-get install -y -q ruby1.9.3 rubygems libffi-dev run gem install fpm run apt-get install -y -q reprepro dpkg-sig # Install s3cmd 1.0.1 (earlier versions don't support env variables in the config) From d1ad0e278d67baad46168f6d04a56550a287d4a7 Mon Sep 17 00:00:00 2001 From: unclejack Date: Fri, 23 Aug 2013 18:59:11 +0300 Subject: [PATCH 54/78] return error if at least one container fails to start This makes docker start exit with exit code 1 if at least one container didn't start. This also prints an error at the end. --- commands.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/commands.go b/commands.go index b38069f075..21531231af 100644 --- a/commands.go +++ b/commands.go @@ -584,15 +584,17 @@ func (cli *DockerCli) CmdStart(args ...string) error { return nil } + var encounteredError error for _, name := range args { _, _, err := cli.call("POST", "/containers/"+name+"/start", nil) if err != nil { fmt.Fprintf(cli.err, "%s\n", err) + encounteredError = fmt.Errorf("Error: failed to start one or more containers") } else { fmt.Fprintf(cli.out, "%s\n", name) } } - return nil + return encounteredError } func (cli *DockerCli) CmdInspect(args ...string) error { From f753dfe6b3d3a8e4d770ae73e947e2fe339df536 Mon Sep 17 00:00:00 2001 From: Thatcher Peskens Date: Fri, 23 Aug 2013 10:41:53 -0700 Subject: [PATCH 55/78] Updated the docs to reflect we no longer use Launchpad and host our own repository. --- docs/sources/installation/ubuntulinux.rst | 36 ++++++++--------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/docs/sources/installation/ubuntulinux.rst b/docs/sources/installation/ubuntulinux.rst index 587c8fe31b..5a41f7cd40 100644 --- a/docs/sources/installation/ubuntulinux.rst +++ b/docs/sources/installation/ubuntulinux.rst @@ -35,8 +35,8 @@ Dependencies **Linux kernel 3.8** Due to a bug in LXC, docker works best on the 3.8 kernel. Precise -comes with a 3.2 kernel, so we need to upgrade it. The kernel we -install comes with AUFS built in. We also include the generic headers +comes with a 3.2 kernel, so we need to upgrade it. The kernel you'll install when following these steps +comes with AUFS built in. We also include the generic headers to enable packages that depend on them, like ZFS and the VirtualBox guest additions. If you didn't install the headers for your "precise" kernel, then you can skip these headers for the "raring" kernel. But @@ -56,14 +56,15 @@ it is safer to include them if you're not sure. Installation ------------ -Docker is available as a Ubuntu PPA (Personal Package Archive), -`hosted on launchpad `_ -which makes installing Docker on Ubuntu very easy. +Docker is available as a Debian package, which makes installation easy. + +*Please note that these instructions have changed for 0.6. If you are upgrading from an earlier version, you will need +to follow them again.* .. code-block:: bash - # Add the PPA sources to your apt sources list. - sudo apt-get install python-software-properties && sudo add-apt-repository ppa:dotcloud/lxc-docker + # Add the Docker repository to your apt sources list. + sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" # Update your sources sudo apt-get update @@ -101,30 +102,19 @@ have AUFS filesystem support enabled, so we need to install it. sudo apt-get update sudo apt-get install linux-image-extra-`uname -r` -**add-apt-repository support** - -Some installations of Ubuntu 13.04 require ``software-properties-common`` to be -installed before being able to use add-apt-repository. - -.. code-block:: bash - - sudo apt-get install software-properties-common - Installation ------------ -Docker is available as a Ubuntu PPA (Personal Package Archive), -`hosted on launchpad `_ -which makes installing Docker on Ubuntu very easy. +Docker is available as a Debian package, which makes installation easy. - -Add the custom package sources to your apt sources list. +*Please note that these instructions have changed for 0.6. If you are upgrading from an earlier version, you will need +to follow them again.* .. code-block:: bash - # add the sources to your apt - sudo add-apt-repository ppa:dotcloud/lxc-docker + # Add the Docker repository to your apt sources list. + sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" # update sudo apt-get update From 091fb892948abee1ad5451ee6c9d7dd540d88780 Mon Sep 17 00:00:00 2001 From: Thatcher Peskens Date: Fri, 23 Aug 2013 11:45:52 -0700 Subject: [PATCH 56/78] Added line on top of ubuntulinux announcing change in 0.6 Added lines on top of vagrant installs --- docs/sources/installation/ubuntulinux.rst | 5 ++++- docs/sources/installation/vagrant.rst | 2 ++ docs/sources/installation/windows.rst | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/sources/installation/ubuntulinux.rst b/docs/sources/installation/ubuntulinux.rst index 5a41f7cd40..916af225e1 100644 --- a/docs/sources/installation/ubuntulinux.rst +++ b/docs/sources/installation/ubuntulinux.rst @@ -4,10 +4,13 @@ .. _ubuntu_linux: +**These instructions have changed for 0.6. If you are upgrading from an earlier version, you will need to follow them again.** + Ubuntu Linux ============ - **Please note this project is currently under heavy development. It should not be used in production.** + **Please note this project is currently under heavy development. It should not be used in production.** + Right now, the officially supported distribution are: diff --git a/docs/sources/installation/vagrant.rst b/docs/sources/installation/vagrant.rst index 24a1e91354..4ae907ff93 100644 --- a/docs/sources/installation/vagrant.rst +++ b/docs/sources/installation/vagrant.rst @@ -4,6 +4,8 @@ .. _install_using_vagrant: +**Vagrant installation is temporarily out of date, it will be updated for 0.6 soon.** + Using Vagrant (Mac, Linux) ========================== diff --git a/docs/sources/installation/windows.rst b/docs/sources/installation/windows.rst index 7830106020..2c3a2cd722 100644 --- a/docs/sources/installation/windows.rst +++ b/docs/sources/installation/windows.rst @@ -4,6 +4,8 @@ .. _windows: +**Vagrant installation is temporarily out of date, it will be updated for 0.6 soon.** + Using Vagrant (Windows) ======================= From ebb9b5e85be296fd73f4d64e61dfc87fe0c3ae72 Mon Sep 17 00:00:00 2001 From: Thatcher Peskens Date: Fri, 23 Aug 2013 12:56:03 -0700 Subject: [PATCH 57/78] Added adding the gpg key --- docs/sources/installation/ubuntulinux.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/sources/installation/ubuntulinux.rst b/docs/sources/installation/ubuntulinux.rst index 916af225e1..338ecd64da 100644 --- a/docs/sources/installation/ubuntulinux.rst +++ b/docs/sources/installation/ubuntulinux.rst @@ -66,6 +66,9 @@ to follow them again.* .. code-block:: bash + # Add the Docker repository key to your local keychain + sudo sh -c "curl http://get.docker.io/gpg | apt-key add -" + # Add the Docker repository to your apt sources list. sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" @@ -116,6 +119,9 @@ to follow them again.* .. code-block:: bash + # Add the Docker repository key to your local keychain + sudo sh -c "curl http://get.docker.io/gpg | apt-key add -" + # Add the Docker repository to your apt sources list. sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" From ab882da03b57037885c4222f474fa8bd37a01956 Mon Sep 17 00:00:00 2001 From: Mohit Soni Date: Fri, 23 Aug 2013 14:37:37 -0700 Subject: [PATCH 58/78] Fixes #1643 Changed the split statement, from SplitN to Split. Doing so takes care of cases, when a minor version is followed by a suffix, that starts with '.'. --- utils/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/utils.go b/utils/utils.go index 6a5beb8e48..69d300e282 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -537,7 +537,7 @@ func GetKernelVersion() (*KernelVersionInfo, error) { release = release[:bytes.IndexByte(release, 0)] tmp := strings.SplitN(string(release), "-", 2) - tmp2 := strings.SplitN(tmp[0], ".", 3) + tmp2 := strings.Split(tmp[0], ".") if len(tmp2) > 0 { kernel, err = strconv.Atoi(tmp2[0]) From 3d9b4379a5b84e52a04b31129f87fd0eef3cf54d Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 23 Aug 2013 20:01:08 +0000 Subject: [PATCH 59/78] Use correct upstart script with new build tool --- hack/release/make.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hack/release/make.sh b/hack/release/make.sh index a9395832bf..7792297861 100755 --- a/hack/release/make.sh +++ b/hack/release/make.sh @@ -57,7 +57,9 @@ stop on runlevel [!2345] respawn -exec docker -d +script + /usr/bin/docker -d +end script ' # Each "bundle" is a different type of build artefact: static binary, Ubuntu From 5a8c32dc8e3f7a8980b2b7feeed0a2ba5ec027c2 Mon Sep 17 00:00:00 2001 From: shin- Date: Thu, 22 Aug 2013 21:15:31 +0200 Subject: [PATCH 60/78] Use additional decorator in RequestFactory to pass meta headers to registry --- api.go | 18 +++++++++++++++--- buildfile.go | 2 +- server.go | 17 ++++++++++------- utils/http.go | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/api.go b/api.go index 41edc4f4c5..9e094231b5 100644 --- a/api.go +++ b/api.go @@ -101,7 +101,7 @@ func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Reque if err != nil { return err } - status, err := auth.Login(authConfig, srv.HTTPRequestFactory()) + status, err := auth.Login(authConfig, srv.HTTPRequestFactory(nil)) if err != nil { return err } @@ -399,7 +399,13 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht } sf := utils.NewStreamFormatter(version > 1.0) if image != "" { //pull - if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}, version > 1.3); err != nil { + metaHeaders := map[string][]string{} + for k, v := range r.Header { + if strings.HasPrefix(k, "X-Meta-") { + metaHeaders[k] = v + } + } + if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}, metaHeaders, version > 1.3); err != nil { if sf.Used() { w.Write(sf.FormatError(err)) return nil @@ -468,6 +474,12 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error { authConfig := &auth.AuthConfig{} + metaHeaders := map[string][]string{} + for k, v := range r.Header { + if strings.HasPrefix(k, "X-Meta-") { + metaHeaders[k] = v + } + } if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil { return err } @@ -483,7 +495,7 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http w.Header().Set("Content-Type", "application/json") } sf := utils.NewStreamFormatter(version > 1.0) - if err := srv.ImagePush(name, w, sf, authConfig); err != nil { + if err := srv.ImagePush(name, w, sf, authConfig, metaHeaders); err != nil { if sf.Used() { w.Write(sf.FormatError(err)) return nil diff --git a/buildfile.go b/buildfile.go index 64c4503c9a..4c8db2c60e 100644 --- a/buildfile.go +++ b/buildfile.go @@ -56,7 +56,7 @@ func (b *buildFile) CmdFrom(name string) error { if err != nil { if b.runtime.graph.IsNotExist(err) { remote, tag := utils.ParseRepositoryTag(name) - if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil, true); err != nil { + if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil, nil, true); err != nil { return err } image, err = b.runtime.repositories.LookupImage(name) diff --git a/server.go b/server.go index fc41424827..646cb44877 100644 --- a/server.go +++ b/server.go @@ -102,7 +102,7 @@ func (srv *Server) ContainerExport(name string, out io.Writer) error { } func (srv *Server) ImagesSearch(term string) ([]APISearch, error) { - r, err := registry.NewRegistry(srv.runtime.root, nil, srv.HTTPRequestFactory()) + r, err := registry.NewRegistry(srv.runtime.root, nil, srv.HTTPRequestFactory(nil)) if err != nil { return nil, err } @@ -632,8 +632,8 @@ func (srv *Server) poolRemove(kind, key string) error { return nil } -func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, parallel bool) error { - r, err := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory()) +func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string, parallel bool) error { + r, err := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory(metaHeaders)) if err != nil { return err } @@ -780,7 +780,7 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID, } // FIXME: Allow to interrupt current push when new push of same image is done. -func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error { +func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string) error { if err := srv.poolAdd("push", localName); err != nil { return err } @@ -794,7 +794,7 @@ func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFo out = utils.NewWriteFlusher(out) img, err := srv.runtime.graph.Get(localName) - r, err2 := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory()) + r, err2 := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory(metaHeaders)) if err2 != nil { return err2 } @@ -1267,10 +1267,13 @@ func NewServer(flGraphPath string, autoRestart, enableCors bool, dns ListOpts) ( return srv, nil } -func (srv *Server) HTTPRequestFactory() *utils.HTTPRequestFactory { +func (srv *Server) HTTPRequestFactory(metaHeaders map[string][]string) *utils.HTTPRequestFactory { if srv.reqFactory == nil { ud := utils.NewHTTPUserAgentDecorator(srv.versionInfos()...) - factory := utils.NewHTTPRequestFactory(ud) + md := &utils.HTTPMetaHeadersDecorator{ + Headers: metaHeaders, + } + factory := utils.NewHTTPRequestFactory(ud, md) srv.reqFactory = factory } return srv.reqFactory diff --git a/utils/http.go b/utils/http.go index 8c1e4b7a79..1332ce816d 100644 --- a/utils/http.go +++ b/utils/http.go @@ -93,6 +93,20 @@ func (self *HTTPUserAgentDecorator) ChangeRequest(req *http.Request) (newReq *ht return req, nil } +type HTTPMetaHeadersDecorator struct { + Headers map[string][]string +} + +func (self *HTTPMetaHeadersDecorator) ChangeRequest(req *http.Request) (newReq *http.Request, err error) { + if self.Headers == nil { + return req, nil + } + for k, v := range self.Headers { + req.Header[k] = v + } + return req, nil +} + // HTTPRequestFactory creates an HTTP request // and applies a list of decorators on the request. type HTTPRequestFactory struct { From 29be20f987a7a7bb8aeb89bd15ae31840b0b5df5 Mon Sep 17 00:00:00 2001 From: shin- Date: Fri, 23 Aug 2013 04:32:09 +0200 Subject: [PATCH 61/78] Fixed: ImagePull in runtime test --- runtime_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime_test.go b/runtime_test.go index 8819df2221..83ada6dd21 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -101,7 +101,7 @@ func init() { // If the unit test is not found, try to download it. if img, err := globalRuntime.repositories.LookupImage(unitTestImageName); err != nil || img.ID != unitTestImageID { // Retrieve the Image - if err := srv.ImagePull(unitTestImageName, "", os.Stdout, utils.NewStreamFormatter(false), nil, true); err != nil { + if err := srv.ImagePull(unitTestImageName, "", os.Stdout, utils.NewStreamFormatter(false), nil, nil, true); err != nil { panic(err) } } From 59281d6f805a7f569af6bdb509fe3257fef05156 Mon Sep 17 00:00:00 2001 From: unclejack Date: Fri, 23 Aug 2013 19:13:30 +0300 Subject: [PATCH 62/78] use libffi-dev, don't build it from sources --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 08019070b3..2cc749ac9b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ env GOPATH /go env CGO_ENABLED 0 run cd /tmp && echo 'package main' > t.go && go test -a -i -v # Ubuntu stuff -run apt-get install -y -q ruby1.9.3 rubygems +run apt-get install -y -q ruby1.9.3 rubygems libffi-dev run gem install fpm run apt-get install -y -q reprepro dpkg-sig # Install s3cmd 1.0.1 (earlier versions don't support env variables in the config) From 15d658d36bcc8bc9226be87a01a3ab7cc7e4ac6f Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Thu, 22 Aug 2013 23:12:28 +0100 Subject: [PATCH 63/78] Removed duplicate mercurial install command --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2cc749ac9b..8694f07c37 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,8 +28,6 @@ run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/dotcloud/tar/ REV=d06045a6d9; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV -# Docker requires code.google.com/p/go.net/websocket -run apt-get install -y -q mercurial run PKG=code.google.com/p/go.net/ REV=84a4013f96e0; hg clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && hg checkout $REV # Upload docker source add . /go/src/github.com/dotcloud/docker From 7b5c579b7744877af02777a82aa8c7b28cfc1172 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 23 Aug 2013 20:01:08 +0000 Subject: [PATCH 64/78] Use correct upstart script with new build tool --- hack/release/make.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hack/release/make.sh b/hack/release/make.sh index a9395832bf..7792297861 100755 --- a/hack/release/make.sh +++ b/hack/release/make.sh @@ -57,7 +57,9 @@ stop on runlevel [!2345] respawn -exec docker -d +script + /usr/bin/docker -d +end script ' # Each "bundle" is a different type of build artefact: static binary, Ubuntu From 5105263dacc9372771d9bf478dcac6fceedb9a30 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 23 Aug 2013 22:23:30 +0000 Subject: [PATCH 65/78] Bump to v0.6.1 --- CHANGELOG.md | 6 ++++++ VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4b4d9e9e0..968c6696f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.6.1 (2013-08-23) +* Registry: Pass "meta" headers in API calls to the registry +- Packaging: Use correct upstart script with new build tool +- Packaging: Use libffi-dev, don't build it from sources +- Packaging: Removed duplicate mercurial install command + ## 0.6.0 (2013-08-22) - Runtime: Load authConfig only when needed and fix useless WARNING + Runtime: Add lxc-conf flag to allow custom lxc options diff --git a/VERSION b/VERSION index a918a2aa18..ee6cdce3c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.6.0 +0.6.1 From f4432d50c388c242bba6b697f31b32f1fe21ff65 Mon Sep 17 00:00:00 2001 From: Mohit Soni Date: Sat, 24 Aug 2013 00:24:40 -0700 Subject: [PATCH 66/78] Refactored code and added unit tests - Extracted ParseRelease method from GetKernelVersion to make code more testable - Added tests for ParseRelease method --- utils/utils.go | 16 ++++++++++++---- utils/utils_test.go | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/utils/utils.go b/utils/utils.go index 69d300e282..441f71a126 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -515,9 +515,7 @@ func FindCgroupMountpoint(cgroupType string) (string, error) { func GetKernelVersion() (*KernelVersionInfo, error) { var ( - flavor string - kernel, major, minor int - err error + err error ) uts, err := uname() @@ -536,7 +534,17 @@ func GetKernelVersion() (*KernelVersionInfo, error) { // Remove the \x00 from the release for Atoi to parse correctly release = release[:bytes.IndexByte(release, 0)] - tmp := strings.SplitN(string(release), "-", 2) + return ParseRelease(string(release)) +} + +func ParseRelease(release string) (*KernelVersionInfo, error) { + var ( + flavor string + kernel, major, minor int + err error + ) + + tmp := strings.SplitN(release, "-", 2) tmp2 := strings.Split(tmp[0], ".") if len(tmp2) > 0 { diff --git a/utils/utils_test.go b/utils/utils_test.go index 1030b2902a..20a5820dd5 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -337,3 +337,21 @@ search dotcloud.net`: true, } } } + +func assertParseRelease(t *testing.T, release string, b *KernelVersionInfo, result int) { + var ( + a *KernelVersionInfo + ) + a, _ = ParseRelease(release) + + if r := CompareKernelVersion(a, b); r != result { + t.Fatalf("Unexpected kernel version comparison result. Found %d, expected %d", r, result) + } +} + +func TestParseRelease(t *testing.T) { + assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) + assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) + assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: "1"}, 0) + assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "19-generic"}, 0) +} From 1f85ed6825c07a9c2a86f995b2db484953ee1e6e Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sat, 24 Aug 2013 16:49:55 +0100 Subject: [PATCH 67/78] Update Vagrantfile to use docker apt repository --- Vagrantfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 18aa5b5afb..4cee3a04d0 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -17,11 +17,12 @@ Vagrant::Config.run do |config| # Provision docker and new kernel if deployment was not done if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty? # Add lxc-docker package - pkg_cmd = "apt-get update -qq; apt-get install -q -y python-software-properties; " \ - "add-apt-repository -y ppa:dotcloud/lxc-docker; apt-get update -qq; " \ - "apt-get install -q -y lxc-docker; " + pkg_cmd = "wget -q -O - http://get.docker.io/gpg | apt-key add -;" \ + "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list;" \ + "apt-get update -qq; apt-get install -q -y --force-yes lxc-docker; " # Add X.org Ubuntu backported 3.8 kernel - pkg_cmd << "add-apt-repository -y ppa:ubuntu-x-swat/r-lts-backport; " \ + pkg_cmd << "apt-get update -qq; apt-get install -q -y python-software-properties; " \ + "add-apt-repository -y ppa:ubuntu-x-swat/r-lts-backport; " \ "apt-get update -qq; apt-get install -q -y linux-image-3.8.0-19-generic; " # Add guest additions if local vbox VM is_vbox = true From 02d1d238cdde7b865879de1fc3f47acacfea0e82 Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sat, 24 Aug 2013 18:04:40 +0100 Subject: [PATCH 68/78] Add latest docker options to docker.bash Adds bash completion options for the latest docker release (0.6.1) --- contrib/docker.bash | 138 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 107 insertions(+), 31 deletions(-) diff --git a/contrib/docker.bash b/contrib/docker.bash index 6719ef6a92..32f2b5f8f1 100644 --- a/contrib/docker.bash +++ b/contrib/docker.bash @@ -115,7 +115,7 @@ _docker_build() case "$cur" in -*) - COMPREPLY=( $( compgen -W "-t -q" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "-no-cache -t -q" -- "$cur" ) ) ;; *) _filedir @@ -138,11 +138,37 @@ _docker_commit() COMPREPLY=( $( compgen -W "-author -m -run" -- "$cur" ) ) ;; *) - __docker_containers_all + local counter=$cpos + while [ $counter -le $cword ]; do + case "${words[$counter]}" in + -author|-m|-run) + (( counter++ )) + ;; + -*) + ;; + *) + break + ;; + esac + (( counter++ )) + done + + if [ $counter -eq $cword ]; then + __docker_containers_all + fi ;; esac } +_docker_cp() +{ + if [ $cpos -eq $cword ]; then + __docker_containers_all + else + _filedir + fi +} + _docker_diff() { if [ $cpos -eq $cword ]; then @@ -152,7 +178,21 @@ _docker_diff() _docker_events() { - COMPREPLY=( $( compgen -W "-since" -- "$cur" ) ) + case "$prev" in + -since) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-since" -- "$cur" ) ) + ;; + *) + ;; + esac } _docker_export() @@ -231,7 +271,21 @@ _docker_kill() _docker_login() { - COMPREPLY=( $( compgen -W "-e -p -u" -- "$cur" ) ) + case "$prev" in + -e|-p|-u) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-e -p -u" -- "$cur" ) ) + ;; + *) + ;; + esac } _docker_logs() @@ -250,12 +304,40 @@ _docker_port() _docker_ps() { - COMPREPLY=( $( compgen -W "-a -beforeId -l -n -notrunc -q -s -sinceId" -- "$cur" ) ) + case "$prev" in + -beforeId|-n|-sinceId) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-a -beforeId -l -n -notrunc -q -s -sinceId" -- "$cur" ) ) + ;; + *) + ;; + esac } _docker_pull() { - COMPREPLY=( $( compgen -W "-t" -- "$cur" ) ) + case "$prev" in + -t) + return + ;; + *) + ;; + esac + + case "$cur" in + -*) + COMPREPLY=( $( compgen -W "-t" -- "$cur" ) ) + ;; + *) + ;; + esac } _docker_push() @@ -309,7 +391,7 @@ _docker_run() -volumes-from) __docker_containers_all ;; - -a|-c|-dns|-e|-entrypoint|-h|-m|-p|-u|-v) + -a|-c|-dns|-e|-entrypoint|-h|-lxc-conf|-m|-p|-u|-v|-w) return ;; *) @@ -318,34 +400,27 @@ _docker_run() case "$cur" in -*) - COMPREPLY=( $( compgen -W "-a -c -cidfile -d -dns -e -entrypoint -h -i -m -n -p -t -u -v -volumes-from" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "-a -c -cidfile -d -dns -e -entrypoint -h -i -lxc-conf -m -n -p -privileged -t -u -v -volumes-from -w" -- "$cur" ) ) ;; *) - case "$cur" in - -*) - COMPREPLY=( $( compgen -W "-a -notrunc -q -viz" -- "$cur" ) ) - ;; - *) - local counter=$cpos - while [ $counter -le $cword ]; do - case "${words[$counter]}" in - -a|-c|-cidfile|-dns|-e|-entrypoint|-h|-m|-p|-u|-v|-volumes-from) - (( counter++ )) - ;; - -*) - ;; - *) - break - ;; - esac + local counter=$cpos + while [ $counter -le $cword ]; do + case "${words[$counter]}" in + -a|-c|-cidfile|-dns|-e|-entrypoint|-h|-lxc-conf|-m|-p|-u|-v|-volumes-from|-w) (( counter++ )) - done + ;; + -*) + ;; + *) + break + ;; + esac + (( counter++ )) + done - if [ $counter -eq $cword ]; then - __docker_image_repos_and_tags - fi - ;; - esac + if [ $counter -eq $cword ]; then + __docker_image_repos_and_tags + fi ;; esac } @@ -409,6 +484,7 @@ _docker() attach build commit + cp diff events export From 465d5313c50007460306a17be16f38dfd657b0a4 Mon Sep 17 00:00:00 2001 From: James Carr Date: Sat, 24 Aug 2013 10:26:54 -0700 Subject: [PATCH 69/78] Update for new mailing list --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7d90e28ca8..d5438c3eae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ that feature *on top of* docker. ### Discuss your design on the mailing list We recommend discussing your plans [on the mailing -list](https://groups.google.com/forum/?fromgroups#!forum/docker-club) +list](https://groups.google.com/forum/?fromgroups#!forum/docker-dev) before starting to code - especially for more ambitious contributions. This gives other contributors a chance to point you in the right direction, give feedback on your design, and maybe point out if someone From d8a18ea3ae96ab415885fc1554db168d94d64265 Mon Sep 17 00:00:00 2001 From: Kawsar Saiyeed Date: Sun, 25 Aug 2013 00:28:36 +0100 Subject: [PATCH 70/78] Display error if resource not specified Display an error message if a container resource is not supplied to 'docker cp'. Fixes error in #1661 --- commands.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commands.go b/commands.go index b38069f075..3324d75754 100644 --- a/commands.go +++ b/commands.go @@ -1532,6 +1532,10 @@ func (cli *DockerCli) CmdCp(args ...string) error { var copyData APICopy info := strings.Split(cmd.Arg(0), ":") + if len(info) != 2 { + return fmt.Errorf("Error: Resource not specified") + } + copyData.Resource = info[1] copyData.HostPath = cmd.Arg(1) From 4440bde0ebffcb31025fd9f3db8e4275b77332b1 Mon Sep 17 00:00:00 2001 From: Tobias Schwab Date: Mon, 26 Aug 2013 11:45:15 +0200 Subject: [PATCH 71/78] Change fetching of gpg key from http to https Or was there any reason to fetch using http? --- docs/sources/installation/ubuntulinux.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sources/installation/ubuntulinux.rst b/docs/sources/installation/ubuntulinux.rst index 80df4fab5e..02bdd09718 100644 --- a/docs/sources/installation/ubuntulinux.rst +++ b/docs/sources/installation/ubuntulinux.rst @@ -67,7 +67,7 @@ to follow them again.* .. code-block:: bash # Add the Docker repository key to your local keychain - sudo sh -c "curl http://get.docker.io/gpg | apt-key add -" + sudo sh -c "curl https://get.docker.io/gpg | apt-key add -" # Add the Docker repository to your apt sources list. sudo sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" From 843ef645d2c76275e484e3fd5262b947d5611d59 Mon Sep 17 00:00:00 2001 From: kim0 Date: Mon, 26 Aug 2013 12:54:15 +0300 Subject: [PATCH 72/78] Don't force a non-existent npm version, use latest from epel Not the smartest thing to do --- docs/sources/examples/nodejs_web_app.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/sources/examples/nodejs_web_app.rst b/docs/sources/examples/nodejs_web_app.rst index cb580c43d9..67584d1794 100644 --- a/docs/sources/examples/nodejs_web_app.rst +++ b/docs/sources/examples/nodejs_web_app.rst @@ -93,7 +93,7 @@ To install the right package for CentOS, we’ll use the instructions from the # Enable EPEL for Node.js RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # Install Node.js and npm - RUN yum install -y npm-1.2.17-5.el6 + RUN yum install -y npm To bundle your app’s source code inside the docker image, use the ``ADD`` command: @@ -137,7 +137,7 @@ Your ``Dockerfile`` should now look like this: # Enable EPEL for Node.js RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # Install Node.js and npm - RUN yum install -y npm-1.2.17-5.el6 + RUN yum install -y npm # Bundle app source ADD . /src From 076434ef10ebf940bb822c423056fcc4417b4a28 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Mon, 26 Aug 2013 12:06:56 -0700 Subject: [PATCH 73/78] Remove incorrect build instructions --- README.md | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/README.md b/README.md index 2b3628375a..ddf3f4d805 100644 --- a/README.md +++ b/README.md @@ -163,29 +163,6 @@ supported. * [Windows (with Vagrant)](http://docs.docker.io/en/latest/installation/windows/) * [Amazon EC2 (with Vagrant)](http://docs.docker.io/en/latest/installation/amazon/) -Installing from source ----------------------- - -1. Install Dependencies - * [Go language 1.1.x](http://golang.org/doc/install) - * [git](http://git-scm.com) - * [lxc](http://lxc.sourceforge.net) - * [aufs-tools](http://aufs.sourceforge.net) - -2. Checkout the source code - - ```bash - git clone http://github.com/dotcloud/docker - ``` - -3. Build the ``docker`` binary - - ```bash - cd docker - make VERBOSE=1 - sudo cp ./bin/docker /usr/local/bin/docker - ``` - Usage examples ============== From f352ec945fbc34eafdde04dff7ced995c9e3a409 Mon Sep 17 00:00:00 2001 From: Tyler Brock Date: Mon, 26 Aug 2013 17:55:21 -0400 Subject: [PATCH 74/78] ENTRYPOINT fixups --- docs/sources/examples/mongodb.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/sources/examples/mongodb.rst b/docs/sources/examples/mongodb.rst index c8b46c2544..0d0f205cc8 100644 --- a/docs/sources/examples/mongodb.rst +++ b/docs/sources/examples/mongodb.rst @@ -66,13 +66,12 @@ run without needing to provide a special configuration file) RUN mkdir -p /data/db Finally, we'll expose the standard port that MongoDB runs on (27107) as well as -add an entrypoint that runs the standard --help command by default. +define an ENTRYPOINT for the container. .. code-block:: bash EXPOSE 27017 - ENTRYPOINT [ "/usr/bin/mongod" ] - CMD [ "--help" ] + ENTRYPOINT ["usr/bin/mongod"] Now, lets build the image which will go through the ``Dockerfile`` we made and run all of the commands. @@ -87,10 +86,10 @@ the local port! .. code-block:: bash # Regular style - MONGO_ID=$(docker run -d /mongodb mongod) + MONGO_ID=$(docker run -d /mongodb) # Lean and mean - MONGO_ID=$(docker run -d /mongodb mongod --noprealloc --smallfiles) + MONGO_ID=$(docker run -d /mongodb --noprealloc --smallfiles) # Check the logs out docker logs $MONGO_ID From f861c493bf4d391f1721f536e86da4fa007fb7f0 Mon Sep 17 00:00:00 2001 From: Daniel Mizyrycki Date: Tue, 27 Aug 2013 11:19:32 -0700 Subject: [PATCH 75/78] Troubleshooting windows installation section --- .../installation/images/win/hp_bios_vm.JPG | Bin 0 -> 38670 bytes .../installation/images/win/ts_go_bios.JPG | Bin 0 -> 60567 bytes .../installation/images/win/ts_no_docker.JPG | Bin 0 -> 23470 bytes docs/sources/installation/windows.rst | 26 ++++++++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 docs/sources/installation/images/win/hp_bios_vm.JPG create mode 100644 docs/sources/installation/images/win/ts_go_bios.JPG create mode 100644 docs/sources/installation/images/win/ts_no_docker.JPG diff --git a/docs/sources/installation/images/win/hp_bios_vm.JPG b/docs/sources/installation/images/win/hp_bios_vm.JPG new file mode 100644 index 0000000000000000000000000000000000000000..b44cabeac1c6e745e66f24f4444cc2ce680a8465 GIT binary patch literal 38670 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

UA$%G!Y%dgv2TUpdv&qLW|y^2D3!eO;CY9YYkX_ zxE(!a>AcvEu+ks7sqYxUr=;cHZjapD?Z9wu`a?whWBbQR`a@Xg!%s$izwmA84NmaX zoT02^^&ixBn=#d!$8ONno3QiVI-U48C)_oAaN2W*rws($hNRHXxuKdS?B&{R9itsl Kj;v#+tpC|gh2>iS literal 0 HcmV?d00001 diff --git a/docs/sources/installation/images/win/ts_go_bios.JPG b/docs/sources/installation/images/win/ts_go_bios.JPG new file mode 100644 index 0000000000000000000000000000000000000000..05f2310ad3544563393759d3b247757208fee320 GIT binary patch literal 60567 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 literal 0 HcmV?d00001 diff --git a/docs/sources/installation/windows.rst b/docs/sources/installation/windows.rst index 2c3a2cd722..65a4a35b32 100644 --- a/docs/sources/installation/windows.rst +++ b/docs/sources/installation/windows.rst @@ -49,6 +49,8 @@ This should open a cmd prompt window. Alternatively, you can also use a Cygwin terminal, or Git Bash (or any other command line program you are usually using). The next steps would be the same. +.. _launch_ubuntu: + Launch an Ubuntu virtual server ------------------------------- @@ -168,3 +170,27 @@ You are now ready for the docker’s “hello world” example. Run All done! Now you can continue with the :ref:`hello_world` example. + +Troubleshooting +--------------- + +VM does not boot +```````````````` + +.. image:: images/win/ts_go_bios.JPG + +If you run into this error message "The VM failed to remain in the 'running' +state while attempting to boot", please check that your computer has virtualization +technology available and activated by going to the BIOS. Here's an example for an HP +computer (System configuration / Device configuration) + +.. image:: images/win/hp_bios_vm.JPG + + +Docker is not installed +``````````````````````` + +.. image:: images/win/ts_no_docker.JPG + +If you run into this error message "The program 'docker' is currently not installed", +try deleting the docker folder and restart from :ref:`launch_ubuntu` From cc18a9c650305a377150c67e5ed10f1e2f19b685 Mon Sep 17 00:00:00 2001 From: pysqz Date: Wed, 28 Aug 2013 03:14:21 +0800 Subject: [PATCH 76/78] Also reuse forwarding ports --- container.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/container.go b/container.go index 0fae60402c..ae96504a9f 100644 --- a/container.go +++ b/container.go @@ -801,10 +801,22 @@ func (container *Container) allocateNetwork() error { } } + var portSpecs []string + if !container.State.Ghost { + portSpecs = container.Config.PortSpecs + } else { + for backend, frontend := range container.NetworkSettings.PortMapping["Tcp"] { + portSpecs = append(portSpecs, fmt.Sprintf("%s:%s/tcp",frontend, backend)) + } + for backend, frontend := range container.NetworkSettings.PortMapping["Udp"] { + portSpecs = append(portSpecs, fmt.Sprintf("%s:%s/udp",frontend, backend)) + } + } + container.NetworkSettings.PortMapping = make(map[string]PortMapping) container.NetworkSettings.PortMapping["Tcp"] = make(PortMapping) container.NetworkSettings.PortMapping["Udp"] = make(PortMapping) - for _, spec := range container.Config.PortSpecs { + for _, spec := range portSpecs { nat, err := iface.AllocatePort(spec) if err != nil { iface.Release() From c627ff6e209ac1f660a49371d4f6bd710470aacb Mon Sep 17 00:00:00 2001 From: Andy Rothfusz Date: Tue, 27 Aug 2013 14:29:49 -0700 Subject: [PATCH 77/78] Fix #1684: Old Welcome is now Introduction. Working with Repos now follows Builder. Clean up some doc build errors. Removed old Manifesto. Tweaked layout javascript to allow direct link from first and last index elements. --- docs/sources/commandline/command/cp.rst | 7 +- docs/sources/concepts/images/lego_docker.jpg | Bin 198407 -> 0 bytes docs/sources/concepts/index.rst | 16 --- docs/sources/concepts/manifesto.rst | 129 ------------------ docs/sources/examples/mongodb.rst | 2 +- docs/sources/index.rst | 8 +- docs/sources/installation/ubuntulinux.rst | 4 +- docs/sources/installation/vagrant.rst | 4 +- docs/sources/installation/windows.rst | 4 +- .../images => static_files}/dockerlogo-h.png | Bin .../images => static_files}/dockerlogo-v.png | Bin docs/sources/toctree.rst | 5 +- docs/sources/use/builder.rst | 24 ++-- docs/sources/use/index.rst | 2 +- docs/sources/use/port_redirection.rst | 2 + docs/sources/use/workingwithrepository.rst | 70 ++++++---- docs/theme/docker/layout.html | 4 +- 17 files changed, 78 insertions(+), 203 deletions(-) delete mode 100644 docs/sources/concepts/images/lego_docker.jpg delete mode 100644 docs/sources/concepts/index.rst delete mode 100644 docs/sources/concepts/manifesto.rst rename docs/sources/{concepts/images => static_files}/dockerlogo-h.png (100%) rename docs/sources/{concepts/images => static_files}/dockerlogo-v.png (100%) diff --git a/docs/sources/commandline/command/cp.rst b/docs/sources/commandline/command/cp.rst index 14b5061ef7..ea84fa1f90 100644 --- a/docs/sources/commandline/command/cp.rst +++ b/docs/sources/commandline/command/cp.rst @@ -2,12 +2,13 @@ :description: Copy files/folders from the containers filesystem to the host path :keywords: cp, docker, container, documentation, copy -=========================================================== +============================================================================ ``cp`` -- Copy files/folders from the containers filesystem to the host path -=========================================================== +============================================================================ :: Usage: docker cp CONTAINER:RESOURCE HOSTPATH - Copy files/folders from the containers filesystem to the host path. Paths are relative to the root of the filesystem. + Copy files/folders from the containers filesystem to the host + path. Paths are relative to the root of the filesystem. diff --git a/docs/sources/concepts/images/lego_docker.jpg b/docs/sources/concepts/images/lego_docker.jpg deleted file mode 100644 index b3039a2cb5cefdd965f5fbc9d31a8676c245fcb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198407 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Ξ`&CqPdt~d8Ruz5 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⩔~s5TE`>2dx7? zQH}(gM>Y{@iX1$nUWEFhlr1Hl_eOnmL;@5?cz$_v6hO^pHmES8`Tw$S0bz#Qy&n~K zzCMxplPCDpef~!#aV^jYcd$RH9hZ+QZiLhT`cqnmbEI3jv!tehGaS>RuRC-2#?Aml zL|gLZUj1_C4e?fkm>6t43y7=pdjuzuXZMjC7_<7Q+P5 z^>_n>hx~g#;DTHzLkn=(Qq%r2^+bh=T#`44T z>kKccY>8>}uyd^1C)mL)kuQ(8*8Z$m+4tmvIFmX-+)>`UC=Y|oBJL~p?iRNCi(4KB z4FOXo6G8 z(p@f2JusDVdKGA}hivHNhv%6$`JXY{fg6&zzHaEx443vaOCQc{9S(C9 z?AfUUB%MLCi>3YEuaoG@hd!sv*exX2u81lKE|#pB#a4-caFlJCMc>1CPABeONw%<{ zfB-pJ=`o?PW%)0S1qD`7hjeBg`65KJH&@&RV2$@4 zlBmFt#{(Tv^peO`RfIKhIuN{LDg@9Z-<3y9;cMY8#e{e#CwoOfT;z`9;VD*{`7j|Z zoB;JEpSsHl_R?mQzOP__Oj%o$1A6UQY#G5Hd`w)YOh~EXlhAx**qt_4X;s*BPg5cy zZDuyeH`a0ndB-jlg(48VPsu@t&KExwO)!PT^5vH4@MM7+Lv^hRC=8YHL*=N$^J3!1 za?u93QyQWJ(GeGmusKkjgS4A^2{VtwoxT$nl3up7hNA|FA>m!5L4|zD>&eh`HFGO7 z)2|`IK)$wTK|wk$6^EfgAaf*a=433bTlJ)6Tpc;p6;2eX)!R$rLBPd^#~nHxzX%4H zV=0DC`OPsVM6N-ZA4rtblR4Rq1v52X|HLe&IfBXm&y`pa ze3yQBG>Gv_?p|Xjr9(1)QDhLnFf9|4w-(O~0G`6Z_M!Ky>5AStkulUw^~*2g$ICQj4YIKkB<7AWzJY6!a-r|*;Ed)x{%TjJx|mA zHS>sIYj?HIBfHWBIq(#mabri4tNZu;+0(m~G!1{K9RpZY;4{(@4|2u_7Vz!3P*dji`1@-jyj7fu0+1a;5l68sD`T zS=yHq1NPP2(JdLZ^3p0l9Iea5jB6nUSKGcY!Yv;a>dNaebojJg0=c>J+z!L^C-Z6&jYn`PD$yaXZHC+pAK~mJ-By-VBHP0?UmB%cRN0qkuwE(w7s63+e zj?4j_j@!>L%Nb#v40=N*=J^gvRA~yI!bls}+^sU7sm+K!Biz$IG9NXPd;dPY^D)%P z>nwxeP^?&`&695TzT!Ay-!hFVxJIAPZ)zpYsR}fx_FXsUnA$&5Sf#j4W{6f-sFo79 zUFVbZW>A_F(zRSwZ=~JA`81T)U-&~140!VkJmibs#aNJ`r7JX+N~)i>iEy3`M=F5h zO=Z;%zQW=qMj)(A4+2~U^NwFz85Q(&Wnb!h9d34W26ejI^u%mBQ}%i!CNzf}H{|&1 z>fY&I$BIV;H z^mUGYUkyOr=aKhupZ*D82xb=hhbZ!&$Nz(v;{H>3i)Z~1k7EKU_5!dSt1z2-PdoWO zQ`qAKB{&F*&CUJDkoe{JEt-5@{_BsbiL~=$&+L&sm@wYt7kj5^S$rQy&%az%ANZOK$#U%1I zYepw5)u+Q27M?)6jagu4JKh`Z-1Dh-W7M9a_scHU$AyPBd;)$cWteR@}q1eC{xc5i)FLR zAx*nR48fc3+iDUYw`rn-mIprIJ9)JH)V?5e-;Z{^)NM7t_b!pIg`!jXwcQy0BbdtF zvb}!cjCz?U%&0f9m26Y4dqorK!;a0bG4BIuZJgGX#SiK?KMhb7Rf~*=@Tn}iDmeI2 zH;s{^%JkdSck~5hF}TrMD~w7LPo1&V`nq2{LXX2+mJv9=cn^BVfF@jzBWGpgPZ^Yv z?v(N*IK$u_gb*DT#8R~9hXtJMPc&$4eaikq8AoY9qZkusL6<`rA&KNwWka~

|3Oo)A%#%`$#Pck*N2YtYl0b2^_9>&jg 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 (tag: ``latest``) -available on the `docker index`_: +available on the `docker index `_: .. code-block:: bash diff --git a/docs/sources/index.rst b/docs/sources/index.rst index 8dfffa718b..2800310e5e 100644 --- a/docs/sources/index.rst +++ b/docs/sources/index.rst @@ -1,11 +1,11 @@ -:title: Welcome to the Docker Documentation +:title: Docker Documentation :description: An overview of the Docker Documentation :keywords: containers, lxc, concepts, explanation -Welcome -======= +.. image:: static_files/dockerlogo-h.png -.. image:: concepts/images/dockerlogo-h.png +Introduction +------------ ``docker``, the Linux Container Runtime, runs Unix processes with strong guarantees of isolation across servers. Your software runs diff --git a/docs/sources/installation/ubuntulinux.rst b/docs/sources/installation/ubuntulinux.rst index 02bdd09718..4142a9c373 100644 --- a/docs/sources/installation/ubuntulinux.rst +++ b/docs/sources/installation/ubuntulinux.rst @@ -2,10 +2,10 @@ :description: Please note this project is currently under heavy development. It should not be used in production. :keywords: Docker, Docker documentation, requirements, virtualbox, vagrant, git, ssh, putty, cygwin, linux -.. _ubuntu_linux: - **These instructions have changed for 0.6. If you are upgrading from an earlier version, you will need to follow them again.** +.. _ubuntu_linux: + Ubuntu Linux ============ diff --git a/docs/sources/installation/vagrant.rst b/docs/sources/installation/vagrant.rst index d89e012543..568ec584ec 100644 --- a/docs/sources/installation/vagrant.rst +++ b/docs/sources/installation/vagrant.rst @@ -2,10 +2,10 @@ :description: This guide will setup a new virtualbox virtual machine with docker installed on your computer. :keywords: Docker, Docker documentation, virtualbox, vagrant, git, ssh, putty, cygwin -.. _install_using_vagrant: - **Vagrant installation is temporarily out of date, it will be updated for 0.6 soon.** +.. _install_using_vagrant: + Using Vagrant (Mac, Linux) ========================== diff --git a/docs/sources/installation/windows.rst b/docs/sources/installation/windows.rst index 2c3a2cd722..87e5045e54 100644 --- a/docs/sources/installation/windows.rst +++ b/docs/sources/installation/windows.rst @@ -2,10 +2,10 @@ :description: Docker's tutorial to run docker on Windows :keywords: Docker, Docker documentation, Windows, requirements, virtualbox, vagrant, git, ssh, putty, cygwin -.. _windows: - **Vagrant installation is temporarily out of date, it will be updated for 0.6 soon.** +.. _windows: + Using Vagrant (Windows) ======================= diff --git a/docs/sources/concepts/images/dockerlogo-h.png b/docs/sources/static_files/dockerlogo-h.png similarity index 100% rename from docs/sources/concepts/images/dockerlogo-h.png rename to docs/sources/static_files/dockerlogo-h.png diff --git a/docs/sources/concepts/images/dockerlogo-v.png b/docs/sources/static_files/dockerlogo-v.png similarity index 100% rename from docs/sources/concepts/images/dockerlogo-v.png rename to docs/sources/static_files/dockerlogo-v.png diff --git a/docs/sources/toctree.rst b/docs/sources/toctree.rst index 3c319863e2..647257a0dd 100644 --- a/docs/sources/toctree.rst +++ b/docs/sources/toctree.rst @@ -10,7 +10,7 @@ This documentation has the following resources: .. toctree:: :titlesonly: - concepts/index + Introduction installation/index use/index examples/index @@ -19,6 +19,3 @@ This documentation has the following resources: api/index terms/index faq - - - diff --git a/docs/sources/use/builder.rst b/docs/sources/use/builder.rst index cc85befe72..40ba57b76a 100644 --- a/docs/sources/use/builder.rst +++ b/docs/sources/use/builder.rst @@ -4,13 +4,13 @@ .. _dockerbuilder: -================== -Dockerfile Builder -================== +====================== +Dockerfiles for Images +====================== **Docker can act as a builder** and read instructions from a text -Dockerfile to automate the steps you would otherwise make manually to -create an image. Executing ``docker build`` will run your steps and +``Dockerfile`` to automate the steps you would otherwise take manually +to create an image. Executing ``docker build`` will run your steps and commit them along the way, giving you a final image. .. contents:: Table of Contents @@ -35,6 +35,8 @@ build succeeds: Docker will run your steps one-by-one, committing the result if necessary, before finally outputting the ID of your new image. +When you're done with your build, you're ready to look into :ref:`image_push`. + 2. Format ========= @@ -48,9 +50,9 @@ The Dockerfile format is quite simple: The Instruction is not case-sensitive, however convention is for them to be UPPERCASE in order to distinguish them from arguments more easily. -Docker evaluates the instructions in a Dockerfile in order. **The first -instruction must be `FROM`** in order to specify the base image from -which you are building. +Docker evaluates the instructions in a Dockerfile in order. **The +first instruction must be `FROM`** in order to specify the +:ref:`base_image_def` from which you are building. Docker will ignore **comment lines** *beginning* with ``#``. A comment marker anywhere in the rest of the line will be treated as an argument. @@ -68,7 +70,9 @@ building images. The ``FROM`` instruction sets the :ref:`base_image_def` for subsequent instructions. As such, a valid Dockerfile must have ``FROM`` as its -first instruction. +first instruction. The image can be any valid image -- it is +especially easy to start with an image from the +:ref:`using_public_repositories` ``FROM`` must be the first non-comment instruction in the ``Dockerfile``. @@ -160,7 +164,7 @@ override the default specified in CMD. The ``EXPOSE`` instruction sets ports to be publicly exposed when running the image. This is functionally equivalent to running ``docker commit -run '{"PortSpecs": ["", ""]}'`` outside the -builder. +builder. Take a look at :ref:`port_redirection` for more information. 3.6 ENV ------- diff --git a/docs/sources/use/index.rst b/docs/sources/use/index.rst index 2f74f60718..c5d4a5c697 100644 --- a/docs/sources/use/index.rst +++ b/docs/sources/use/index.rst @@ -13,8 +13,8 @@ Contents: :maxdepth: 1 basics + builder workingwithrepository port_redirection - builder puppet diff --git a/docs/sources/use/port_redirection.rst b/docs/sources/use/port_redirection.rst index e16a27c0eb..b19673af27 100644 --- a/docs/sources/use/port_redirection.rst +++ b/docs/sources/use/port_redirection.rst @@ -3,6 +3,8 @@ :keywords: Usage, basic port, docker, documentation, examples +.. _port_redirection: + Port redirection ================ diff --git a/docs/sources/use/workingwithrepository.rst b/docs/sources/use/workingwithrepository.rst index 1cb4c9aa90..cbb0e073bb 100644 --- a/docs/sources/use/workingwithrepository.rst +++ b/docs/sources/use/workingwithrepository.rst @@ -28,12 +28,18 @@ repositories. You can host your own Registry too! Docker acts as a client for these services via ``docker search, pull, login`` and ``push``. -Top-level, User, and Your Own Repositories ------------------------------------------- +.. _using_public_repositories: + +Public Repositories +------------------- There are two types of public repositories: *top-level* repositories which are controlled by the Docker team, and *user* repositories -created by individual contributors. +created by individual contributors. Anyone can read from these +repositories -- they really help people get started quickly! You could +also use :ref:`using_private_repositories` if you need to keep control +of who accesses your images, but we will only refer to public +repositories in these examples. * Top-level repositories can easily be recognized by **not** having a ``/`` (slash) in their name. These repositories can generally be @@ -46,28 +52,6 @@ created by individual contributors. * User images are not checked, it is therefore up to you whether or not you trust the creator of this image. -Right now (version 0.5), private repositories are only possible by -hosting `your own registry -`_. To push or pull to a -repository on your own registry, you must prefix the tag with the -address of the registry's host, like this: - -.. code-block:: bash - - # Tag to create a repository with the full registry location. - # The location (e.g. localhost.localdomain:5000) becomes - # a permanent part of the repository name - sudo docker tag 0u812deadbeef localhost.localdomain:5000/repo_name - - # Push the new repository to its home location on localhost - sudo docker push localhost.localdomain:5000/repo_name - -Once a repository has your registry's host name as part of the tag, -you can push and pull it like any other repository, but it will -**not** be searchable (or indexed at all) in the Central Index, and -there will be no user name checking performed. Your registry will -function completely independently from the Central Index. - Find public images available on the Central Index ------------------------------------------------- @@ -105,6 +89,7 @@ If your username does not exist it will prompt you to also enter a password and your e-mail address. It will then automatically log you in. +.. _container_commit: Committing a container to a named image --------------------------------------- @@ -117,16 +102,45 @@ your container to an image within your username namespace. # for example docker commit $CONTAINER_ID dhrp/kickassapp sudo docker commit / +.. _image_push: -Pushing a container to its repository -------------------------------------- +Pushing an image to its repository +---------------------------------- In order to push an image to its repository you need to have committed your container to a named image (see above) -Now you can commit this image to the repository +Now you can commit this image to the repository designated by its name +or tag. .. code-block:: bash # for example docker push dhrp/kickassapp sudo docker push / + +.. _using_private_repositories: + +Private Repositories +-------------------- + +Right now (version 0.5), private repositories are only possible by +hosting `your own registry +`_. To push or pull to a +repository on your own registry, you must prefix the tag with the +address of the registry's host, like this: + +.. code-block:: bash + + # Tag to create a repository with the full registry location. + # The location (e.g. localhost.localdomain:5000) becomes + # a permanent part of the repository name + sudo docker tag 0u812deadbeef localhost.localdomain:5000/repo_name + + # Push the new repository to its home location on localhost + sudo docker push localhost.localdomain:5000/repo_name + +Once a repository has your registry's host name as part of the tag, +you can push and pull it like any other repository, but it will +**not** be searchable (or indexed at all) in the Central Index, and +there will be no user name checking performed. Your registry will +function completely independently from the Central Index. diff --git a/docs/theme/docker/layout.html b/docs/theme/docker/layout.html index 2b7796628f..9b3f565637 100755 --- a/docs/theme/docker/layout.html +++ b/docs/theme/docker/layout.html @@ -212,7 +212,9 @@ } // attached handler on click - $('.sidebar > ul > li > a').not(':last').click(function(){ + // Do not attach to first element or last (intro, faq) so that + // first and last link directly instead of accordian + $('.sidebar > ul > li > a').not(':last').not(':first').click(function(){ var index = $.inArray(this.href, openmenus) From dffb72ca898ce44e19f148112c3f9b43c96e01da Mon Sep 17 00:00:00 2001 From: Andy Rothfusz Date: Tue, 27 Aug 2013 18:49:43 -0700 Subject: [PATCH 78/78] Fix #621: add new use/base images section. Include examples. --- docs/sources/use/baseimages.rst | 43 +++++++++++++++++++++++++++++++++ docs/sources/use/builder.rst | 4 +-- docs/sources/use/index.rst | 2 +- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 docs/sources/use/baseimages.rst diff --git a/docs/sources/use/baseimages.rst b/docs/sources/use/baseimages.rst new file mode 100644 index 0000000000..6c8d4fbe2c --- /dev/null +++ b/docs/sources/use/baseimages.rst @@ -0,0 +1,43 @@ +:title: Base Image Creation +:description: How to create base images +:keywords: Examples, Usage, base image, docker, documentation, examples + +.. _base_image_creation: + +Base Image Creation +=================== + +So you want to create your own :ref:`base_image_def`? Great! + +The specific process will depend heavily on the Linux distribution you +want to package. We have some examples below, and you are encouraged +to submit pull requests to contribute new ones. + +Getting Started +............... + +In general, you'll want to start with a working machine that is +running the distribution you'd like to package as a base image, though +that is not required for some tools like Debian's `Debootstrap +`_, which you can also use to +build Ubuntu images. + +It can be as simple as this to create an Ubuntu base image:: + + $ sudo debootstrap raring raring > /dev/null + $ sudo tar -C raring -c . | sudo docker import - raring + a29c15f1bf7a + $ sudo docker run raring cat /etc/lsb-release + DISTRIB_ID=Ubuntu + DISTRIB_RELEASE=13.04 + DISTRIB_CODENAME=raring + DISTRIB_DESCRIPTION="Ubuntu 13.04" + +There are more example scripts for creating base images in the +Docker Github Repo: + +* `BusyBox `_ +* `CentOS + `_ +* `Debian + `_ diff --git a/docs/sources/use/builder.rst b/docs/sources/use/builder.rst index 40ba57b76a..7a985e766b 100644 --- a/docs/sources/use/builder.rst +++ b/docs/sources/use/builder.rst @@ -71,8 +71,8 @@ building images. The ``FROM`` instruction sets the :ref:`base_image_def` for subsequent instructions. As such, a valid Dockerfile must have ``FROM`` as its first instruction. The image can be any valid image -- it is -especially easy to start with an image from the -:ref:`using_public_repositories` +especially easy to start by **pulling an image** from the +:ref:`using_public_repositories`. ``FROM`` must be the first non-comment instruction in the ``Dockerfile``. diff --git a/docs/sources/use/index.rst b/docs/sources/use/index.rst index c5d4a5c697..d0a40159e9 100644 --- a/docs/sources/use/index.rst +++ b/docs/sources/use/index.rst @@ -15,6 +15,6 @@ Contents: basics builder workingwithrepository + baseimages port_redirection puppet -