From 61648af5ac8bc6412b91acfe50e792136431c9e7 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Thu, 16 May 2013 12:29:16 -0700 Subject: [PATCH 1/4] - Registry: Fix issue preventing to pull specific tag Upstream-commit: f498dd2a2b5128eca47517923d7e84238db0483c Component: engine --- components/engine/server.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/components/engine/server.go b/components/engine/server.go index 2f45802ca6..dafa44ec84 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -340,13 +340,24 @@ func (srv *Server) pullRepository(stdout io.Writer, remote, askedTag string) err if err != nil { return err } - for tag, id := range tagsList { - repoData.ImgList[id].Tag = tag + utils.Debugf("Registering tags") + // If not specific tag have been asked, take all + if askedTag == "" { + for tag, id := range tagsList { + repoData.ImgList[id].Tag = tag + } + } else { + // Otherwise, check that the tag exists and use only that one + if id, exists := tagsList[askedTag]; !exists { + return fmt.Errorf("Tag %s not found in repositoy %s", askedTag, remote) + } else { + repoData.ImgList[id].Tag = askedTag + } } for _, img := range repoData.ImgList { - // If we asked for a specific tag, skip all tags expect the wanted one - if askedTag != "" && askedTag != img.Tag { + if askedTag != "" && img.Tag != askedTag { + utils.Debugf("%s does not match %s, skipping", img.Tag, askedTag) continue } fmt.Fprintf(stdout, "Pulling image %s (%s) from %s\n", img.Id, img.Tag, remote) @@ -367,6 +378,10 @@ func (srv *Server) pullRepository(stdout io.Writer, remote, askedTag string) err return fmt.Errorf("Could not find repository on any of the indexed registries.") } } + // If we asked for a specific tag, do not register the others + if askedTag != "" { + return nil + } for tag, id := range tagsList { if err := srv.runtime.repositories.Set(remote, tag, id, true); err != nil { return err From b8a2af00ca4d765765fafb894018e3a1a331f967 Mon Sep 17 00:00:00 2001 From: Gareth Rushgrove Date: Fri, 17 May 2013 17:08:37 +0100 Subject: [PATCH 2/4] add instructions for using docker with puppet Upstream-commit: 55dd0afb5dd365bd306f698f9ccca1425e5c91a7 Component: engine --- components/engine/docs/sources/use/index.rst | 1 + components/engine/docs/sources/use/puppet.rst | 109 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 components/engine/docs/sources/use/puppet.rst diff --git a/components/engine/docs/sources/use/index.rst b/components/engine/docs/sources/use/index.rst index d3b3a31b18..9939dc7ea8 100644 --- a/components/engine/docs/sources/use/index.rst +++ b/components/engine/docs/sources/use/index.rst @@ -15,4 +15,5 @@ Contents: basics workingwithrepository builder + puppet diff --git a/components/engine/docs/sources/use/puppet.rst b/components/engine/docs/sources/use/puppet.rst new file mode 100644 index 0000000000..af2d5c8d57 --- /dev/null +++ b/components/engine/docs/sources/use/puppet.rst @@ -0,0 +1,109 @@ + +.. _install_using_puppet: + +Using Puppet +============= + +.. note:: + + Please note this is a community contributed installation path. The only 'official' installation is using the + :ref:`ubuntu_linux` installation path. This version may sometimes be out of date. + +Requirements +------------ + +To use this guide you'll need a working installation of Puppet from `Puppetlabs `_ . + +The module also currently uses the official PPA so only works with Ubuntu. + +Installation +------------ + +The module is available on the `Puppet Forge `_ +and can be installed using the built-in module tool. + + .. code-block:: bash + + puppet module install garethr/docker + +It can also be found on `GitHub `_ +if you would rather download the source. + +Usage +----- + +The module provides a puppet class for installing docker and two defined types +for managing images and containers. + +Installation +~~~~~~~~~~~~ + + .. code-block:: ruby + + include 'docker' + +Images +~~~~~~ + +The next step is probably to install a docker image, for this we have a +defined type which can be used like so: + + .. code-block:: ruby + + docker::image { 'base': } + +This is equivalent to running: + + .. code-block:: bash + + docker pull base + +Note that it will only if the image of that name does not already exist. +This is downloading a large binary so on first run can take a while. +For that reason this define turns off the default 5 minute timeout +for exec. Note that you can also remove images you no longer need with: + + .. code-block:: ruby + + docker::image { 'base': + ensure => 'absent', + } + +Containers +~~~~~~~~~~ + +Now you have an image you can run commands within a container managed by +docker. + + .. code-block:: ruby + + docker::run { 'helloworld': + image => 'base', + command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"', + } + +This is equivalent to running the following command, but under upstart: + + .. code-block:: bash + + docker run -d base /bin/sh -c "while true; do echo hello world; sleep 1; done" + +Run also contains a number of optional parameters: + + .. code-block:: ruby + + docker::run { 'helloworld': + image => 'base', + command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"', + ports => ['4444', '4555'], + volumes => ['/var/lib/counchdb', '/var/log'], + volumes_from => '6446ea52fbc9', + memory_limit => 10485760, # bytes + username => 'example', + hostname => 'example.com', + env => ['FOO=BAR', 'FOO2=BAR2'], + dns => ['8.8.8.8', '8.8.4.4'], + } + +Note that ports, env, dns and volumes can be set with either a single string +or as above with an array of values. From 6a0c3bd9abf2cf1a3d250b8768770c5ea737ea94 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 17 May 2013 17:09:09 +0000 Subject: [PATCH 3/4] fixed insert Upstream-commit: 3703a654056b4af7acbb09dc4d02bd184c7307c5 Component: engine --- components/engine/api_test.go | 80 +++++++++++++++++++++++++++++++++-- components/engine/commands.go | 2 +- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/components/engine/api_test.go b/components/engine/api_test.go index 07ecc6d0bf..f77d39e3cc 100644 --- a/components/engine/api_test.go +++ b/components/engine/api_test.go @@ -694,10 +694,82 @@ func TestPostImagesCreate(t *testing.T) { // }) } -// func TestPostImagesInsert(t *testing.T) { -// //FIXME: Implement this test (or remove this endpoint) -// t.Log("Test not implemented") -// } +func TestPostImagesInsert(t *testing.T) { + // runtime, err := newTestRuntime() + // if err != nil { + // t.Fatal(err) + // } + // defer nuke(runtime) + + // srv := &Server{runtime: runtime} + + // stdin, stdinPipe := io.Pipe() + // stdout, stdoutPipe := io.Pipe() + + // // Attach to it + // c1 := make(chan struct{}) + // go func() { + // defer close(c1) + // r := &hijackTester{ + // ResponseRecorder: httptest.NewRecorder(), + // in: stdin, + // out: stdoutPipe, + // } + + // req, err := http.NewRequest("POST", "/images/"+unitTestImageName+"/insert?path=%2Ftest&url=https%3A%2F%2Fraw.github.com%2Fdotcloud%2Fdocker%2Fmaster%2FREADME.md", bytes.NewReader([]byte{})) + // if err != nil { + // t.Fatal(err) + // } + // if err := postContainersCreate(srv, r, req, nil); err != nil { + // t.Fatal(err) + // } + // }() + + // // Acknowledge hijack + // setTimeout(t, "hijack acknowledge timed out", 5*time.Second, func() { + // stdout.Read([]byte{}) + // stdout.Read(make([]byte, 4096)) + // }) + + // id := "" + // setTimeout(t, "Waiting for imagesInsert output", 10*time.Second, func() { + // for { + // reader := bufio.NewReader(stdout) + // id, err = reader.ReadString('\n') + // if err != nil { + // t.Fatal(err) + // } + // } + // }) + + // // Close pipes (client disconnects) + // if err := closeWrap(stdin, stdinPipe, stdout, stdoutPipe); err != nil { + // t.Fatal(err) + // } + + // // Wait for attach to finish, the client disconnected, therefore, Attach finished his job + // setTimeout(t, "Waiting for CmdAttach timed out", 2*time.Second, func() { + // <-c1 + // }) + + // img, err := srv.runtime.repositories.LookupImage(id) + // if err != nil { + // t.Fatalf("New image %s expected but not found", id) + // } + + // layer, err := img.layer() + // if err != nil { + // t.Fatal(err) + // } + + // if _, err := os.Stat(path.Join(layer, "test")); err != nil { + // t.Fatalf("The test file has not been found") + // } + + // if err := srv.runtime.graph.Delete(img.Id); err != nil { + // t.Fatal(err) + // } +} func TestPostImagesPush(t *testing.T) { //FIXME: Use staging in order to perform tests diff --git a/components/engine/commands.go b/components/engine/commands.go index 8734da176f..33ba8125de 100644 --- a/components/engine/commands.go +++ b/components/engine/commands.go @@ -104,7 +104,7 @@ func (cli *DockerCli) CmdInsert(args ...string) error { v.Set("url", cmd.Arg(1)) v.Set("path", cmd.Arg(2)) - err := cli.hijack("POST", "/images/"+cmd.Arg(0)+"?"+v.Encode(), false) + err := cli.hijack("POST", "/images/"+cmd.Arg(0)+"/insert?"+v.Encode(), false) if err != nil { return err } From b4d01cb61ae7b31aaafeff34e21f1acbbbb3592c Mon Sep 17 00:00:00 2001 From: Thatcher Peskens Date: Fri, 17 May 2013 19:35:46 -0700 Subject: [PATCH 4/4] Added a "we are hiring" to the frontpage of the docker website, and fixed two broken links in the docs. Upstream-commit: 537cce16f2776d076c58b80e9af7e9914e5dac74 Component: engine --- components/engine/docs/Makefile | 9 ++------- .../engine/docs/sources/api/registry_api.rst | 6 +++--- .../docs/sources/examples/python_web_app.rst | 4 ++-- components/engine/docs/sources/faq.rst | 6 +++--- .../theme/docker/static/img/hiring_graphic.png | Bin 0 -> 6954 bytes components/engine/docs/website/index.html | 16 ++++++++++++++++ 6 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 components/engine/docs/theme/docker/static/img/hiring_graphic.png diff --git a/components/engine/docs/Makefile b/components/engine/docs/Makefile index 47ecd9ca89..26168b6f38 100644 --- a/components/engine/docs/Makefile +++ b/components/engine/docs/Makefile @@ -59,18 +59,13 @@ site: connect: @echo connecting dotcloud to www.docker.io website, make sure to use user 1 @cd _build/website/ ; \ - dotcloud list ; \ - dotcloud connect dockerwebsite + dotcloud connect dockerwebsite ; + dotcloud list push: @cd _build/website/ ; \ dotcloud push -github-deploy: docs - rm -fr github-deploy - git clone ssh://git@github.com/dotcloud/docker github-deploy - cd github-deploy && git checkout -f gh-pages && git rm -r * && rsync -avH ../_build/html/ ./ && touch .nojekyll && echo "docker.io" > CNAME && git add * && git commit -m "Updating docs" - $(VERSIONS): @echo "Hello world" diff --git a/components/engine/docs/sources/api/registry_api.rst b/components/engine/docs/sources/api/registry_api.rst index 35e1971213..e299584e17 100644 --- a/components/engine/docs/sources/api/registry_api.rst +++ b/components/engine/docs/sources/api/registry_api.rst @@ -85,7 +85,7 @@ On top of being a runtime for LXC, Docker is the Registry client. It supports: 5. Index returns true/false lettings registry know if it should proceed or error out 6. Get the payload for all layers -It’s possible to run docker pull https:///repositories/samalba/busybox. In this case, docker bypasses the Index. However the security is not guaranteed (in case Registry A is corrupted) because there won’t be any checksum checks. +It’s possible to run docker pull \https:///repositories/samalba/busybox. In this case, docker bypasses the Index. However the security is not guaranteed (in case Registry A is corrupted) because there won’t be any checksum checks. Currently registry redirects to s3 urls for downloads, going forward all downloads need to be streamed through the registry. The Registry will then abstract the calls to S3 by a top-level class which implements sub-classes for S3 and local storage. @@ -245,8 +245,8 @@ API (pushing repos foo/bar): The Index has two main purposes (along with its fancy social features): - Resolve short names (to avoid passing absolute URLs all the time) - - username/projectname -> https://registry.docker.io/users//repositories// - - team/projectname -> https://registry.docker.io/team//repositories// + - username/projectname -> \https://registry.docker.io/users//repositories// + - team/projectname -> \https://registry.docker.io/team//repositories// - Authenticate a user as a repos owner (for a central referenced repository) 3.1 Without an Index diff --git a/components/engine/docs/sources/examples/python_web_app.rst b/components/engine/docs/sources/examples/python_web_app.rst index 33caa52c1e..992a09dc42 100644 --- a/components/engine/docs/sources/examples/python_web_app.rst +++ b/components/engine/docs/sources/examples/python_web_app.rst @@ -58,7 +58,7 @@ Use the new image we just created and create a new container with network port 5 .. code-block:: bash docker logs $WEB_WORKER - * Running on http://0.0.0.0:5000/ + * Running on \http://0.0.0.0:5000/ view the logs for the new container using the WEB_WORKER variable, and if everything worked as planned you should see the line "Running on http://0.0.0.0:5000/" in the log output. @@ -70,7 +70,7 @@ lookup the public-facing port which is NAT-ed store the private port used by the .. code-block:: bash - curl http://`hostname`:$WEB_PORT + curl \http://`hostname`:$WEB_PORT Hello world! access the web app using curl. If everything worked as planned you should see the line "Hello world!" inside of your console. diff --git a/components/engine/docs/sources/faq.rst b/components/engine/docs/sources/faq.rst index 51fc00b306..b96ed06437 100644 --- a/components/engine/docs/sources/faq.rst +++ b/components/engine/docs/sources/faq.rst @@ -15,7 +15,7 @@ Most frequently asked questions. 3. **Does Docker run on Mac OS X or Windows?** - Not at this time, Docker currently only runs on Linux, but you can use VirtualBox to run Docker in a virtual machine on your box, and get the best of both worlds. Check out the MacOSX_ and Windows_ intallation guides. + Not at this time, Docker currently only runs on Linux, but you can use VirtualBox to run Docker in a virtual machine on your box, and get the best of both worlds. Check out the MacOSX_ and Windows_ installation guides. 4. **How do containers compare to virtual machines?** @@ -35,8 +35,8 @@ Most frequently asked questions. * `Ask questions on Stackoverflow`_ * `Join the conversation on Twitter`_ - .. _Windows: ../documentation/installation/windows.html - .. _MacOSX: ../documentation/installation/macos.html + .. _Windows: ../installation/windows/ + .. _MacOSX: ../installation/vagrant/ .. _the repo: http://www.github.com/dotcloud/docker .. _IRC\: docker on freenode: irc://chat.freenode.net#docker .. _Github: http://www.github.com/dotcloud/docker diff --git a/components/engine/docs/theme/docker/static/img/hiring_graphic.png b/components/engine/docs/theme/docker/static/img/hiring_graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a6b996440f5366e5bde53f392b0759e87abe17 GIT binary patch literal 6954 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 literal 0 HcmV?d00001 diff --git a/components/engine/docs/website/index.html b/components/engine/docs/website/index.html index 777f6b698f..2dad365ce4 100644 --- a/components/engine/docs/website/index.html +++ b/components/engine/docs/website/index.html @@ -127,6 +127,22 @@

Repeatability

Because each container is isolated in its own filesystem, they behave the same regardless of where, when, and alongside what they run.

+
+
+
+ +
+
+

Do you think it is cool to hack on docker? Join us!

+
    +
  • Work on open source
  • +
  • Program in Go
  • +
+ read more +
+
+ +