瀏覽代碼

Fixed remaining issues and conflicts created by last merge.

Thatcher Peskens 12 年之前
父節點
當前提交
1ddca1948b

+ 77 - 0
CHANGELOG.md

@@ -0,0 +1,77 @@
+# Changelog
+
+## 0.1.8 (2013-04-22)
+ - Dynamically detect cgroup capabilities
+ - Issue stability warning on kernels <3.8
+ - 'docker push' buffers on disk instead of memory
+ - Fix 'docker diff' for removed files
+ - Fix 'docker stop' for ghost containers 
+ - Fix handling of pidfile
+ - Various bugfixes and stability improvements
+
+## 0.1.7 (2013-04-18)
+ - Container ports are available on localhost
+ - 'docker ps' shows allocated TCP ports
+ - Contributors can run 'make hack' to start a continuous integration VM
+ - Streamline ubuntu packaging & uploading
+ - Various bugfixes and stability improvements
+
+## 0.1.6 (2013-04-17)
+ - Record the author an image with 'docker commit -author'
+
+## 0.1.5 (2013-04-17)
+ - Disable standalone mode
+ - Use a custom DNS resolver with 'docker -d -dns'
+ - Detect ghost containers
+ - Improve diagnosis of missing system capabilities
+ - Allow disabling memory limits at compile time
+ - Add debian packaging
+ - Documentation: installing on Arch Linux 
+ - Documentation: running Redis on docker
+ - Fixed lxc 0.9 compatibility
+ - Automatically load aufs module
+ - Various bugfixes and stability improvements
+
+## 0.1.4 (2013-04-09)
+ - Full support for TTY emulation
+ - Detach from a TTY session with the escape sequence `C-p C-q`
+ - Various bugfixes and stability improvements
+ - Minor UI improvements
+ - Automatically create our own bridge interface 'docker0'
+
+## 0.1.3 (2013-04-04)
+ - Choose TCP frontend port with '-p :PORT'
+ - Layer format is versioned
+ - Major reliability improvements to the process manager
+ - Various bugfixes and stability improvements
+
+## 0.1.2 (2013-04-03)
+ - Set container hostname with 'docker run -h'
+ - Selective attach at run with 'docker run -a [stdin[,stdout[,stderr]]]'
+ - Various bugfixes and stability improvements
+ - UI polish
+ - Progress bar on push/pull
+ - Use XZ compression by default
+ - Make IP allocator lazy
+
+## 0.1.1 (2013-03-31)
+ - Display shorthand IDs for convenience
+ - Stabilize process management
+ - Layers can include a commit message
+ - Simplified 'docker attach'
+ - Fixed support for re-attaching
+ - Various bugfixes and stability improvements
+ - Auto-download at run
+ - Auto-login on push
+ - Beefed up documentation
+
+## 0.1.0 (2013-03-23)
+ - First release
+ - Implement registry in order to push/pull images
+ - TCP port allocation
+ - Fix termcaps on Linux
+ - Add documentation
+ - Add Vagrant support with Vagrantfile
+ - Add unit tests
+ - Add repository/tags to ease image management
+ - Improve the layer implementation

+ 5 - 1
commands.go

@@ -18,7 +18,7 @@ import (
 	"unicode"
 )
 
-const VERSION = "0.1.7"
+const VERSION = "0.1.8"
 
 var (
 	GIT_COMMIT string
@@ -836,6 +836,10 @@ func (srv *Server) CmdAttach(stdin io.ReadCloser, stdout rcli.DockerConn, args .
 		return fmt.Errorf("No such container: %s", name)
 	}
 
+	if container.State.Ghost {
+		return fmt.Errorf("Impossible to attach to a ghost container")
+	}
+
 	if container.Config.Tty {
 		stdout.SetOptionRawTerminal()
 	}

+ 34 - 11
container.go

@@ -530,16 +530,42 @@ func (container *Container) releaseNetwork() {
 	container.NetworkSettings = &NetworkSettings{}
 }
 
+// FIXME: replace this with a control socket within docker-init
+func (container *Container) waitLxc() error {
+	for {
+		if output, err := exec.Command("lxc-info", "-n", container.Id).CombinedOutput(); err != nil {
+			return err
+		} else {
+			if !strings.Contains(string(output), "RUNNING") {
+				return nil
+			}
+		}
+		time.Sleep(500 * time.Millisecond)
+	}
+	return nil
+}
+
 func (container *Container) monitor() {
 	// Wait for the program to exit
 	Debugf("Waiting for process")
-	if err := container.cmd.Wait(); err != nil {
-		// Discard the error as any signals or non 0 returns will generate an error
-		Debugf("%s: Process: %s", container.Id, err)
+
+	// If the command does not exists, try to wait via lxc
+	if container.cmd == nil {
+		if err := container.waitLxc(); err != nil {
+			Debugf("%s: Process: %s", container.Id, err)
+		}
+	} else {
+		if err := container.cmd.Wait(); err != nil {
+			// Discard the error as any signals or non 0 returns will generate an error
+			Debugf("%s: Process: %s", container.Id, err)
+		}
 	}
 	Debugf("Process finished")
 
-	exitCode := container.cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
+	var exitCode int = -1
+	if container.cmd != nil {
+		exitCode = container.cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
+	}
 
 	// Cleanup
 	container.releaseNetwork()
@@ -588,7 +614,7 @@ func (container *Container) monitor() {
 }
 
 func (container *Container) kill() error {
-	if !container.State.Running || container.cmd == nil {
+	if !container.State.Running {
 		return nil
 	}
 
@@ -600,6 +626,9 @@ func (container *Container) kill() error {
 
 	// 2. Wait for the process to die, in last resort, try to kill the process directly
 	if err := container.WaitTimeout(10 * time.Second); err != nil {
+		if container.cmd == nil {
+			return fmt.Errorf("lxc-kill failed, impossible to kill the container %s", container.Id)
+		}
 		log.Printf("Container %s failed to exit within 10 seconds of lxc SIGKILL - trying direct SIGKILL", container.Id)
 		if err := container.cmd.Process.Kill(); err != nil {
 			return err
@@ -617,9 +646,6 @@ func (container *Container) Kill() error {
 	if !container.State.Running {
 		return nil
 	}
-	if container.State.Ghost {
-		return fmt.Errorf("Can't kill ghost container")
-	}
 	return container.kill()
 }
 
@@ -629,9 +655,6 @@ func (container *Container) Stop(seconds int) error {
 	if !container.State.Running {
 		return nil
 	}
-	if container.State.Ghost {
-		return fmt.Errorf("Can't stop ghost container")
-	}
 
 	// 1. Send a SIGTERM
 	if output, err := exec.Command("lxc-kill", "-n", container.Id, "15").CombinedOutput(); err != nil {

+ 1 - 1
docs/sources/concepts/buildingblocks.rst

@@ -10,7 +10,7 @@ Building blocks
 
 Images
 ------
-An original container image. These are stored on disk and are comparable with what you normally expect from a stoppped virtual machine image. Images are stored (and retrieved from) repository
+An original container image. These are stored on disk and are comparable with what you normally expect from a stopped virtual machine image. Images are stored (and retrieved from) repository
 
 Images are stored on your local file system under /var/lib/docker/images
 

+ 1 - 1
docs/sources/examples/python_web_app.rst

@@ -49,7 +49,7 @@ Save the changed we just made in the container to a new image called "_/builds/g
     WEB_WORKER=$(docker run -d -p 5000 $BUILD_IMG /usr/local/bin/runapp)
 
 - **"docker run -d "** run a command in a new container. We pass "-d" so it runs as a daemon.
-  **"-p 5000"* the web app is going to listen on this port, so it must be mapped from the container to the host system.
+- **"-p 5000"** the web app is going to listen on this port, so it must be mapped from the container to the host system.
 - **"$BUILD_IMG"** is the image we want to run the command inside of.
 - **/usr/local/bin/runapp** is the command which starts the web app.
 

+ 14 - 16
docs/sources/gettingstarted/index.html

@@ -71,40 +71,38 @@
                 <h2>
                     <a name="installing-on-ubuntu-1204-and-1210" class="anchor" href="#installing-on-ubuntu-1204-and-1210"><span class="mini-icon mini-icon-link"></span>
                     </a>Installing on Ubuntu</h2>
-                    <strong>Requirements</strong>
+
+                    <p><strong>Requirements</strong></p>
                     <ul>
-                        <li>Ubuntu 12.04 (LTS) or Ubuntu 12.10</li>
-                        <li><strong>64-bit Operating system</strong></li>
+                        <li>Ubuntu 12.04 (LTS) (64-bit)</li>
+                        <li> or Ubuntu 12.10 (quantal) (64-bit)</li>
                     </ul>
                 <ol>
                     <li>
-                        <p>Add the Ubuntu PPA (Personal Package Archive) sources to your apt sources list. Copy and
-                            paste the following lines at once.</p>
+                    <p><strong>Install dependencies</strong></p>
+                    The linux-image-extra package is only needed on standard Ubuntu EC2 AMIs in order to install the aufs kernel module.
+                    <pre>sudo apt-get install linux-image-extra-`uname -r`</pre>
 
-                        <div class="highlight">
-                            <pre>sudo sh -c "echo 'deb http://ppa.launchpad.net/dotcloud/lxc-docker/ubuntu precise main' >> /etc/apt/sources.list"</pre>
 
                     </li>
                     <li>
-                        <p>Update your sources. You will see a warning that GPG signatures cannot be verified.</p>
-
+                        <p><strong>Install Docker</strong></p>
+                        <p>Add the Ubuntu PPA (Personal Package Archive) sources to your apt sources list, update and install.</p>
+                        <p>You may see some warnings that the GPG keys cannot be verified.</p>
                         <div class="highlight">
+                            <pre>sudo sh -c "echo 'deb http://ppa.launchpad.net/dotcloud/lxc-docker/ubuntu precise main' >> /etc/apt/sources.list"</pre>
                             <pre>sudo apt-get update</pre>
-                        </div>
-                    </li>
-                    <li>
-                        <p>Now install it, you will see another warning that the package cannot be authenticated. Confirm install.</p>
-
-                        <div class="highlight">
                             <pre>sudo apt-get install lxc-docker</pre>
                         </div>
+
+
                     </li>
 
                     <li>
                         <p><strong>Run!</strong></p>
 
                         <div class="highlight">
-                            <pre>docker</pre>
+                            <pre>docker run -i -t ubuntu /bin/bash</pre>
                         </div>
                     </li>
                     Continue with the <a href="http://docs.docker.io/en/latest/examples/hello_world/">Hello world</a> example.

+ 1 - 3
docs/sources/installation/archlinux.rst

@@ -44,6 +44,7 @@ new kernel will be compiled and this can take quite a while.
 
     yaourt -S lxc-docker-git
 
+
 Starting Docker
 ---------------
 
@@ -56,10 +57,7 @@ There is a systemd service unit created for docker.  To start the docker service
 
     sudo systemctl start docker
 
-<<<<<<< HEAD
 
-=======
->>>>>>> dotcloud/master
 To start on system boot:
 
 ::

+ 17 - 20
docs/sources/installation/binaries.rst

@@ -1,56 +1,53 @@
-.. _ubuntu_linux:
+.. _binaries:
 
-Ubuntu Linux
-============
+Binaries
+========
 
   **Please note this project is currently under heavy development. It should not be used in production.**
 
 
-
-Installing on Ubuntu 12.04 and 12.10
-
 Right now, the officially supported distributions are:
 
-Ubuntu 12.04 (precise LTS)
-Ubuntu 12.10 (quantal)
-Docker probably works on other distributions featuring a recent kernel, the AUFS patch, and up-to-date lxc. However this has not been tested.
+- Ubuntu 12.04 (precise LTS) (64-bit)
+- Ubuntu 12.10 (quantal) (64-bit)
+
 
 Install dependencies:
 ---------------------
 
 ::
 
-    sudo apt-get install lxc wget bsdtar curl
+    sudo apt-get install lxc bsdtar
     sudo apt-get install linux-image-extra-`uname -r`
 
 The linux-image-extra package is needed on standard Ubuntu EC2 AMIs in order to install the aufs kernel module.
 
-Install the latest docker binary:
+Install the docker binary:
 
 ::
 
-    wget http://get.docker.io/builds/$(uname -s)/$(uname -m)/docker-master.tgz
+    wget http://get.docker.io/builds/Linux/x86_64/docker-master.tgz
     tar -xf docker-master.tgz
+    sudo cp ./docker-master /usr/local/bin
 
-Run your first container!
+Note: docker currently only supports 64-bit Linux hosts.
 
-::
 
-    cd docker-master
+Run the docker daemon
+---------------------
 
 ::
 
-    sudo ./docker run -i -t base /bin/bash
+    sudo docker -d &
 
 
-To run docker as a daemon, in the background, and allow non-root users to run ``docker`` start
-docker -d
+Run your first container!
+-------------------------
 
 ::
 
-    sudo ./docker -d &
+    docker run -i -t ubuntu /bin/bash
 
 
-Consider adding docker to your PATH for simplicity.
 
 Continue with the :ref:`hello_world` example.

+ 1 - 0
docs/sources/installation/index.rst

@@ -13,6 +13,7 @@ Contents:
    :maxdepth: 1
 
    ubuntulinux
+   binaries
    archlinux
    vagrant
    windows

+ 0 - 66
docs/sources/installation/macos.rst

@@ -1,66 +0,0 @@
-
-Mac OS X and other linux
-========================
-
-  Please note this is a community contributed installation path. The only 'official' installation is using the :ref:`ubuntu_linux` installation path. This version
-  may be out of date because it depends on some binaries to be updated and published
-
-
-Requirements
-------------
-
-We currently rely on some Ubuntu-linux specific packages, this will change in the future, but for now we provide a
-streamlined path to install Virtualbox with a Ubuntu 12.10 image using Vagrant.
-
-1. Install virtualbox from https://www.virtualbox.org/ (or use your package manager)
-2. Install vagrant from http://www.vagrantup.com/ (or use your package manager)
-3. Install git if you had not installed it before, check if it is installed by running
-   ``git`` in a terminal window
-
-We recommend having at least about 2Gb of free disk space and 2Gb RAM (or more).
-
-Installation
-------------
-
-1. Fetch the docker sources
-
-.. code-block:: bash
-
-   git clone https://github.com/dotcloud/docker.git
-
-2. Run vagrant from the sources directory
-
-.. code-block:: bash
-
-    vagrant up
-
-Vagrant will:
-
-* Download the Quantal64 base ubuntu virtual machine image from get.docker.io/
-* Boot this image in virtualbox
-
-Then it will use Puppet to perform an initial setup in this machine:
-
-* Download & untar the most recent docker binary tarball to vagrant homedir.
-* Debootstrap to /var/lib/docker/images/ubuntu.
-* Install & run dockerd as service.
-* Put docker in /usr/local/bin.
-* Put latest Go toolchain in /usr/local/go.
-
-You now have a Ubuntu Virtual Machine running with docker pre-installed.
-
-To access the VM and use Docker, Run ``vagrant ssh`` from the same directory as where you ran
-``vagrant up``. Vagrant will make sure to connect you to the correct VM.
-
-.. code-block:: bash
-
-    vagrant ssh
-
-Now you are in the VM, run docker
-
-.. code-block:: bash
-
-    docker
-
-
-Continue with the :ref:`hello_world` example.

+ 20 - 6
docs/sources/installation/ubuntulinux.rst

@@ -6,17 +6,31 @@ Ubuntu Linux
   **Please note this project is currently under heavy development. It should not be used in production.**
 
 
-Docker is now available as a Ubuntu PPA (Personal Package Archive),
+Right now, the officially supported distributions are:
+
+- Ubuntu 12.04 (precise LTS) (64-bit)
+- Ubuntu 12.10 (quantal) (64-bit)
+
+Dependencies
+------------
+
+The linux-image-extra package is only needed on standard Ubuntu EC2 AMIs in order to install the aufs kernel module.
+
+.. code-block:: bash
+
+   sudo apt-get install linux-image-extra-`uname -r`
+
+
+Installation
+------------
+
+Docker is available as a Ubuntu PPA (Personal Package Archive),
 `hosted on launchpad  <https://launchpad.net/~dotcloud/+archive/lxc-docker>`_
 which makes installing Docker on Ubuntu very easy.
 
-**The Requirements**
-
-* Ubuntu 12.04 (LTS) or Ubuntu 12.10
-* **64-bit Operating system**
 
 
-Add the custom package sources to your apt sources list. Copy and paste both the following lines at once.
+Add the custom package sources to your apt sources list. Copy and paste the following lines at once.
 
 .. code-block:: bash
 

+ 22 - 15
docs/sources/installation/vagrant.rst

@@ -1,8 +1,8 @@
 
 .. _install_using_vagrant:
 
-Install using Vagrant
-=====================
+Using Vagrant
+=============
 
   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.
@@ -27,37 +27,44 @@ Spin it up
 
 1. Fetch the docker sources (this includes the Vagrantfile for machine setup).
 
-.. code-block:: bash
+   .. code-block:: bash
 
-   git clone https://github.com/dotcloud/docker.git
+      git clone https://github.com/dotcloud/docker.git
 
 2. Run vagrant from the sources directory
 
-.. code-block:: bash
+   .. code-block:: bash
+
+      vagrant up
 
-    vagrant up
+   Vagrant will:
 
-Vagrant will:
+   * Download the 'official' Precise64 base ubuntu virtual machine image from vagrantup.com
+   * Boot this image in virtualbox
+   * Add the `Docker PPA sources <https://launchpad.net/~dotcloud/+archive/lxc-docker>`_ to /etc/apt/sources.lst
+   * Update your sources
+   * Install lxc-docker
 
-* Download the 'official' Precise64 base ubuntu virtual machine image from vagrantup.com
-* Boot this image in virtualbox
-* Add the `Docker PPA sources <https://launchpad.net/~dotcloud/+archive/lxc-docker>`_ to /etc/apt/sources.lst
-* Update your sources
-* Install lxc-docker
+   You now have a Ubuntu Virtual Machine running with docker pre-installed.
 
-You now have a Ubuntu Virtual Machine running with docker pre-installed.
+Connect
+-------
 
 To access the VM and use Docker, Run ``vagrant ssh`` from the same directory as where you ran
 ``vagrant up``. Vagrant will connect you to the correct VM.
 
 .. code-block:: bash
 
-    vagrant ssh
+   vagrant ssh
+
+Run
+-----
 
 Now you are in the VM, run docker
 
 .. code-block:: bash
 
-    docker
+   docker
+
 
 Continue with the :ref:`hello_world` example.

+ 11 - 0
hack/dockerbuilder/Dockerfile

@@ -0,0 +1,11 @@
+# This will build a container capable of producing an official binary build of docker and
+# uploading it to S3
+from	ubuntu:12.10
+run	apt-get update
+run	RUNLEVEL=1 DEBIAN_FRONTEND=noninteractive apt-get install -y -q s3cmd
+run	RUNLEVEL=1 DEBIAN_FRONTEND=noninteractive apt-get install -y -q golang
+run	RUNLEVEL=1 DEBIAN_FRONTEND=noninteractive apt-get install -y -q git
+run	RUNLEVEL=1 DEBIAN_FRONTEND=noninteractive apt-get install -y -q build-essential
+copy	dockerbuilder	/usr/local/bin/dockerbuilder
+copy	s3cfg	/.s3cfg
+# run $img dockerbuilder $REVISION_OR_TAG $S3_ID $S3_KEY

+ 29 - 0
hack/dockerbuilder/dockerbuilder

@@ -0,0 +1,29 @@
+#!/bin/sh
+set -x
+set -e
+
+PACKAGE=github.com/dotcloud/docker
+
+if [ $# -lt 3 ]; then
+	echo "Usage: $0 REVISION AWS_ID AWS_KEY"
+	exit 1
+fi
+
+export REVISION=$1 AWS_ID=$2 AWS_KEY=$3
+
+
+export PATH=/usr/local/bin:$PATH
+
+mkdir -p /go/src/$PACKAGE
+git clone "https://$PACKAGE" /go/src/$PACKAGE
+cd /go/src/$PACKAGE
+git checkout $REVISION
+
+# FIXME: checkout to specific revision
+
+BUILDDIR=/tmp/docker-$REVISION
+mkdir -p $BUILDDIR
+(cd docker && go get && go build -o $BUILDDIR/docker)
+
+tar -f /tmp/docker.tgz -C $(dirname $BUILDDIR) -zc $(basename $BUILDDIR)
+s3cmd -P put /tmp/docker.tgz s3://get.docker.io/builds/$(uname -s)/$(uname -m)/docker-$REVISION.tgz

+ 3 - 0
hack/dockerbuilder/s3cfg

@@ -0,0 +1,3 @@
+[default]
+access_key = $AWS_ID
+secret_key = $AWS_KEY

+ 9 - 6
runtime.go

@@ -184,12 +184,6 @@ func (runtime *Runtime) Register(container *Container) error {
 		}
 	}
 
-	// If the container is not running or just has been flagged not running
-	// then close the wait lock chan (will be reset upon start)
-	if !container.State.Running {
-		close(container.waitLock)
-	}
-
 	// Even if not running, we init the lock (prevents races in start/stop/kill)
 	container.State.initLock()
 
@@ -207,6 +201,15 @@ func (runtime *Runtime) Register(container *Container) error {
 	// done
 	runtime.containers.PushBack(container)
 	runtime.idIndex.Add(container.Id)
+
+	// If the container is not running or just has been flagged not running
+	// then close the wait lock chan (will be reset upon start)
+	if !container.State.Running {
+		close(container.waitLock)
+	} else {
+		container.allocateNetwork()
+		go container.monitor()
+	}
 	return nil
 }
 

+ 1 - 1
runtime_test.go

@@ -273,7 +273,7 @@ func TestAllocatePortLocalhost(t *testing.T) {
 		t.Fatal(err)
 	}
 	defer container.Kill()
-	time.Sleep(300 * time.Millisecond) // Wait for the container to run
+	time.Sleep(600 * time.Millisecond) // Wait for the container to run
 	conn, err := net.Dial("tcp",
 		fmt.Sprintf(
 			"localhost:%s", container.NetworkSettings.PortMapping["5555"],

+ 1 - 1
utils.go

@@ -442,7 +442,7 @@ func FindCgroupMountpoint(cgroupType string) (string, error) {
 		return "", err
 	}
 
-	reg := regexp.MustCompile(`^cgroup on (.*) type cgroup \(.*` + cgroupType + `[,\)]`)
+	reg := regexp.MustCompile(`^.* on (.*) type cgroup \(.*` + cgroupType + `[,\)]`)
 	for _, line := range strings.Split(string(output), "\n") {
 		r := reg.FindStringSubmatch(line)
 		if len(r) == 2 {