Compare commits

...

120 Commits

Author SHA1 Message Date
Arnaud Porterie a8a31eff10 Bump to version v1.5.0
Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
2015-02-10 08:14:37 -08:00
Sven Dowideit 68a8fd5c4e updates from review
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-10 08:14:37 -08:00
unclejack 8387c5ab65 update kernel reqs doc; recommend updates on RHEL
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
2015-02-10 08:14:37 -08:00
Sven Dowideit 69498943c3 remove the text-indent and increase the font size
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-10 08:14:37 -08:00
Sven Dowideit 1aeb78c2ae Simplfy the sidebar html and css, and then allow the text to wrap
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-10 08:14:36 -08:00
Tibor Vass 331d37f35d Minor nits
Signed-off-by: Tibor Vass <tibor@docker.com>
2015-02-10 08:14:36 -08:00
Tibor Vass edf3bf7f33 Clarify docs review role
Signed-off-by: Tibor Vass <teabee89@gmail.com>
2015-02-10 08:14:36 -08:00
Tibor Vass 9ee8dca246 A few fixes
Signed-off-by: Tibor Vass <teabee89@gmail.com>
2015-02-10 08:14:36 -08:00
Tibor Vass aa98bb6c13 New pull request workflow
Signed-off-by: Tibor Vass <teabee89@gmail.com>
2015-02-10 08:14:36 -08:00
Zhang Wei 2aba3c69f9 docs: fix a typo in registry_mirror.md
Signed-off-by: Zhang Wei <zhangwei555@huawei.com>
2015-02-10 08:14:36 -08:00
Steve Koch 71a44c769e Add link to user guide to end of 14.04 section
Adding instructions to exit the test shell and a link to the user guide (as is done in the following sections for 12.04 and 13.04/10

Signed-off-by: Steven Koch <sjkoch@unm.edu>
2015-02-10 08:14:36 -08:00
Wei-Ting Kuo d8381fad2b Update certificates.md
`openssl req -new -x509 -text -key client.key -out client.cert` creates a self-sign certificate but not a certificate request.

Signed-off-by: Wei-Ting Kuo <waitingkuo0527@gmail.com>
2015-02-09 08:49:05 -08:00
Chen Hanxiao be379580d0 docs: fix a typo in Dockerfile.5.md
s/Mutliple/Multiple

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
2015-02-09 08:49:05 -08:00
Alexander Morozov 7ea8513479 Fix example about ps and linked containers
Signed-off-by: Alexander Morozov <lk4d4@docker.com>
2015-02-09 08:49:05 -08:00
Sven Dowideit 3b2fe01c78 Documentation on boolean flags is wrong #10517
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:05 -08:00
Sven Dowideit e8afc22b1f Do some major rearranging of the fedora/centos/rhel installation docs
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:05 -08:00
Lokesh Mandvekar 4e407e6b77 update fedora docs to reflect latest rpm changes
Signed-off-by: Lokesh Mandvekar <lsm5@fedoraproject.org>
2015-02-09 08:49:05 -08:00
unclejack 23f1c2ea9e docs/articles/systemd: correct --storage-driver
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
2015-02-09 08:49:05 -08:00
Katie McLaughlin 788047cafb Format awsconfig sample config correctly
Reflow change in commit 195f3a3f removed newlines in the config format.

This change reverts the sample config to the original formatting, which
matches the actual config format of a `awsconfig` file.

Signed-off-by: Katie McLaughlin <katie@glasnt.com>
2015-02-09 08:49:05 -08:00
Sven Dowideit 0c0e7b1b60 Fix a small spelling error in the dm.blkdiscard docs
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:05 -08:00
Sven Dowideit 09d41529a0 Add an initial list of new features in Docker Engine 1.5.0
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:04 -08:00
Sven Dowideit cb288fefee remove swarm, machine and compose from the 1.5.0 release docs
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:04 -08:00
Sven Dowideit f7636796c5 The DHE documentation will not be published with 1.5.0
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:04 -08:00
Sven Dowideit cb5af83444 For now, docker stats appears to be libcontainer only
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:04 -08:00
Mihai Borobocea 96feaf1920 docs: fix typo
There are 2 not 3 RUN instructions in the userguide's Dockerfile.

Signed-off-by: Mihai Borobocea <MihaiBorobocea@gmail.com>
2015-02-09 08:49:04 -08:00
Vincent Giersch 1f03944950 Documents build API "remote" parameter
Introduced in Docker v0.4.5 / Remove API v1.1 (#848), the remote
parameter of the API method POST /build allows to specify a buildable
remote URL (HTTPS, HTTP or Git).

Signed-off-by: Vincent Giersch <vincent.giersch@ovh.net>
2015-02-09 08:49:04 -08:00
Sven Dowideit 6060eedf9c The Hub build webhooks now list the images that have been built
And fix some spelling - repo isn't really a word :)

Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:04 -08:00
Sven Dowideit d217da854a Spelling mistake in dockerlinks
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:04 -08:00
Victor Vieux d74d6d981b add crosbymichael and Github -> GitHub
Signed-off-by: Victor Vieux <vieux@docker.com>
2015-02-09 08:49:04 -08:00
Victor Vieux 0205ac33d2 update MAINTAINERS file
Signed-off-by: Victor Vieux <vieux@docker.com>
2015-02-09 08:49:04 -08:00
Sven Dowideit dbb9d47bdc The reference menu is too big to list more than the latest API docs, so the others can be hidden - they're still linked from the API summary
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:03 -08:00
Sven Dowideit ddd1d081d7 use the same paths as in the swarm repo, so that their links magically work
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:03 -08:00
Sven Dowideit d6ac36d929 Docker attach documentation didn't make sense to me
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-09 08:49:03 -08:00
Michael A. Smith 715b94f664 Distinguish ENV from setting environment inline
It's ambiguous to say that `ENV` is _functionally equivalent to prefixing the command with `<key>=<value>`_. `ENV` sets the environment for all future commands, but `RUN` can take chained commands like `RUN foo=bar bash -c 'echo $foo' && bash -c 'echo $foo $bar'`. Users with a solid understanding of `exec` may grok this without confusion, but less experienced users may need this distinction.

Signed-off-by: Michael A. Smith <msmith3@ebay.com>

Improve Environment Handling Descriptions

- Link `ENV` and `Environment Replacement`
- Improve side-effects of `ENV` text
- Rearrange avoiding side effects text

Signed-off-by: Michael A. Smith <msmith3@ebay.com>
2015-02-09 08:49:03 -08:00
Chen Hanxiao 16baca9277 docs: change events --since to fit RFC3339Nano
PR6931 changed time format to RFC3339Nano.
But the example in cli.md does not changed.

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
2015-02-09 08:49:03 -08:00
J Bruni 627f8a6cd5 Remove File List
This list is outdated. It could be updated instead of removed... but why should it be maintained? I do not see a reason.

Signed-off-by: João Bruni <contato@jbruni.com.br>
2015-02-09 08:49:03 -08:00
Sebastiaan van Stijn a8a7df203a Fix broken link to project/MAINTAINERS.md
The link to project/MAINTAINERS.md was broken, in
addition, /MAINTAINERS containers more relevant
information on the LGTM process and contains info
about maintainers of all subsystems.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2015-02-09 08:49:03 -08:00
Thell 'Bo' Fowler 580cbcefd3 Update dockerfile_best-practices.md
Signed-off-by: Thell Fowler <Thell@tbfowler.name>
2015-02-09 08:49:03 -08:00
Yihang Ho d9c5ce6e97 Fix a tiny typo.
'saving', not 'saveing'

Signed-off-by: Yihang Ho <hoyihang5@gmail.com>
2015-02-09 08:49:03 -08:00
Bradley Cicenas 0fe9b95415 fix project url in readme to point to the correct location,
https://github.com/docker/docker/tree/master/project

Signed-off-by: Bradley Cicenas <bradley.cicenas@gmail.com>
2015-02-09 08:49:03 -08:00
Alexandr Morozov 41d0e4293e Update events format in man page
Signed-off-by: Alexandr Morozov <lk4d4@docker.com>
2015-02-09 08:49:03 -08:00
Doug Davis 26fe640da1 Add builder folks to the top-level maintainers file
Signed-off-by: Doug Davis <dug@us.ibm.com>
2015-02-09 08:49:02 -08:00
Jessica Frazelle 198ca26969 Added tianon's info and changed a typo.
Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jess@docker.com> (github: jfrazelle)
2015-02-09 08:49:02 -08:00
Phil Estes d5365f6fc4 Fix incorrect IPv6 addresses/subnet notations in docs
Fixes a few typos in IPv6 addresses. Will make it easier for users who
actually try and copy/paste or use the example addresses directly.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com> (github: estesp)
2015-02-09 08:49:02 -08:00
Brian Goff 5f7e814ee7 Update go-md2man
Update fixes some rendering issues, including improperly escaping '$' in
blocks, and actual parsing of blockcode.

`ID=$(sudo docker run -d fedora /usr/bin/top -b)` was being converted to
`ID=do docker run -d fedora/usr/bin/top -b)`

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2015-02-09 08:49:02 -08:00
Doug Davis a84aca0985 Fix docs so WORKDIR mentions it works for COPY and ADD too
The docs around COPY/ADD already mentioned that it will do a relative
copy/add based on WORKDIR, so that part is already ok.  Just needed to
tweak the WORKDIR section since w/o mentioning COPY/ADD it can be misleading.

Noticed by @phemmer

Signed-off-by: Doug Davis <dug@us.ibm.com>
2015-02-09 08:49:02 -08:00
Solomon Hykes 68ec22876a Proposal for an improved project structure.
Note: this deprecates the fine-grained, high-overlap cascading MAINTAINERS files,
and replaces them with a single top-level file, using a new structure:

* More coarse grained subsystems with dedicated teams of maintainers
* Core maintainers with a better-defined role and a wider scope (if it's
not in a subsystem, it's up to the core maintainers to figure it out)
* Architects
* Operators

This is work in progress, the goal is to start a conversation

Signed-off-by: Solomon Hykes <solomon@docker.com>
Signed-off-by: Erik Hollensbe <github@hollensbe.org>
Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
Signed-off-by: Tibor Vass <teabee89@gmail.com>
Signed-off-by: Victor Vieux <vieux@docker.com>
Signed-off-by: Vincent Batts <vbatts@redhat.com>
2015-02-09 08:49:02 -08:00
Josh Hawn 0dcc3559e9 Updated image spec docs to clarify image JSON
The title `Image JSON Schema` was used as a header in the section
which describes the layout and fields of the image metadata JSON
file. It was pointed out that `JSON Schema` is its own term for
describing JSON in a machine-and-human-readable format, while the
word "Schema" in this context was used more generically to say that
the section is meant to be an example and outline of the Image JSON.

http://spacetelescope.github.io/understanding-json-schema/

This section now has the title `Image JSON Description` in order
to not cause this confusion.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-02-09 08:49:02 -08:00
Derek McGowan d4c731ecd6 Limit push and pull to v2 official registry
No longer push to the official v2 registry when it is available. This allows pulling images from the v2 registry without defaulting push. Only pull official images from the v2 official registry.

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-02-04 10:05:16 -08:00
Arnaud Porterie 2dba4e1386 Fix client-side validation of Dockerfile path
Arguments to `filepath.Rel` were reversed, making all builder tests to
fail.

Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
2015-02-03 09:07:17 -08:00
Tibor Vass 06a7f471e0 builder: prevent Dockerfile to leave build context
Signed-off-by: Tibor Vass <teabee89@gmail.com>
2015-02-03 09:07:17 -08:00
Doug Davis 4683d01691 Add an API test for docker build -f Dockerfile
I noticed that while we have tests to make sure that people don't
specify a Dockerfile (via -f) that's outside of the build context
when using the docker cli, we don't check on the server side to make
sure that API users have the same check done. This would be a security
risk.

While in there I had to add a new util func for the tests to allow us to
send content to the server that isn't json encoded - in this case a tarball

Signed-off-by: Doug Davis <dug@us.ibm.com>
2015-02-03 09:07:17 -08:00
Michael Crosby 6020a06399 Print zeros for initial stats collection on stopped container
When calling stats on stopped container's print out zeros for all of the
values to populate the initial table.  This signals to the user that the
operations completed and will not block.

Closes #10504

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
2015-02-03 08:50:47 -08:00
Sebastiaan van Stijn cc0bfccdf4 Replace "base" with "ubuntu" in documentation
The API documentation uses the "base" image in various
places. The "base" image is deprecated and it is no longer
possible to download this image.

This changes the API documentation to use "ubuntu" in stead.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2015-02-02 13:34:12 -08:00
Chen Hanxiao 0c18ec62f3 docs: fix another typo in docker-build man page
s/arbtrary/arbitrary

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
2015-02-02 13:30:11 -08:00
John Tims a9825c9bd8 Fix documentation typo
Signed-off-by: John Tims <john.k.tims@gmail.com>
2015-02-02 13:30:11 -08:00
Josh Hawn 908be50c44 Handle gorilla/mux route url bug
When getting the URL from a v2 registry url builder, it does not
honor the scheme from the endpoint object and will cause an https
endpoint to return urls starting with http.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-02-02 13:30:11 -08:00
Josh Hawn 2a82dba34d Fix token basic auth header issue
When requesting a token, the basic auth header is always being set even
if there is no username value. This patch corrects this and does not set
the basic auth header if the username is empty.

Also fixes an issue where pulling all tags from a v2 registry succeeds
when the image does not actually exist on the registry.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-02-02 13:30:11 -08:00
Erik Hollensbe 13fd2a908c Remove "OMG IPV6" log message
Signed-off-by: Erik Hollensbe <erik+github@hollensbe.org>
2015-02-02 13:30:11 -08:00
Arnaud Porterie 464891aaf8 Fix race in test registry setup
Wait for the local registry-v2 test instance to become available to
avoid random tests failures.

Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
2015-02-02 13:30:10 -08:00
Phil Estes 9974663ed7 Add missing $HOST in a couple places in HTTPS/TLS setup docs
Fix typos in setup docs where tcp://:2376 is used without the $HOST
parameter.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
2015-02-02 13:30:10 -08:00
Derek McGowan 76269e5c9d Add push fallback to v1 for the official registry
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-02-02 13:30:10 -08:00
Jessica Frazelle 1121d7c4fd Validate toml
Docker-DCO-1.1-Signed-off-by: Jessie Frazelle <princess@docker.com> (github: jfrazelle)

Docker-DCO-1.1-Signed-off-by: Jessie Frazelle <hugs@docker.com> (github: jfrazelle)
2015-02-02 13:30:10 -08:00
Josh Hawn 7e197575a2 Remove Checksum field from image.Image struct
The checksum is now being stored in a separate file beside the image
JSON file.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-02-02 13:30:10 -08:00
Derek McGowan 3dc3059d94 Store tar checksum in separate file
Fixes #10432

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-02-02 13:30:10 -08:00
Derek McGowan 7b6de74c9a Revert client signature
Supports multiple tag push with daemon signature

Fixes #10444

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-02-02 13:30:10 -08:00
Phil Estes cad8adacb8 Setup TCP keep-alive on hijacked HTTP(S) client <--> daemon sessions
Fixes #10387

Without TCP keep-alive set on socket connections to the daemon, any
long-running container with std{out,err,in} attached that doesn't
read/write for a minute or longer will end in ECONNTIMEDOUT (depending
on network settings/OS defaults, etc.), leaving the docker client side
believing it is still waiting on data with no actual underlying socket
connection.

This patch turns on TCP keep-alive for the underlying TCP connection
for both TLS and standard HTTP hijacked daemon connections from the
docker client, with a keep-alive timeout of 30 seconds.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
2015-02-02 13:30:10 -08:00
Srini Brahmaroutu 6226deeaf4 Removing the check on Architecture to build and run Docker on IBM Power and Z platforms
Signed-off-by: Srini Brahmaroutu <srbrahma@us.ibm.com>
2015-02-02 13:30:10 -08:00
gdi2290 3ec19f56cf Update AUTHORS file and .mailmap
added `LC_ALL=C.UTF-8` due to osx
http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searche
s-with-lc-all

Signed-off-by: Patrick Stapleton <github@gdi2290.com>
2015-02-02 13:30:10 -08:00
Josh Hawn 48c71787ed No longer compute checksum when installing images.
While checksums are verified when a layer is pulled from v2 registries,
there are known issues where the checksum may change when the layer diff
is computed again. To avoid these issues, the checksum should no longer
be computed and stored until after it has been extracted to the docker
storage driver. The checksums are instead computed lazily before they
are pushed to a v2 registry.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-02-02 13:30:10 -08:00
Jessica Frazelle 604731a930 Some small updates to the dev env docs.
Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jess@docker.com> (github: jfrazelle)
2015-02-02 13:30:09 -08:00
Derek McGowan e8650e01f8 Defer creation of trust key file until needed
Fixes #10442

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-02-02 13:30:09 -08:00
Sven Dowideit 817d04d992 DHE documentation placeholder and Navbar changes
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
2015-02-02 13:30:09 -08:00
Sven Dowideit cdff91a01c comment out the docker and curl lines we'll run later
Docker-DCO-1.1-Signed-off-by: Sven Dowideit <SvenDowideit@docker.com> (github: SvenDowideit)
2015-02-02 13:30:09 -08:00
Mehul Kar 6f26bd0e16 Improve explanation of port mapping from containers
Signed-off-by: Mehul Kar <mehul.kar@gmail.com>
2015-02-02 13:30:09 -08:00
Tianon Gravi 3c090db4e9 Update .deb version numbers to be more sane
Example output:
```console
root@906b21a861fb:/go/src/github.com/docker/docker# ./hack/make.sh binary ubuntu
bundles/1.4.1-dev already exists. Removing.

---> Making bundle: binary (in bundles/1.4.1-dev/binary)
Created binary: /go/src/github.com/docker/docker/bundles/1.4.1-dev/binary/docker-1.4.1-dev

---> Making bundle: ubuntu (in bundles/1.4.1-dev/ubuntu)
Created package {:path=>"lxc-docker-1.4.1-dev_1.4.1~dev~git20150128.182847.0.17e840a_amd64.deb"}
Created package {:path=>"lxc-docker_1.4.1~dev~git20150128.182847.0.17e840a_amd64.deb"}

```

As noted in a comment in the code here, this sums up the reasoning for this change: (which is how APT and reprepro compare versions)
```console
$ dpkg --compare-versions 1.5.0 gt 1.5.0~rc1 && echo true || echo false
true
$ dpkg --compare-versions 1.5.0~rc1 gt 1.5.0~git20150128.112847.17e840a && echo true || echo false
true
$ dpkg --compare-versions 1.5.0~git20150128.112847.17e840a gt 1.5.0~dev~git20150128.112847.17e840a && echo true || echo false
true
```

ie, `1.5.0` > `1.5.0~rc1` > `1.5.0~git20150128.112847.17e840a` > `1.5.0~dev~git20150128.112847.17e840a`

Signed-off-by: Andrew "Tianon" Page <admwiggin@gmail.com>
2015-01-28 13:51:12 -08:00
Arnaud Porterie b7c3fdfd0d Update fish completion for 1.5.0
Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
2015-01-28 10:29:29 -08:00
Phil Estes aa682a845b Fix bridge initialization for IPv6 if IPv4-only docker0 exists
This fixes the daemon's failure to start when setting --ipv6=true for
the first time without deleting `docker0` bridge from a prior use with
only IPv4 addressing.

The addition of the IPv6 bridge address is factored out into a separate
initialization routine which is called even if the bridge exists but no
IPv6 addresses are found.

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com> (github: estesp)
2015-01-28 10:29:29 -08:00
Jonathan Rudenberg 218d0dcc9d Fix missing err assignment in bridge creation
Signed-off-by: Jonathan Rudenberg <jonathan@titanous.com>
2015-01-28 10:29:29 -08:00
Stephen J Day 510d8f8634 Open up v2 http status code checks for put and head checks
Under certain cases, such as when putting a manifest or check for the existence
of a layer, the status code checks in session_v2.go were too narrow for their
purpose. In the case of putting a manifest, the handler only cares that an
error is not returned. Whether it is a 304 or 202 does not matter, as long as
the server reports success. Having the client only accept specific http codes
inhibits future protocol evolution.

Signed-off-by: Stephen J Day <stephen.day@docker.com>
2015-01-28 08:48:03 -08:00
Derek McGowan b65600f6b6 Buffer tar file on v2 push
fixes #10312
fixes #10306

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-01-28 08:48:03 -08:00
Jessica Frazelle 79dcea718c Add completion for stats.
Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jess@docker.com> (github: jfrazelle)
2015-01-28 08:45:57 -08:00
Sven Dowideit 072b09c45d Add the registry mirror document to the menu
Signed-off-by: Sven Dowideit <SvenDowideit@docker.com>

Docker-DCO-1.1-Signed-off-by: Sven Dowideit <SvenDowideit@docker.com> (github: SvenDowideit)
2015-01-27 19:35:26 -08:00
Derek McGowan c2d9837745 Use layer checksum if calculated during manifest creation
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-01-27 19:35:26 -08:00
Josh Hawn fa5dfbb18b Fix premature close of build output on pull
The build job will sometimes trigger a pull job when the base image
does not exist. Now that engine jobs properly close their output by default
the pull job would also close the build job's stdout in a cascading close
upon completion of the pull.

This patch corrects this by wrapping the `pull` job's stdout with a
nopCloseWriter which will not close the stdout of the `build` job.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-01-27 19:35:26 -08:00
Sven Dowideit 6532a075f3 tell users they can what IP range Hub webhooks can come from so they can filter
Docker-DCO-1.1-Signed-off-by: Sven Dowideit <SvenDowideit@docker.com> (github: SvenDowideit)

Signed-off-by: Sven Dowideit <SvenDowideit@docker.com>
2015-01-27 19:35:26 -08:00
Chen Hanxiao 3b4a4bf809 docs: fix a typo in docker-build man page
s/Dockefile/Dockerfile

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
2015-01-27 19:35:26 -08:00
Tony Miller 4602909566 fix /etc/host typo in remote API docs
Signed-off-by: Tony Miller <mcfiredrill@gmail.com>
2015-01-27 19:35:25 -08:00
Sven Dowideit 588f350b61 as we're not using the search suggestion feature only load the search_content when we have a search ?q= param
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>

Docker-DCO-1.1-Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au> (github: SvenDowideit)
2015-01-27 19:35:25 -08:00
Sven Dowideit 6e5ff509b2 set the content-type for the search_content.json.gz
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>

Docker-DCO-1.1-Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au> (github: SvenDowideit)
2015-01-27 19:35:25 -08:00
Sven Dowideit 61d341c2ca Change to load the json.gz file
Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>

Docker-DCO-1.1-Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au> (github: SvenDowideit)
2015-01-27 19:35:25 -08:00
unclejack b996d379a1 docs: compress search_content.json for release
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>

Docker-DCO-1.1-Signed-off-by: unclejack <unclejacksons@gmail.com> (github: SvenDowideit)
2015-01-27 19:35:25 -08:00
Derek McGowan b0935ea730 Better error messaging and logging for v2 registry requests
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-01-27 19:35:25 -08:00
Derek McGowan 96fe13b49b Add file path to errors loading the key file
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-01-27 19:35:25 -08:00
Brian Goff 12ccde442a Do not return err on symlink eval
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2015-01-27 19:35:25 -08:00
Michael Crosby 4262cfe41f Remove omitempty json tags from stucts
When unmarshaling the json response from the API in languages to a
dynamic object having the omitempty field tag on types such as float64
case the key to be omitted on 0.0 values.  Various langages will
interpret this as a null when 0.0 is the actual value.

This patch removes the omitempty tags on fields that are not structs
where they can be safely omited.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
2015-01-27 19:35:25 -08:00
Brian Goff ddc2e25546 Fix bind-mounts only partially removed
When calling delete on a bind-mount volume, the config file was bing
removed, but it was not actually being removed from the volume index.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2015-01-27 19:35:25 -08:00
unclejack 6646cff646 docs: shrink sprites-small_360.png
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
2015-01-27 19:35:25 -08:00
Euan ac8fd856c0 Allow empty layer configs in manifests
Before the V2 registry changes, images with no config could be pushed.
This change fixes a regression that made those images not able to be
pushed to a registry.

Signed-off-by: Euan Kemp <euank@euank.com>
2015-01-27 19:35:25 -08:00
DiuDiugirl 48754d673c Fix a minor typo
Docker inspect can also be used on images, this patch fixed the
minor typo in file docker/flags.go and docs/man/docker.1.md

Signed-off-by:  DiuDiugirl <sophia.wang@pku.edu.cn>
2015-01-27 19:35:25 -08:00
unclejack 723684525a pkg/archive: remove tar autodetection log line
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
2015-01-27 19:35:24 -08:00
Derek McGowan 32aceadbe6 Revert progressreader to not defer close
When progress reader closes it overwrites the progress line with the full progress bar, replaces the completed message.

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-01-27 19:35:24 -08:00
Derek McGowan c67d3e159c Use filepath instead of path
Currently loading the trust key uses path instead of filepath. This creates problems on some operating systems such as Windows.

Fixes #10319

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
2015-01-27 19:35:24 -08:00
Jessica Frazelle a080e2add7 Make debugs logs suck less.
Docker-DCO-1.1-Signed-off-by: Jessica Frazelle <jess@docker.com> (github: jfrazelle)
2015-01-27 19:35:24 -08:00
Josh Hawn 24d81b0ddb Always store images with tarsum.v1 checksum added
Updates `image.StoreImage()` to always ensure that images
that are installed in Docker have a tarsum.v1 checksum.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-01-27 19:35:24 -08:00
Tony Miller 08f2fad40b document the ExtraHosts parameter for /containers/create for the remote API
I think this was added from version 1.15.

Signed-off-by: Tony Miller <mcfiredrill@gmail.com>
2015-01-27 19:35:24 -08:00
GennadySpb f91fbe39ce Update using_supervisord.md
Fix factual error

change made by: GennadySpb <lipenkov@gmail.com>

Signed-off-by: Sven Dowideit <SvenDowideit@docker.com>
2015-01-27 19:35:24 -08:00
Tianon Gravi 018ab080bb Remove windows from the list of supported platforms
Since it can still be tested natively without this, this won't cause any harm while we fix the tests to actually work on Windows.

Signed-off-by: Andrew "Tianon" Page <admwiggin@gmail.com>
2015-01-27 19:35:24 -08:00
Tibor Vass fe94ecb2c1 integration-cli: wait for container before sending ^D
Signed-off-by: Tibor Vass <teabee89@gmail.com>
2015-01-27 19:35:24 -08:00
Lorenz Leutgeb 7b2e67036f Fix inconsistent formatting
Colon was bold, but regular at other occurences.

Blame cf27b310c4

Signed-off-by: Lorenz Leutgeb <lorenz.leutgeb@gmail.com>
2015-01-27 19:35:24 -08:00
Lorenz Leutgeb e130faea1b doc: Minor semantical/editorial fixes in HTTPS article
"read-only" vs. "only readable by you"

Refer to:
https://github.com/docker/docker/pull/9952#discussion_r22690266

Signed-off-by: Lorenz Leutgeb <lorenz.leutgeb@gmail.com>
2015-01-27 19:35:24 -08:00
Lorenz Leutgeb 38f09de334 doc: Editorial changes as suggested by @fredlf
Refer to:
 * https://github.com/docker/docker/pull/9952#discussion_r22686652
 * https://github.com/docker/docker/pull/9952#discussion_r22686804

Signed-off-by: Lorenz Leutgeb <lorenz.leutgeb@gmail.com>
2015-01-27 19:35:24 -08:00
Lorenz Leutgeb f9ba68ddfb doc: Improve article on HTTPS
* Adjust header to match _page_title
 * Add instructions on deletion of CSRs and setting permissions
 * Simplify some path expressions and commands
 * Consqeuently use ~ instead of ${HOME}
 * Precise formulation ('key' vs. 'public key')
 * Fix wrong indentation of output of `openssl req`
 * Use dash ('--') instead of minus ('-')

Remark on permissions:

It's not a problem to `chmod 0400` the private keys, because the
Docker daemon runs as root (can read the file anyway) and the Docker
client runs as user.

Signed-off-by: Lorenz Leutgeb <lorenz.leutgeb@gmail.com>
2015-01-27 19:35:23 -08:00
Abin Shahab 16913455bd Fixes apparmor regression
Signed-off-by: Abin Shahab <ashahab@altiscale.com> (github: ashahab-altiscale)
Docker-DCO-1.1-Signed-off-by: Abin Shahab <ashahab@altiscale.com> (github: ashahab-altiscale)
2015-01-27 19:35:23 -08:00
Andrew C. Bodine 32f189cd08 Adds docs for /containers/(id)/attach/ws api endpoint
Signed-off-by: Andrew C. Bodine <acbodine@us.ibm.com>
2015-01-27 19:35:23 -08:00
Josh Hawn 526ca42282 Split API Version header when checking for v2
Since the Docker-Distribution-API-Version header value may contain multiple
space delimited versions as well as many instances of the header key, the
header value is now split on whitespace characters to iterate over all versions
that may be listed in one instance of the header.

Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
2015-01-27 19:35:23 -08:00
Harald Albers b98b42d843 Add bash completions for daemon flags, simplify with extglob
Implementing the deamon flags the traditional way introduced even more
redundancy than usual because the same list of options with flags
had to be added twice.

This can be avoided by using variables in the case statements when
using the extglob shell option.

Signed-off-by: Harald Albers <github@albersweb.de>
2015-01-27 19:35:23 -08:00
imre Fitos 7bf03dd132 fix typo 'setup/set up'
Signed-off-by: imre Fitos <imre.fitos+github@gmail.com>
2015-01-27 19:35:23 -08:00
imre Fitos 034aa3b2c4 start docker before checking for updated NAT rule
Signed-off-by: imre Fitos <imre.fitos+github@gmail.com>
2015-01-27 19:35:23 -08:00
imre Fitos 6da1e01e6c docs: remove NAT rule when removing bridge
Signed-off-by: imre Fitos <imre.fitos+github@gmail.com>
2015-01-27 19:35:23 -08:00
127 changed files with 3379 additions and 1265 deletions
+1 -1
View File
@@ -10,5 +10,5 @@ script:
- rm integration-cli/docker_cli_daemon_test.go - rm integration-cli/docker_cli_daemon_test.go
- rm integration-cli/docker_cli_exec_test.go - rm integration-cli/docker_cli_exec_test.go
# Validate and test. # Validate and test.
- hack/make.sh validate-dco validate-gofmt - hack/make.sh validate-dco validate-gofmt validate-toml
- hack/make.sh binary cross test-unit test-integration-cli test-integration test-docker-py - hack/make.sh binary cross test-unit test-integration-cli test-integration test-docker-py
+19 -2
View File
@@ -6,6 +6,24 @@
# #
# For explanation on this file format: man git-shortlog # For explanation on this file format: man git-shortlog
Patrick Stapleton <github@gdi2290.com>
Shishir Mahajan <shishir.mahajan@redhat.com> <smahajan@redhat.com>
Erwin van der Koogh <info@erronis.nl>
Ahmed Kamal <email.ahmedkamal@googlemail.com>
Tejesh Mehta <tejesh.mehta@gmail.com> <tj@init.me>
Cristian Staretu <cristian.staretu@gmail.com>
Cristian Staretu <cristian.staretu@gmail.com> <unclejacksons@gmail.com>
Cristian Staretu <cristian.staretu@gmail.com> <unclejack@users.noreply.github.com>
Marcus Linke <marcus.linke@gmx.de>
Aleksandrs Fadins <aleks@s-ko.net>
Christopher Latham <sudosurootdev@gmail.com>
Hu Keping <hukeping@huawei.com>
Wayne Chang <wayne@neverfear.org>
Chen Chao <cc272309126@gmail.com>
Daehyeok Mun <daehyeok@gmail.com>
<daehyeok@gmail.com> <daehyeok@daehyeokui-MacBook-Air.local>
<jt@yadutaf.fr> <admin@jtlebi.fr>
<jeff@docker.com> <jefferya@programmerq.net>
<charles.hooper@dotcloud.com> <chooper@plumata.com> <charles.hooper@dotcloud.com> <chooper@plumata.com>
<daniel.mizyrycki@dotcloud.com> <daniel@dotcloud.com> <daniel.mizyrycki@dotcloud.com> <daniel@dotcloud.com>
<daniel.mizyrycki@dotcloud.com> <mzdaniel@glidelink.net> <daniel.mizyrycki@dotcloud.com> <mzdaniel@glidelink.net>
@@ -58,7 +76,7 @@ Jean-Baptiste Dalido <jeanbaptiste@appgratis.com>
<michael@docker.com> <michael@crosbymichael.com> <michael@docker.com> <michael@crosbymichael.com>
<michael@docker.com> <crosby.michael@gmail.com> <michael@docker.com> <crosby.michael@gmail.com>
<michael@docker.com> <crosbymichael@gmail.com> <michael@docker.com> <crosbymichael@gmail.com>
<github@developersupport.net> <github@metaliveblog.com> <github@developersupport.net> <github@metaliveblog.com>
<brandon@ifup.org> <brandon@ifup.co> <brandon@ifup.org> <brandon@ifup.co>
<dano@spotify.com> <daniel.norberg@gmail.com> <dano@spotify.com> <daniel.norberg@gmail.com>
<danny@codeaholics.org> <Danny.Yates@mailonline.co.uk> <danny@codeaholics.org> <Danny.Yates@mailonline.co.uk>
@@ -74,7 +92,6 @@ Sven Dowideit <SvenDowideit@home.org.au> <SvenDowideit@docker.com>
Sven Dowideit <SvenDowideit@home.org.au> <¨SvenDowideit@home.org.au¨> Sven Dowideit <SvenDowideit@home.org.au> <¨SvenDowideit@home.org.au¨>
Sven Dowideit <SvenDowideit@home.org.au> <SvenDowideit@users.noreply.github.com> Sven Dowideit <SvenDowideit@home.org.au> <SvenDowideit@users.noreply.github.com>
Sven Dowideit <SvenDowideit@home.org.au> <sven@t440s.home.gateway> Sven Dowideit <SvenDowideit@home.org.au> <sven@t440s.home.gateway>
unclejack <unclejacksons@gmail.com> <unclejack@users.noreply.github.com>
<alexl@redhat.com> <alexander.larsson@gmail.com> <alexl@redhat.com> <alexander.larsson@gmail.com>
Alexandr Morozov <lk4d4math@gmail.com> Alexandr Morozov <lk4d4math@gmail.com>
<git.nivoc@neverbox.com> <kuehnle@online.de> <git.nivoc@neverbox.com> <kuehnle@online.de>
+113 -58
View File
@@ -12,41 +12,46 @@ Adam Singer <financeCoding@gmail.com>
Aditya <aditya@netroy.in> Aditya <aditya@netroy.in>
Adrian Mouat <adrian.mouat@gmail.com> Adrian Mouat <adrian.mouat@gmail.com>
Adrien Folie <folie.adrien@gmail.com> Adrien Folie <folie.adrien@gmail.com>
Ahmed Kamal <email.ahmedkamal@googlemail.com>
Ahmet Alp Balkan <ahmetb@microsoft.com> Ahmet Alp Balkan <ahmetb@microsoft.com>
Aidan Hobson Sayers <aidanhs@cantab.net>
AJ Bowen <aj@gandi.net> AJ Bowen <aj@gandi.net>
Al Tobey <al@ooyala.com>
alambike <alambike@gmail.com> alambike <alambike@gmail.com>
Alan Thompson <cloojure@gmail.com> Alan Thompson <cloojure@gmail.com>
Albert Callarisa <shark234@gmail.com> Albert Callarisa <shark234@gmail.com>
Albert Zhang <zhgwenming@gmail.com> Albert Zhang <zhgwenming@gmail.com>
Aleksa Sarai <cyphar@cyphar.com> Aleksa Sarai <cyphar@cyphar.com>
Aleksandrs Fadins <aleks@s-ko.net>
Alex Gaynor <alex.gaynor@gmail.com>
Alex Warhawk <ax.warhawk@gmail.com>
Alexander Boyd <alex@opengroove.org>
Alexander Larsson <alexl@redhat.com> Alexander Larsson <alexl@redhat.com>
Alexander Morozov <lk4d4@docker.com>
Alexander Shopov <ash@kambanaria.org> Alexander Shopov <ash@kambanaria.org>
Alexandr Morozov <lk4d4@docker.com> Alexandr Morozov <lk4d4@docker.com>
Alexey Kotlyarov <alexey@infoxchange.net.au> Alexey Kotlyarov <alexey@infoxchange.net.au>
Alexey Shamrin <shamrin@gmail.com> Alexey Shamrin <shamrin@gmail.com>
Alex Gaynor <alex.gaynor@gmail.com>
Alexis THOMAS <fr.alexisthomas@gmail.com> Alexis THOMAS <fr.alexisthomas@gmail.com>
Alex Warhawk <ax.warhawk@gmail.com>
almoehi <almoehi@users.noreply.github.com> almoehi <almoehi@users.noreply.github.com>
Al Tobey <al@ooyala.com>
Álvaro Lázaro <alvaro.lazaro.g@gmail.com>
amangoel <amangoel@gmail.com> amangoel <amangoel@gmail.com>
Amit Bakshi <ambakshi@gmail.com> Amit Bakshi <ambakshi@gmail.com>
AnandkumarPatel <anandkumarpatel@gmail.com>
Anand Patil <anand.prabhakar.patil@gmail.com> Anand Patil <anand.prabhakar.patil@gmail.com>
AnandkumarPatel <anandkumarpatel@gmail.com>
Andre Dublin <81dublin@gmail.com>
Andrea Luzzardi <aluzzardi@gmail.com> Andrea Luzzardi <aluzzardi@gmail.com>
Andrea Turli <andrea.turli@gmail.com>
Andreas Köhler <andi5.py@gmx.net> Andreas Köhler <andi5.py@gmx.net>
Andreas Savvides <andreas@editd.com> Andreas Savvides <andreas@editd.com>
Andreas Tiefenthaler <at@an-ti.eu> Andreas Tiefenthaler <at@an-ti.eu>
Andrea Turli <andrea.turli@gmail.com> Andrew C. Bodine <acbodine@us.ibm.com>
Andre Dublin <81dublin@gmail.com>
Andrew Duckworth <grillopress@gmail.com> Andrew Duckworth <grillopress@gmail.com>
Andrew France <andrew@avito.co.uk> Andrew France <andrew@avito.co.uk>
Andrew Macgregor <andrew.macgregor@agworld.com.au> Andrew Macgregor <andrew.macgregor@agworld.com.au>
Andrew Munsell <andrew@wizardapps.net> Andrew Munsell <andrew@wizardapps.net>
Andrews Medina <andrewsmedina@gmail.com>
Andrew Weiss <andrew.weiss@outlook.com> Andrew Weiss <andrew.weiss@outlook.com>
Andrew Williams <williams.andrew@gmail.com> Andrew Williams <williams.andrew@gmail.com>
Andrews Medina <andrewsmedina@gmail.com>
Andrey Petrov <andrey.petrov@shazow.net> Andrey Petrov <andrey.petrov@shazow.net>
Andrey Stolbovsky <andrey.stolbovsky@gmail.com> Andrey Stolbovsky <andrey.stolbovsky@gmail.com>
Andy Chambers <anchambers@paypal.com> Andy Chambers <anchambers@paypal.com>
@@ -56,6 +61,8 @@ Andy Kipp <andy@rstudio.com>
Andy Rothfusz <github@developersupport.net> Andy Rothfusz <github@developersupport.net>
Andy Smith <github@anarkystic.com> Andy Smith <github@anarkystic.com>
Andy Wilson <wilson.andrew.j+github@gmail.com> Andy Wilson <wilson.andrew.j+github@gmail.com>
Ankush Agarwal <ankushagarwal11@gmail.com>
Anthony Baire <Anthony.Baire@irisa.fr>
Anthony Bishopric <git@anthonybishopric.com> Anthony Bishopric <git@anthonybishopric.com>
Anton Löfgren <anton.lofgren@gmail.com> Anton Löfgren <anton.lofgren@gmail.com>
Anton Nikitin <anton.k.nikitin@gmail.com> Anton Nikitin <anton.k.nikitin@gmail.com>
@@ -72,11 +79,11 @@ Barry Allard <barry.allard@gmail.com>
Bartłomiej Piotrowski <b@bpiotrowski.pl> Bartłomiej Piotrowski <b@bpiotrowski.pl>
bdevloed <boris.de.vloed@gmail.com> bdevloed <boris.de.vloed@gmail.com>
Ben Firshman <ben@firshman.co.uk> Ben Firshman <ben@firshman.co.uk>
Benjamin Atkin <ben@benatkin.com>
Benoit Chesneau <bchesneau@gmail.com>
Ben Sargent <ben@brokendigits.com> Ben Sargent <ben@brokendigits.com>
Ben Toews <mastahyeti@gmail.com> Ben Toews <mastahyeti@gmail.com>
Ben Wiklund <ben@daisyowl.com> Ben Wiklund <ben@daisyowl.com>
Benjamin Atkin <ben@benatkin.com>
Benoit Chesneau <bchesneau@gmail.com>
Bernerd Schaefer <bj.schaefer@gmail.com> Bernerd Schaefer <bj.schaefer@gmail.com>
Bert Goethals <bert@bertg.be> Bert Goethals <bert@bertg.be>
Bhiraj Butala <abhiraj.butala@gmail.com> Bhiraj Butala <abhiraj.butala@gmail.com>
@@ -113,18 +120,22 @@ Charles Hooper <charles.hooper@dotcloud.com>
Charles Lindsay <chaz@chazomatic.us> Charles Lindsay <chaz@chazomatic.us>
Charles Merriam <charles.merriam@gmail.com> Charles Merriam <charles.merriam@gmail.com>
Charlie Lewis <charliel@lab41.org> Charlie Lewis <charliel@lab41.org>
Chen Chao <cc272309126@gmail.com>
Chewey <prosto-chewey@users.noreply.github.com> Chewey <prosto-chewey@users.noreply.github.com>
Chia-liang Kao <clkao@clkao.org> Chia-liang Kao <clkao@clkao.org>
Chris Alfonso <calfonso@redhat.com> Chris Alfonso <calfonso@redhat.com>
Chris Armstrong <chris@opdemand.com> Chris Armstrong <chris@opdemand.com>
chrismckinnel <chris.mckinnel@tangentlabs.co.uk>
Chris Snow <chsnow123@gmail.com> Chris Snow <chsnow123@gmail.com>
Chris St. Pierre <chris.a.st.pierre@gmail.com> Chris St. Pierre <chris.a.st.pierre@gmail.com>
chrismckinnel <chris.mckinnel@tangentlabs.co.uk>
Christian Berendt <berendt@b1-systems.de> Christian Berendt <berendt@b1-systems.de>
Christian Stefanescu <st.chris@gmail.com>
ChristoperBiscardi <biscarch@sketcht.com> ChristoperBiscardi <biscarch@sketcht.com>
Christopher Currie <codemonkey+github@gmail.com>
Christopher Rigor <crigor@gmail.com>
Christophe Troestler <christophe.Troestler@umons.ac.be> Christophe Troestler <christophe.Troestler@umons.ac.be>
Christopher Currie <codemonkey+github@gmail.com>
Christopher Latham <sudosurootdev@gmail.com>
Christopher Rigor <crigor@gmail.com>
Chun Chen <chenchun.feed@gmail.com>
Ciro S. Costa <ciro.costa@usp.br> Ciro S. Costa <ciro.costa@usp.br>
Clayton Coleman <ccoleman@redhat.com> Clayton Coleman <ccoleman@redhat.com>
Colin Dunklau <colin.dunklau@gmail.com> Colin Dunklau <colin.dunklau@gmail.com>
@@ -132,15 +143,20 @@ Colin Rice <colin@daedrum.net>
Colin Walters <walters@verbum.org> Colin Walters <walters@verbum.org>
Cory Forsyth <cory.forsyth@gmail.com> Cory Forsyth <cory.forsyth@gmail.com>
cressie176 <github@stephen-cresswell.net> cressie176 <github@stephen-cresswell.net>
Cristian Staretu <cristian.staretu@gmail.com>
Cruceru Calin-Cristian <crucerucalincristian@gmail.com> Cruceru Calin-Cristian <crucerucalincristian@gmail.com>
Daan van Berkel <daan.v.berkel.1980@gmail.com> Daan van Berkel <daan.v.berkel.1980@gmail.com>
Daehyeok.Mun <daehyeok@gmail.com> Daehyeok Mun <daehyeok@gmail.com>
Dafydd Crosby <dtcrsby@gmail.com> Dafydd Crosby <dtcrsby@gmail.com>
Dan Buch <d.buch@modcloth.com> Dan Buch <d.buch@modcloth.com>
Dan Cotora <dan@bluevision.ro> Dan Cotora <dan@bluevision.ro>
Dan Griffin <dgriffin@peer1.com> Dan Griffin <dgriffin@peer1.com>
Dan Hirsch <thequux@upstandinghackers.com> Dan Hirsch <thequux@upstandinghackers.com>
Daniel, Dao Quang Minh <dqminh89@gmail.com> Dan Keder <dan.keder@gmail.com>
Dan McPherson <dmcphers@redhat.com>
Dan Stine <sw@stinemail.com>
Dan Walsh <dwalsh@redhat.com>
Dan Williams <me@deedubs.com>
Daniel Exner <dex@dragonslave.de> Daniel Exner <dex@dragonslave.de>
Daniel Farrell <dfarrell@redhat.com> Daniel Farrell <dfarrell@redhat.com>
Daniel Garcia <daniel@danielgarcia.info> Daniel Garcia <daniel@danielgarcia.info>
@@ -152,29 +168,27 @@ Daniel Nordberg <dnordberg@gmail.com>
Daniel Robinson <gottagetmac@gmail.com> Daniel Robinson <gottagetmac@gmail.com>
Daniel Von Fange <daniel@leancoder.com> Daniel Von Fange <daniel@leancoder.com>
Daniel YC Lin <dlin.tw@gmail.com> Daniel YC Lin <dlin.tw@gmail.com>
Dan Keder <dan.keder@gmail.com> Daniel, Dao Quang Minh <dqminh89@gmail.com>
Dan McPherson <dmcphers@redhat.com>
Danny Berger <dpb587@gmail.com> Danny Berger <dpb587@gmail.com>
Danny Yates <danny@codeaholics.org> Danny Yates <danny@codeaholics.org>
Dan Stine <sw@stinemail.com>
Dan Walsh <dwalsh@redhat.com>
Dan Williams <me@deedubs.com>
Darren Coxall <darren@darrencoxall.com> Darren Coxall <darren@darrencoxall.com>
Darren Shepherd <darren.s.shepherd@gmail.com> Darren Shepherd <darren.s.shepherd@gmail.com>
David Anderson <dave@natulte.net> David Anderson <dave@natulte.net>
David Calavera <david.calavera@gmail.com> David Calavera <david.calavera@gmail.com>
David Corking <dmc-source@dcorking.com> David Corking <dmc-source@dcorking.com>
Davide Ceretti <davide.ceretti@hogarthww.com>
David Gageot <david@gageot.net> David Gageot <david@gageot.net>
David Gebler <davidgebler@gmail.com> David Gebler <davidgebler@gmail.com>
David Mat <david@davidmat.com>
David Mcanulty <github@hellspark.com> David Mcanulty <github@hellspark.com>
David Pelaez <pelaez89@gmail.com> David Pelaez <pelaez89@gmail.com>
David Röthlisberger <david@rothlis.net> David Röthlisberger <david@rothlis.net>
David Sissitka <me@dsissitka.com> David Sissitka <me@dsissitka.com>
Davide Ceretti <davide.ceretti@hogarthww.com>
Dawn Chen <dawnchen@google.com> Dawn Chen <dawnchen@google.com>
decadent <decadent@users.noreply.github.com> decadent <decadent@users.noreply.github.com>
Deni Bertovic <deni@kset.org> Deni Bertovic <deni@kset.org>
Derek <crq@kernel.org> Derek <crq@kernel.org>
Derek <crquan@gmail.com>
Derek McGowan <derek@mcgstyle.net> Derek McGowan <derek@mcgstyle.net>
Deric Crago <deric.crago@gmail.com> Deric Crago <deric.crago@gmail.com>
Deshi Xiao <dxiao@redhat.com> Deshi Xiao <dxiao@redhat.com>
@@ -182,14 +196,16 @@ Dinesh Subhraveti <dineshs@altiscale.com>
Djibril Koné <kone.djibril@gmail.com> Djibril Koné <kone.djibril@gmail.com>
dkumor <daniel@dkumor.com> dkumor <daniel@dkumor.com>
Dmitry Demeshchuk <demeshchuk@gmail.com> Dmitry Demeshchuk <demeshchuk@gmail.com>
Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
Dolph Mathews <dolph.mathews@gmail.com> Dolph Mathews <dolph.mathews@gmail.com>
Dominik Honnef <dominik@honnef.co> Dominik Honnef <dominik@honnef.co>
Don Kjer <don.kjer@gmail.com>
Don Spaulding <donspauldingii@gmail.com> Don Spaulding <donspauldingii@gmail.com>
Doug Davis <dug@us.ibm.com> Doug Davis <dug@us.ibm.com>
doug tangren <d.tangren@gmail.com> doug tangren <d.tangren@gmail.com>
Dr Nic Williams <drnicwilliams@gmail.com>
dragon788 <dragon788@users.noreply.github.com> dragon788 <dragon788@users.noreply.github.com>
Dražen Lučanin <kermit666@gmail.com> Dražen Lučanin <kermit666@gmail.com>
Dr Nic Williams <drnicwilliams@gmail.com>
Dustin Sallings <dustin@spy.net> Dustin Sallings <dustin@spy.net>
Edmund Wagner <edmund-wagner@web.de> Edmund Wagner <edmund-wagner@web.de>
Eiichi Tsukata <devel@etsukata.com> Eiichi Tsukata <devel@etsukata.com>
@@ -197,19 +213,22 @@ Eike Herzbach <eike@herzbach.net>
Eivind Uggedal <eivind@uggedal.com> Eivind Uggedal <eivind@uggedal.com>
Elias Probst <mail@eliasprobst.eu> Elias Probst <mail@eliasprobst.eu>
Emil Hernvall <emil@quench.at> Emil Hernvall <emil@quench.at>
Emily Maier <emily@emilymaier.net>
Emily Rose <emily@contactvibe.com> Emily Rose <emily@contactvibe.com>
Eric Hanchrow <ehanchrow@ine.com> Eric Hanchrow <ehanchrow@ine.com>
Eric Lee <thenorthsecedes@gmail.com> Eric Lee <thenorthsecedes@gmail.com>
Eric Myhre <hash@exultant.us> Eric Myhre <hash@exultant.us>
Eric Paris <eparis@redhat.com> Eric Paris <eparis@redhat.com>
Eric Windisch <ewindisch@docker.com> Eric Windisch <ewindisch@docker.com>
Erik Dubbelboer <erik@dubbelboer.com>
Erik Hollensbe <github@hollensbe.org> Erik Hollensbe <github@hollensbe.org>
Erik Inge Bolsø <knan@redpill-linpro.com> Erik Inge Bolsø <knan@redpill-linpro.com>
Erik Kristensen <erik@erikkristensen.com> Erik Kristensen <erik@erikkristensen.com>
Erno Hopearuoho <erno.hopearuoho@gmail.com> Erno Hopearuoho <erno.hopearuoho@gmail.com>
Erwin van der Koogh <info@erronis.nl>
Eugene Yakubovich <eugene.yakubovich@coreos.com> Eugene Yakubovich <eugene.yakubovich@coreos.com>
eugenkrizo <eugen.krizo@gmail.com> eugenkrizo <eugen.krizo@gmail.com>
evanderkoogh <info@erronis.nl> Evan Carmi <carmi@users.noreply.github.com>
Evan Hazlett <ejhazlett@gmail.com> Evan Hazlett <ejhazlett@gmail.com>
Evan Krall <krall@yelp.com> Evan Krall <krall@yelp.com>
Evan Phoenix <evan@fallingsnow.net> Evan Phoenix <evan@fallingsnow.net>
@@ -230,9 +249,9 @@ Francisco Carriedo <fcarriedo@gmail.com>
Francisco Souza <f@souza.cc> Francisco Souza <f@souza.cc>
Frank Macreery <frank@macreery.com> Frank Macreery <frank@macreery.com>
Frank Rosquin <frank.rosquin+github@gmail.com> Frank Rosquin <frank.rosquin+github@gmail.com>
Fred Lifton <fred.lifton@docker.com>
Frederick F. Kautz IV <fkautz@alumni.cmu.edu> Frederick F. Kautz IV <fkautz@alumni.cmu.edu>
Frederik Loeffert <frederik@zitrusmedia.de> Frederik Loeffert <frederik@zitrusmedia.de>
Fred Lifton <fred.lifton@docker.com>
Freek Kalter <freek@kalteronline.org> Freek Kalter <freek@kalteronline.org>
Gabe Rosenhouse <gabe@missionst.com> Gabe Rosenhouse <gabe@missionst.com>
Gabor Nagy <mail@aigeruth.hu> Gabor Nagy <mail@aigeruth.hu>
@@ -266,13 +285,15 @@ Hector Castro <hectcastro@gmail.com>
Henning Sprang <henning.sprang@gmail.com> Henning Sprang <henning.sprang@gmail.com>
Hobofan <goisser94@gmail.com> Hobofan <goisser94@gmail.com>
Hollie Teal <hollie@docker.com> Hollie Teal <hollie@docker.com>
Hu Keping <hukeping@huawei.com>
Hu Tao <hutao@cn.fujitsu.com>
Huayi Zhang <irachex@gmail.com> Huayi Zhang <irachex@gmail.com>
Hugo Duncan <hugo@hugoduncan.org> Hugo Duncan <hugo@hugoduncan.org>
Hunter Blanks <hunter@twilio.com> Hunter Blanks <hunter@twilio.com>
Hu Tao <hutao@cn.fujitsu.com>
Huu Nguyen <huu@prismskylabs.com> Huu Nguyen <huu@prismskylabs.com>
hyeongkyu.lee <hyeongkyu.lee@navercorp.com> hyeongkyu.lee <hyeongkyu.lee@navercorp.com>
Ian Babrou <ibobrik@gmail.com> Ian Babrou <ibobrik@gmail.com>
Ian Bishop <ianbishop@pace7.com>
Ian Bull <irbull@gmail.com> Ian Bull <irbull@gmail.com>
Ian Main <imain@redhat.com> Ian Main <imain@redhat.com>
Ian Truslove <ian.truslove@gmail.com> Ian Truslove <ian.truslove@gmail.com>
@@ -284,8 +305,10 @@ Isabel Jimenez <contact.isabeljimenez@gmail.com>
Isao Jonas <isao.jonas@gmail.com> Isao Jonas <isao.jonas@gmail.com>
Ivan Fraixedes <ifcdev@gmail.com> Ivan Fraixedes <ifcdev@gmail.com>
Jack Danger Canty <jackdanger@squareup.com> Jack Danger Canty <jackdanger@squareup.com>
jakedt <jake@devtable.com> Jacob Atzen <jacob@jacobatzen.dk>
Jacob Edelman <edelman.jd@gmail.com>
Jake Moshenko <jake@devtable.com> Jake Moshenko <jake@devtable.com>
jakedt <jake@devtable.com>
James Allen <jamesallen0108@gmail.com> James Allen <jamesallen0108@gmail.com>
James Carr <james.r.carr@gmail.com> James Carr <james.r.carr@gmail.com>
James DeFelice <james.defelice@ishisystems.com> James DeFelice <james.defelice@ishisystems.com>
@@ -306,49 +329,52 @@ Jason Plum <jplum@devonit.com>
Jean-Baptiste Barth <jeanbaptiste.barth@gmail.com> Jean-Baptiste Barth <jeanbaptiste.barth@gmail.com>
Jean-Baptiste Dalido <jeanbaptiste@appgratis.com> Jean-Baptiste Dalido <jeanbaptiste@appgratis.com>
Jean-Paul Calderone <exarkun@twistedmatrix.com> Jean-Paul Calderone <exarkun@twistedmatrix.com>
Jean-Tiare Le Bigot <jt@yadutaf.fr>
Jeff Anderson <jeff@docker.com>
Jeff Lindsay <progrium@gmail.com> Jeff Lindsay <progrium@gmail.com>
Jeffrey Bolle <jeffreybolle@gmail.com>
Jeff Welch <whatthejeff@gmail.com> Jeff Welch <whatthejeff@gmail.com>
Jeffrey Bolle <jeffreybolle@gmail.com>
Jeremy Grosser <jeremy@synack.me> Jeremy Grosser <jeremy@synack.me>
Jérôme Petazzoni <jerome.petazzoni@dotcloud.com>
Jesse Dubay <jesse@thefortytwo.net> Jesse Dubay <jesse@thefortytwo.net>
Jessica Frazelle <jess@docker.com> Jessica Frazelle <jess@docker.com>
Jezeniel Zapanta <jpzapanta22@gmail.com> Jezeniel Zapanta <jpzapanta22@gmail.com>
Jilles Oldenbeuving <ojilles@gmail.com> Jilles Oldenbeuving <ojilles@gmail.com>
Jim Alateras <jima@comware.com.au> Jim Alateras <jima@comware.com.au>
Jimmy Cuadra <jimmy@jimmycuadra.com>
Jim Perrin <jperrin@centos.org> Jim Perrin <jperrin@centos.org>
Jimmy Cuadra <jimmy@jimmycuadra.com>
Jiří Župka <jzupka@redhat.com> Jiří Župka <jzupka@redhat.com>
Joe Beda <joe.github@bedafamily.com> Joe Beda <joe.github@bedafamily.com>
Joe Ferguson <joe@infosiftr.com> Joe Ferguson <joe@infosiftr.com>
Joel Handwell <joelhandwell@gmail.com>
Joe Shaw <joe@joeshaw.org> Joe Shaw <joe@joeshaw.org>
Joe Van Dyk <joe@tanga.com> Joe Van Dyk <joe@tanga.com>
Joel Friedly <joelfriedly@gmail.com>
Joel Handwell <joelhandwell@gmail.com>
Joffrey F <joffrey@docker.com> Joffrey F <joffrey@docker.com>
Johan Euphrosine <proppy@google.com> Johan Euphrosine <proppy@google.com>
Johannes 'fish' Ziemke <github@freigeist.org>
Johan Rydberg <johan.rydberg@gmail.com> Johan Rydberg <johan.rydberg@gmail.com>
Johannes 'fish' Ziemke <github@freigeist.org>
John Costa <john.costa@gmail.com> John Costa <john.costa@gmail.com>
John Feminella <jxf@jxf.me> John Feminella <jxf@jxf.me>
John Gardiner Myers <jgmyers@proofpoint.com> John Gardiner Myers <jgmyers@proofpoint.com>
John Gossman <johngos@microsoft.com> John Gossman <johngos@microsoft.com>
John OBrien III <jobrieniii@yahoo.com> John OBrien III <jobrieniii@yahoo.com>
John Warwick <jwarwick@gmail.com> John Warwick <jwarwick@gmail.com>
Jon Wedaman <jweede@gmail.com>
Jonas Pfenniger <jonas@pfenniger.name> Jonas Pfenniger <jonas@pfenniger.name>
Jonathan A. Sternberg <jonathansternberg@gmail.com>
Jonathan Boulle <jonathanboulle@gmail.com> Jonathan Boulle <jonathanboulle@gmail.com>
Jonathan Camp <jonathan@irondojo.com> Jonathan Camp <jonathan@irondojo.com>
Jonathan McCrohan <jmccrohan@gmail.com> Jonathan McCrohan <jmccrohan@gmail.com>
Jonathan Mueller <j.mueller@apoveda.ch> Jonathan Mueller <j.mueller@apoveda.ch>
Jonathan Pares <jonathanpa@users.noreply.github.com> Jonathan Pares <jonathanpa@users.noreply.github.com>
Jonathan Rudenberg <jonathan@titanous.com> Jonathan Rudenberg <jonathan@titanous.com>
Jon Wedaman <jweede@gmail.com>
Joost Cassee <joost@cassee.net> Joost Cassee <joost@cassee.net>
Jordan Arentsen <blissdev@gmail.com> Jordan Arentsen <blissdev@gmail.com>
Jordan Sissel <jls@semicomplete.com> Jordan Sissel <jls@semicomplete.com>
Joseph Anthony Pasquale Holsten <joseph@josephholsten.com> Joseph Anthony Pasquale Holsten <joseph@josephholsten.com>
Joseph Hager <ajhager@gmail.com> Joseph Hager <ajhager@gmail.com>
Josh Hawn <josh.hawn@docker.com>
Josh <jokajak@gmail.com> Josh <jokajak@gmail.com>
Josh Hawn <josh.hawn@docker.com>
Josh Poimboeuf <jpoimboe@redhat.com> Josh Poimboeuf <jpoimboe@redhat.com>
Josiah Kiehl <jkiehl@riotgames.com> Josiah Kiehl <jkiehl@riotgames.com>
JP <jpellerin@leapfrogonline.com> JP <jpellerin@leapfrogonline.com>
@@ -360,6 +386,9 @@ Justin Force <justin.force@gmail.com>
Justin Plock <jplock@users.noreply.github.com> Justin Plock <jplock@users.noreply.github.com>
Justin Simonelis <justin.p.simonelis@gmail.com> Justin Simonelis <justin.p.simonelis@gmail.com>
Jyrki Puttonen <jyrkiput@gmail.com> Jyrki Puttonen <jyrkiput@gmail.com>
Jérôme Petazzoni <jerome.petazzoni@dotcloud.com>
Jörg Thalheim <joerg@higgsboson.tk>
Kamil Domanski <kamil@domanski.co>
Karan Lyons <karan@karanlyons.com> Karan Lyons <karan@karanlyons.com>
Karl Grzeszczak <karlgrz@gmail.com> Karl Grzeszczak <karlgrz@gmail.com>
Kato Kazuyoshi <kato.kazuyoshi@gmail.com> Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
@@ -367,14 +396,13 @@ Kawsar Saiyeed <kawsar.saiyeed@projiris.com>
Keli Hu <dev@keli.hu> Keli Hu <dev@keli.hu>
Ken Cochrane <kencochrane@gmail.com> Ken Cochrane <kencochrane@gmail.com>
Ken ICHIKAWA <ichikawa.ken@jp.fujitsu.com> Ken ICHIKAWA <ichikawa.ken@jp.fujitsu.com>
Kevin "qwazerty" Houdebert <kevin.houdebert@gmail.com>
Kevin Clark <kevin.clark@gmail.com> Kevin Clark <kevin.clark@gmail.com>
Kevin J. Lynagh <kevin@keminglabs.com> Kevin J. Lynagh <kevin@keminglabs.com>
Kevin Menard <kevin@nirvdrum.com> Kevin Menard <kevin@nirvdrum.com>
Kevin "qwazerty" Houdebert <kevin.houdebert@gmail.com>
Kevin Wallace <kevin@pentabarf.net> Kevin Wallace <kevin@pentabarf.net>
Keyvan Fatehi <keyvanfatehi@gmail.com> Keyvan Fatehi <keyvanfatehi@gmail.com>
kies <lleelm@gmail.com> kies <lleelm@gmail.com>
kim0 <email.ahmedkamal@googlemail.com>
Kim BKC Carlbacker <kim.carlbacker@gmail.com> Kim BKC Carlbacker <kim.carlbacker@gmail.com>
Kimbro Staken <kstaken@kstaken.com> Kimbro Staken <kstaken@kstaken.com>
Kiran Gangadharan <kiran.daredevil@gmail.com> Kiran Gangadharan <kiran.daredevil@gmail.com>
@@ -382,6 +410,7 @@ knappe <tyler.knappe@gmail.com>
Kohei Tsuruta <coheyxyz@gmail.com> Kohei Tsuruta <coheyxyz@gmail.com>
Konrad Kleine <konrad.wilhelm.kleine@gmail.com> Konrad Kleine <konrad.wilhelm.kleine@gmail.com>
Konstantin Pelykh <kpelykh@zettaset.com> Konstantin Pelykh <kpelykh@zettaset.com>
Krasimir Georgiev <support@vip-consult.co.uk>
krrg <krrgithub@gmail.com> krrg <krrgithub@gmail.com>
Kyle Conroy <kyle.j.conroy@gmail.com> Kyle Conroy <kyle.j.conroy@gmail.com>
kyu <leehk1227@gmail.com> kyu <leehk1227@gmail.com>
@@ -397,13 +426,16 @@ Lei Jitang <leijitang@huawei.com>
Len Weincier <len@cloudafrica.net> Len Weincier <len@cloudafrica.net>
Leszek Kowalski <github@leszekkowalski.pl> Leszek Kowalski <github@leszekkowalski.pl>
Levi Gross <levi@levigross.com> Levi Gross <levi@levigross.com>
Lewis Marshall <lewis@lmars.net>
Lewis Peckover <lew+github@lew.io> Lewis Peckover <lew+github@lew.io>
Liang-Chi Hsieh <viirya@gmail.com> Liang-Chi Hsieh <viirya@gmail.com>
limsy <seongyeol37@gmail.com> limsy <seongyeol37@gmail.com>
Lokesh Mandvekar <lsm5@fedoraproject.org> Lokesh Mandvekar <lsm5@fedoraproject.org>
Lorenz Leutgeb <lorenz.leutgeb@gmail.com>
Louis Opter <kalessin@kalessin.fr> Louis Opter <kalessin@kalessin.fr>
lukaspustina <lukas.pustina@centerdevice.com> lukaspustina <lukas.pustina@centerdevice.com>
lukemarsden <luke@digital-crocus.com> lukemarsden <luke@digital-crocus.com>
Lénaïc Huard <lhuard@amadeus.com>
Madhu Venugopal <madhu@socketplane.io> Madhu Venugopal <madhu@socketplane.io>
Mahesh Tiyyagura <tmahesh@gmail.com> Mahesh Tiyyagura <tmahesh@gmail.com>
Malte Janduda <mail@janduda.net> Malte Janduda <mail@janduda.net>
@@ -412,12 +444,13 @@ Manuel Meurer <manuel@krautcomputing.com>
Manuel Woelker <github@manuel.woelker.org> Manuel Woelker <github@manuel.woelker.org>
Marc Abramowitz <marc@marc-abramowitz.com> Marc Abramowitz <marc@marc-abramowitz.com>
Marc Kuo <kuomarc2@gmail.com> Marc Kuo <kuomarc2@gmail.com>
Marco Hennings <marco.hennings@freiheit.com>
Marc Tamsky <mtamsky@gmail.com> Marc Tamsky <mtamsky@gmail.com>
Marco Hennings <marco.hennings@freiheit.com>
Marcus Farkas <toothlessgear@finitebox.com> Marcus Farkas <toothlessgear@finitebox.com>
marcuslinke <marcus.linke@gmx.de> Marcus Linke <marcus.linke@gmx.de>
Marcus Ramberg <marcus@nordaaker.com> Marcus Ramberg <marcus@nordaaker.com>
Marek Goldmann <marek.goldmann@gmail.com> Marek Goldmann <marek.goldmann@gmail.com>
Marianna <mtesselh@gmail.com>
Marius Voila <marius.voila@gmail.com> Marius Voila <marius.voila@gmail.com>
Mark Allen <mrallen1@yahoo.com> Mark Allen <mrallen1@yahoo.com>
Mark McGranaghan <mmcgrana@gmail.com> Mark McGranaghan <mmcgrana@gmail.com>
@@ -425,7 +458,9 @@ Marko Mikulicic <mmikulicic@gmail.com>
Marko Tibold <marko@tibold.nl> Marko Tibold <marko@tibold.nl>
Markus Fix <lispmeister@gmail.com> Markus Fix <lispmeister@gmail.com>
Martijn van Oosterhout <kleptog@svana.org> Martijn van Oosterhout <kleptog@svana.org>
Martin Honermeyer <maze@strahlungsfrei.de>
Martin Redmond <martin@tinychat.com> Martin Redmond <martin@tinychat.com>
Mary Anthony <moxieandmore@gmail.com>
Mason Malone <mason.malone@gmail.com> Mason Malone <mason.malone@gmail.com>
Mateusz Sulima <sulima.mateusz@gmail.com> Mateusz Sulima <sulima.mateusz@gmail.com>
Mathias Monnerville <mathias@monnerville.com> Mathias Monnerville <mathias@monnerville.com>
@@ -435,14 +470,14 @@ Matt Bachmann <bachmann.matt@gmail.com>
Matt Haggard <haggardii@gmail.com> Matt Haggard <haggardii@gmail.com>
Matthew Heon <mheon@redhat.com> Matthew Heon <mheon@redhat.com>
Matthew Mueller <mattmuelle@gmail.com> Matthew Mueller <mattmuelle@gmail.com>
Matthew Riley <mattdr@google.com>
Matthias Klumpp <matthias@tenstral.net> Matthias Klumpp <matthias@tenstral.net>
Matthias Kühnle <git.nivoc@neverbox.com> Matthias Kühnle <git.nivoc@neverbox.com>
mattymo <raytrac3r@gmail.com> mattymo <raytrac3r@gmail.com>
mattyw <mattyw@me.com> mattyw <mattyw@me.com>
Maxime Petazzoni <max@signalfuse.com>
Maxim Treskin <zerthurd@gmail.com>
Max Shytikov <mshytikov@gmail.com> Max Shytikov <mshytikov@gmail.com>
Médi-Rémi Hashim <medimatrix@users.noreply.github.com> Maxim Treskin <zerthurd@gmail.com>
Maxime Petazzoni <max@signalfuse.com>
meejah <meejah@meejah.ca> meejah <meejah@meejah.ca>
Mengdi Gao <usrgdd@gmail.com> Mengdi Gao <usrgdd@gmail.com>
Mert Yazıcıoğlu <merty@users.noreply.github.com> Mert Yazıcıoğlu <merty@users.noreply.github.com>
@@ -451,12 +486,14 @@ Michael Crosby <michael@docker.com>
Michael Gorsuch <gorsuch@github.com> Michael Gorsuch <gorsuch@github.com>
Michael Hudson-Doyle <michael.hudson@linaro.org> Michael Hudson-Doyle <michael.hudson@linaro.org>
Michael Neale <michael.neale@gmail.com> Michael Neale <michael.neale@gmail.com>
Michaël Pailloncy <mpapo.dev@gmail.com>
Michael Prokop <github@michael-prokop.at> Michael Prokop <github@michael-prokop.at>
Michael Scharf <github@scharf.gr> Michael Scharf <github@scharf.gr>
Michael Stapelberg <michael+gh@stapelberg.de> Michael Stapelberg <michael+gh@stapelberg.de>
Michael Steinert <mike.steinert@gmail.com>
Michael Thies <michaelthies78@gmail.com> Michael Thies <michaelthies78@gmail.com>
Michal Jemala <michal.jemala@gmail.com> Michal Jemala <michal.jemala@gmail.com>
Michal Minar <miminar@redhat.com>
Michaël Pailloncy <mpapo.dev@gmail.com>
Michiel@unhosted <michiel@unhosted.org> Michiel@unhosted <michiel@unhosted.org>
Miguel Angel Fernández <elmendalerenda@gmail.com> Miguel Angel Fernández <elmendalerenda@gmail.com>
Mike Chelen <michael.chelen@gmail.com> Mike Chelen <michael.chelen@gmail.com>
@@ -471,12 +508,15 @@ Morten Siebuhr <sbhr@sbhr.dk>
Mrunal Patel <mrunalp@gmail.com> Mrunal Patel <mrunalp@gmail.com>
mschurenko <matt.schurenko@gmail.com> mschurenko <matt.schurenko@gmail.com>
Mustafa Akın <mustafa91@gmail.com> Mustafa Akın <mustafa91@gmail.com>
Médi-Rémi Hashim <medimatrix@users.noreply.github.com>
Nan Monnand Deng <monnand@gmail.com> Nan Monnand Deng <monnand@gmail.com>
Naoki Orii <norii@cs.cmu.edu> Naoki Orii <norii@cs.cmu.edu>
Nate Eagleson <nate@nateeag.com>
Nate Jones <nate@endot.org> Nate Jones <nate@endot.org>
Nathan Hsieh <hsieh.nathan@gmail.com> Nathan Hsieh <hsieh.nathan@gmail.com>
Nathan Kleyn <nathan@nathankleyn.com> Nathan Kleyn <nathan@nathankleyn.com>
Nathan LeClaire <nathan.leclaire@docker.com> Nathan LeClaire <nathan.leclaire@docker.com>
Neal McBurnett <neal@mcburnett.org>
Nelson Chen <crazysim@gmail.com> Nelson Chen <crazysim@gmail.com>
Niall O'Higgins <niallo@unworkable.org> Niall O'Higgins <niallo@unworkable.org>
Nicholas E. Rabenau <nerab@gmx.at> Nicholas E. Rabenau <nerab@gmx.at>
@@ -491,18 +531,21 @@ NikolaMandic <mn080202@gmail.com>
noducks <onemannoducks@gmail.com> noducks <onemannoducks@gmail.com>
Nolan Darilek <nolan@thewordnerd.info> Nolan Darilek <nolan@thewordnerd.info>
nzwsch <hi@nzwsch.com> nzwsch <hi@nzwsch.com>
O.S. Tezer <ostezer@gmail.com>
OddBloke <daniel@daniel-watkins.co.uk> OddBloke <daniel@daniel-watkins.co.uk>
odk- <github@odkurzacz.org> odk- <github@odkurzacz.org>
Oguz Bilgic <fisyonet@gmail.com> Oguz Bilgic <fisyonet@gmail.com>
Oh Jinkyun <tintypemolly@gmail.com> Oh Jinkyun <tintypemolly@gmail.com>
Ole Reifschneider <mail@ole-reifschneider.de> Ole Reifschneider <mail@ole-reifschneider.de>
Olivier Gambier <dmp42@users.noreply.github.com> Olivier Gambier <dmp42@users.noreply.github.com>
O.S. Tezer <ostezer@gmail.com>
pandrew <letters@paulnotcom.se> pandrew <letters@paulnotcom.se>
panticz <mail@konczalski.de>
Pascal Borreli <pascal@borreli.com> Pascal Borreli <pascal@borreli.com>
Pascal Hartig <phartig@rdrei.net> Pascal Hartig <phartig@rdrei.net>
Patrick Hemmer <patrick.hemmer@gmail.com> Patrick Hemmer <patrick.hemmer@gmail.com>
Patrick Stapleton <github@gdi2290.com>
pattichen <craftsbear@gmail.com> pattichen <craftsbear@gmail.com>
Paul <paul9869@gmail.com>
Paul Annesley <paul@annesley.cc> Paul Annesley <paul@annesley.cc>
Paul Bowsher <pbowsher@globalpersonals.co.uk> Paul Bowsher <pbowsher@globalpersonals.co.uk>
Paul Hammond <paul@paulhammond.org> Paul Hammond <paul@paulhammond.org>
@@ -510,7 +553,6 @@ Paul Jimenez <pj@place.org>
Paul Lietar <paul@lietar.net> Paul Lietar <paul@lietar.net>
Paul Morie <pmorie@gmail.com> Paul Morie <pmorie@gmail.com>
Paul Nasrat <pnasrat@gmail.com> Paul Nasrat <pnasrat@gmail.com>
Paul <paul9869@gmail.com>
Paul Weaver <pauweave@cisco.com> Paul Weaver <pauweave@cisco.com>
Pavlos Ratis <dastergon@gentoo.org> Pavlos Ratis <dastergon@gentoo.org>
Peter Bourgon <peter@bourgon.org> Peter Bourgon <peter@bourgon.org>
@@ -518,16 +560,18 @@ Peter Braden <peterbraden@peterbraden.co.uk>
Peter Ericson <pdericson@gmail.com> Peter Ericson <pdericson@gmail.com>
Peter Salvatore <peter@psftw.com> Peter Salvatore <peter@psftw.com>
Peter Waller <p@pwaller.net> Peter Waller <p@pwaller.net>
Phil <underscorephil@gmail.com>
Phil Estes <estesp@linux.vnet.ibm.com> Phil Estes <estesp@linux.vnet.ibm.com>
Phil Spitler <pspitler@gmail.com>
Philipp Weissensteiner <mail@philippweissensteiner.com> Philipp Weissensteiner <mail@philippweissensteiner.com>
Phillip Alexander <git@phillipalexander.io> Phillip Alexander <git@phillipalexander.io>
Phil Spitler <pspitler@gmail.com>
Phil <underscorephil@gmail.com>
Piergiuliano Bossi <pgbossi@gmail.com> Piergiuliano Bossi <pgbossi@gmail.com>
Pierre-Alain RIVIERE <pariviere@ippon.fr>
Pierre <py@poujade.org> Pierre <py@poujade.org>
Pierre Wacrenier <pierre.wacrenier@gmail.com>
Pierre-Alain RIVIERE <pariviere@ippon.fr>
Piotr Bogdan <ppbogdan@gmail.com> Piotr Bogdan <ppbogdan@gmail.com>
pixelistik <pixelistik@users.noreply.github.com> pixelistik <pixelistik@users.noreply.github.com>
Porjo <porjo38@yahoo.com.au>
Prasanna Gautam <prasannagautam@gmail.com> Prasanna Gautam <prasannagautam@gmail.com>
Przemek Hejman <przemyslaw.hejman@gmail.com> Przemek Hejman <przemyslaw.hejman@gmail.com>
pysqz <randomq@126.com> pysqz <randomq@126.com>
@@ -547,6 +591,7 @@ Renato Riccieri Santos Zannon <renato.riccieri@gmail.com>
rgstephens <greg@udon.org> rgstephens <greg@udon.org>
Rhys Hiltner <rhys@twitch.tv> Rhys Hiltner <rhys@twitch.tv>
Richard Harvey <richard@squarecows.com> Richard Harvey <richard@squarecows.com>
Richard Metzler <richard@paadee.com>
Richo Healey <richo@psych0tik.net> Richo Healey <richo@psych0tik.net>
Rick Bradley <rick@users.noreply.github.com> Rick Bradley <rick@users.noreply.github.com>
Rick van de Loo <rickvandeloo@gmail.com> Rick van de Loo <rickvandeloo@gmail.com>
@@ -572,25 +617,26 @@ Ryan Fowler <rwfowler@gmail.com>
Ryan O'Donnell <odonnellryanc@gmail.com> Ryan O'Donnell <odonnellryanc@gmail.com>
Ryan Seto <ryanseto@yak.net> Ryan Seto <ryanseto@yak.net>
Ryan Thomas <rthomas@atlassian.com> Ryan Thomas <rthomas@atlassian.com>
Rémy Greinhofer <remy.greinhofer@livelovely.com>
Sam Alba <sam.alba@gmail.com> Sam Alba <sam.alba@gmail.com>
Sam Bailey <cyprix@cyprix.com.au> Sam Bailey <cyprix@cyprix.com.au>
Sam J Sharpe <sam.sharpe@digital.cabinet-office.gov.uk> Sam J Sharpe <sam.sharpe@digital.cabinet-office.gov.uk>
Sam Reis <sreis@atlassian.com> Sam Reis <sreis@atlassian.com>
Sam Rijs <srijs@airpost.net> Sam Rijs <srijs@airpost.net>
Sami Wagiaalla <swagiaal@redhat.com>
Samuel Andaya <samuel@andaya.net> Samuel Andaya <samuel@andaya.net>
Samuel PHAN <samuel-phan@users.noreply.github.com> Samuel PHAN <samuel-phan@users.noreply.github.com>
Satnam Singh <satnam@raintown.org>
satoru <satorulogic@gmail.com> satoru <satorulogic@gmail.com>
Satoshi Amemiya <satoshi_amemiya@voyagegroup.com> Satoshi Amemiya <satoshi_amemiya@voyagegroup.com>
Scott Bessler <scottbessler@gmail.com> Scott Bessler <scottbessler@gmail.com>
Scott Collier <emailscottcollier@gmail.com> Scott Collier <emailscottcollier@gmail.com>
Scott Johnston <scott@docker.com> Scott Johnston <scott@docker.com>
Scott Stamp <scottstamp851@gmail.com>
Scott Walls <sawalls@umich.edu> Scott Walls <sawalls@umich.edu>
Sean Cronin <seancron@gmail.com> Sean Cronin <seancron@gmail.com>
Sean P. Kane <skane@newrelic.com> Sean P. Kane <skane@newrelic.com>
Sebastiaan van Stijn <github@gone.nl> Sebastiaan van Stijn <github@gone.nl>
Sébastien Luttringer <seblu@seblu.net>
Sébastien <sebastien@yoozio.com>
Sébastien Stormacq <sebsto@users.noreply.github.com>
Senthil Kumar Selvaraj <senthil.thecoder@gmail.com> Senthil Kumar Selvaraj <senthil.thecoder@gmail.com>
SeongJae Park <sj38.park@gmail.com> SeongJae Park <sj38.park@gmail.com>
Shane Canon <scanon@lbl.gov> Shane Canon <scanon@lbl.gov>
@@ -598,12 +644,12 @@ shaunol <shaunol@gmail.com>
Shawn Landden <shawn@churchofgit.com> Shawn Landden <shawn@churchofgit.com>
Shawn Siefkas <shawn.siefkas@meredith.com> Shawn Siefkas <shawn.siefkas@meredith.com>
Shih-Yuan Lee <fourdollars@gmail.com> Shih-Yuan Lee <fourdollars@gmail.com>
Shishir Mahajan <shishir.mahajan@redhat.com>
shuai-z <zs.broccoli@gmail.com> shuai-z <zs.broccoli@gmail.com>
Silas Sewell <silas@sewell.org> Silas Sewell <silas@sewell.org>
Simon Taranto <simon.taranto@gmail.com> Simon Taranto <simon.taranto@gmail.com>
Sindhu S <sindhus@live.in> Sindhu S <sindhus@live.in>
Sjoerd Langkemper <sjoerd-github@linuxonly.nl> Sjoerd Langkemper <sjoerd-github@linuxonly.nl>
s-ko <aleks@s-ko.net>
Solomon Hykes <solomon@docker.com> Solomon Hykes <solomon@docker.com>
Song Gao <song@gao.io> Song Gao <song@gao.io>
Soulou <leo@unbekandt.eu> Soulou <leo@unbekandt.eu>
@@ -611,18 +657,23 @@ soulshake <amy@gandi.net>
Sridatta Thatipamala <sthatipamala@gmail.com> Sridatta Thatipamala <sthatipamala@gmail.com>
Sridhar Ratnakumar <sridharr@activestate.com> Sridhar Ratnakumar <sridharr@activestate.com>
Srini Brahmaroutu <sbrahma@us.ibm.com> Srini Brahmaroutu <sbrahma@us.ibm.com>
Srini Brahmaroutu <srbrahma@us.ibm.com>
Steeve Morin <steeve.morin@gmail.com> Steeve Morin <steeve.morin@gmail.com>
Stefan Praszalowicz <stefan@greplin.com> Stefan Praszalowicz <stefan@greplin.com>
Stephen Crosby <stevecrozz@gmail.com> Stephen Crosby <stevecrozz@gmail.com>
Steven Burgess <steven.a.burgess@hotmail.com> Steven Burgess <steven.a.burgess@hotmail.com>
Steven Merrill <steven.merrill@gmail.com> Steven Merrill <steven.merrill@gmail.com>
sudosurootdev <sudosurootdev@gmail.com>
Sven Dowideit <SvenDowideit@home.org.au> Sven Dowideit <SvenDowideit@home.org.au>
Sylvain Bellemare <sylvain.bellemare@ezeep.com> Sylvain Bellemare <sylvain.bellemare@ezeep.com>
Sébastien <sebastien@yoozio.com>
Sébastien Luttringer <seblu@seblu.net>
Sébastien Stormacq <sebsto@users.noreply.github.com>
tang0th <tang0th@gmx.com> tang0th <tang0th@gmx.com>
Tatsuki Sugiura <sugi@nemui.org> Tatsuki Sugiura <sugi@nemui.org>
Tatsushi Inagaki <e29253@jp.ibm.com>
Ted M. Young <tedyoung@gmail.com> Ted M. Young <tedyoung@gmail.com>
Tehmasp Chaudhri <tehmasp@gmail.com> Tehmasp Chaudhri <tehmasp@gmail.com>
Tejesh Mehta <tejesh.mehta@gmail.com>
Thatcher Peskens <thatcher@docker.com> Thatcher Peskens <thatcher@docker.com>
Thermionix <bond711@gmail.com> Thermionix <bond711@gmail.com>
Thijs Terlouw <thijsterlouw@gmail.com> Thijs Terlouw <thijsterlouw@gmail.com>
@@ -636,11 +687,10 @@ Tianon Gravi <admwiggin@gmail.com>
Tibor Vass <teabee89@gmail.com> Tibor Vass <teabee89@gmail.com>
Tim Bosse <taim@bosboot.org> Tim Bosse <taim@bosboot.org>
Tim Hockin <thockin@google.com> Tim Hockin <thockin@google.com>
Timothy Hobbs <timothyhobbs@seznam.cz>
Tim Ruffles <oi@truffles.me.uk> Tim Ruffles <oi@truffles.me.uk>
Tim Smith <timbot@google.com> Tim Smith <timbot@google.com>
Tim Terhorst <mynamewastaken+git@gmail.com> Tim Terhorst <mynamewastaken+git@gmail.com>
tjmehta <tj@init.me> Timothy Hobbs <timothyhobbs@seznam.cz>
tjwebb123 <tjwebb123@users.noreply.github.com> tjwebb123 <tjwebb123@users.noreply.github.com>
tobe <tobegit3hub@gmail.com> tobe <tobegit3hub@gmail.com>
Tobias Bieniek <Tobias.Bieniek@gmx.de> Tobias Bieniek <Tobias.Bieniek@gmx.de>
@@ -648,10 +698,12 @@ Tobias Gesellchen <tobias@gesellix.de>
Tobias Schmidt <ts@soundcloud.com> Tobias Schmidt <ts@soundcloud.com>
Tobias Schwab <tobias.schwab@dynport.de> Tobias Schwab <tobias.schwab@dynport.de>
Todd Lunter <tlunter@gmail.com> Todd Lunter <tlunter@gmail.com>
Tomasz Lipinski <tlipinski@users.noreply.github.com>
Tom Fotherby <tom+github@peopleperhour.com> Tom Fotherby <tom+github@peopleperhour.com>
Tom Hulihan <hulihan.tom159@gmail.com> Tom Hulihan <hulihan.tom159@gmail.com>
Tom Maaswinkel <tom.maaswinkel@12wiki.eu> Tom Maaswinkel <tom.maaswinkel@12wiki.eu>
Tomas Tomecek <ttomecek@redhat.com>
Tomasz Lipinski <tlipinski@users.noreply.github.com>
Tomasz Nurkiewicz <nurkiewicz@gmail.com>
Tommaso Visconti <tommaso.visconti@gmail.com> Tommaso Visconti <tommaso.visconti@gmail.com>
Tonis Tiigi <tonistiigi@gmail.com> Tonis Tiigi <tonistiigi@gmail.com>
Tony Daws <tony@daws.ca> Tony Daws <tony@daws.ca>
@@ -662,7 +714,8 @@ Trent Ogren <tedwardo2@gmail.com>
Tyler Brock <tyler.brock@gmail.com> Tyler Brock <tyler.brock@gmail.com>
Tzu-Jung Lee <roylee17@gmail.com> Tzu-Jung Lee <roylee17@gmail.com>
Ulysse Carion <ulyssecarion@gmail.com> Ulysse Carion <ulyssecarion@gmail.com>
unclejack <unclejacksons@gmail.com> unknown <sebastiaan@ws-key-sebas3.dpi1.dpi>
Vaidas Jablonskis <jablonskis@gmail.com>
vgeta <gopikannan.venugopalsamy@gmail.com> vgeta <gopikannan.venugopalsamy@gmail.com>
Victor Coisne <victor.coisne@dotcloud.com> Victor Coisne <victor.coisne@dotcloud.com>
Victor Lyuboslavsky <victor@victoreda.com> Victor Lyuboslavsky <victor@victoreda.com>
@@ -691,15 +744,15 @@ Walter Leibbrandt <github@wrl.co.za>
Walter Stanish <walter@pratyeka.org> Walter Stanish <walter@pratyeka.org>
Ward Vandewege <ward@jhvc.com> Ward Vandewege <ward@jhvc.com>
WarheadsSE <max@warheads.net> WarheadsSE <max@warheads.net>
Wayne Chang <wayne@neverfear.org>
Wes Morgan <cap10morgan@gmail.com> Wes Morgan <cap10morgan@gmail.com>
Will Dietz <w@wdtz.org> Will Dietz <w@wdtz.org>
Will Rouesnel <w.rouesnel@gmail.com>
Will Weaver <monkey@buildingbananas.com>
William Delanoue <william.delanoue@gmail.com> William Delanoue <william.delanoue@gmail.com>
William Henry <whenry@redhat.com> William Henry <whenry@redhat.com>
William Riancho <wr.wllm@gmail.com> William Riancho <wr.wllm@gmail.com>
William Thurston <thurstw@amazon.com> William Thurston <thurstw@amazon.com>
Will Rouesnel <w.rouesnel@gmail.com>
Will Weaver <monkey@buildingbananas.com>
wyc <wayne@neverfear.org>
Xiuming Chen <cc@cxm.cc> Xiuming Chen <cc@cxm.cc>
xuzhaokui <cynicholas@gmail.com> xuzhaokui <cynicholas@gmail.com>
Yang Bai <hamo.by@gmail.com> Yang Bai <hamo.by@gmail.com>
@@ -715,4 +768,6 @@ Zilin Du <zilin.du@gmail.com>
zimbatm <zimbatm@zimbatm.com> zimbatm <zimbatm@zimbatm.com>
Zoltan Tombol <zoltan.tombol@gmail.com> Zoltan Tombol <zoltan.tombol@gmail.com>
zqh <zqhxuyuan@gmail.com> zqh <zqhxuyuan@gmail.com>
Álex González <agonzalezro@gmail.com>
Álvaro Lázaro <alvaro.lazaro.g@gmail.com>
尹吉峰 <jifeng.yin@gmail.com> 尹吉峰 <jifeng.yin@gmail.com>
+39
View File
@@ -1,5 +1,44 @@
# Changelog # Changelog
## 1.5.0 (2015-02-10)
#### Builder
+ Dockerfile to use for a given `docker build` can be specified with the `-f` flag
* Dockerfile and .dockerignore files can be themselves excluded as part of the .dockerignore file, thus preventing modifications to these files invalidating ADD or COPY instructions cache
* ADD and COPY instructions accept relative paths
* Dockerfile `FROM scratch` instruction is now interpreted as a no-base specifier
* Improve performance when exposing a large number of ports
#### Hack
+ Allow client-side only integration tests for Windows
* Include docker-py integration tests against Docker daemon as part of our test suites
#### Packaging
+ Support for the new version of the registry HTTP API
* Speed up `docker push` for images with a majority of already existing layers
- Fixed contacting a private registry through a proxy
#### Remote API
+ A new endpoint will stream live container resource metrics and can be accessed with the `docker stats` command
+ Containers can be renamed using the new `rename` endpoint and the associated `docker rename` command
* Container `inspect` endpoint show the ID of `exec` commands running in this container
* Container `inspect` endpoint show the number of times Docker auto-restarted the container
* New types of event can be streamed by the `events` endpoint: OOM (container died with out of memory), exec_create, and exec_start'
- Fixed returned string fields which hold numeric characters incorrectly omitting surrounding double quotes
#### Runtime
+ Docker daemon has full IPv6 support
+ The `docker run` command can take the `--pid=host` flag to use the host PID namespace, which makes it possible for example to debug host processes using containerized debugging tools
+ The `docker run` command can take the `--read-only` flag to make the containers root filesystem mounted as readonly, which can be used in combination with volumes to force a containers processes to only write to locations that will be persisted
+ Container total memory usage can be limited for `docker run` using the `—memory-swap` flag
* Major stability improvements for devicemapper storage driver
* Better integration with host system: containers will reflect changes to the host's `/etc/resolv.conf` file when restarted
* Better integration with host system: per-container iptable rules are moved to the DOCKER chain
- Fixed container exiting on out of memory to return an invalid exit code
#### Other
* The HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables are properly taken into account by the client when connecting to the Docker daemon
## 1.4.1 (2014-12-15) ## 1.4.1 (2014-12-15)
#### Runtime #### Runtime
+1 -1
View File
@@ -211,7 +211,7 @@ component affected. For example, if a change affects `docs/` and `registry/`, it
needs an absolute majority from the maintainers of `docs/` AND, separately, an needs an absolute majority from the maintainers of `docs/` AND, separately, an
absolute majority of the maintainers of `registry/`. absolute majority of the maintainers of `registry/`.
For more details see [MAINTAINERS.md](project/MAINTAINERS.md) For more details see [MAINTAINERS](MAINTAINERS)
### Sign your work ### Sign your work
+9 -3
View File
@@ -84,8 +84,10 @@ RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
ENV DOCKER_CROSSPLATFORMS \ ENV DOCKER_CROSSPLATFORMS \
linux/386 linux/arm \ linux/386 linux/arm \
darwin/amd64 darwin/386 \ darwin/amd64 darwin/386 \
freebsd/amd64 freebsd/386 freebsd/arm \ freebsd/amd64 freebsd/386 freebsd/arm
windows/amd64 windows/386
# TODO when https://jenkins.dockerproject.com/job/Windows/ is green, add windows back to the list above
# windows/amd64 windows/386
# (set an explicit GOARM of 5 for maximum compatibility) # (set an explicit GOARM of 5 for maximum compatibility)
ENV GOARM 5 ENV GOARM 5
@@ -149,10 +151,14 @@ ENV DOCKER_BUILDTAGS apparmor selinux btrfs_noversion
COPY vendor /go/src/github.com/docker/docker/vendor COPY vendor /go/src/github.com/docker/docker/vendor
# (copy vendor/ because go-md2man needs golang.org/x/net) # (copy vendor/ because go-md2man needs golang.org/x/net)
RUN set -x \ RUN set -x \
&& git clone -b v1 https://github.com/cpuguy83/go-md2man.git /go/src/github.com/cpuguy83/go-md2man \ && git clone -b v1.0.1 https://github.com/cpuguy83/go-md2man.git /go/src/github.com/cpuguy83/go-md2man \
&& git clone -b v1.2 https://github.com/russross/blackfriday.git /go/src/github.com/russross/blackfriday \ && git clone -b v1.2 https://github.com/russross/blackfriday.git /go/src/github.com/russross/blackfriday \
&& go install -v github.com/cpuguy83/go-md2man && go install -v github.com/cpuguy83/go-md2man
# install toml validator
RUN git clone -b v0.1.0 https://github.com/BurntSushi/toml.git /go/src/github.com/BurntSushi/toml \
&& go install -v github.com/BurntSushi/toml/cmd/tomlv
# Wrap all commands in the "docker-in-docker" script to allow nested containers # Wrap all commands in the "docker-in-docker" script to allow nested containers
ENTRYPOINT ["hack/dind"] ENTRYPOINT ["hack/dind"]
+590 -9
View File
@@ -1,9 +1,590 @@
Solomon Hykes <solomon@docker.com> (@shykes) # Docker maintainers file
Victor Vieux <vieux@docker.com> (@vieux) #
Michael Crosby <michael@crosbymichael.com> (@crosbymichael) # This file describes who runs the Docker project and how.
.mailmap: Tianon Gravi <admwiggin@gmail.com> (@tianon) # This is a living document - if you see something out of date or missing,
.travis.yml: Tianon Gravi <admwiggin@gmail.com> (@tianon) # speak up!
AUTHORS: Tianon Gravi <admwiggin@gmail.com> (@tianon) #
Dockerfile: Tianon Gravi <admwiggin@gmail.com> (@tianon) # It is structured to be consumable by both humans and programs.
Makefile: Tianon Gravi <admwiggin@gmail.com> (@tianon) # To extract its contents programmatically, use any TOML-compliant
.dockerignore: Tianon Gravi <admwiggin@gmail.com> (@tianon) # parser.
[Rules]
[Rules.maintainers]
title = "What is a maintainer?"
text = """
There are different types of maintainers, with different responsibilities, but
all maintainers have 3 things in common:
1) They share responsibility in the project's success.
2) They have made a long-term, recurring time investment to improve the project.
3) They spend that time doing whatever needs to be done, not necessarily what
is the most interesting or fun.
Maintainers are often under-appreciated, because their work is harder to appreciate.
It's easy to appreciate a really cool and technically advanced feature. It's harder
to appreciate the absence of bugs, the slow but steady improvement in stability,
or the reliability of a release process. But those things distinguish a good
project from a great one.
"""
[Rules.bdfl]
title = "The Benevolent dictator for life (BDFL)"
text = """
Docker follows the timeless, highly efficient and totally unfair system
known as [Benevolent dictator for
life](http://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life), with
yours truly, Solomon Hykes, in the role of BDFL. This means that all
decisions are made, by default, by Solomon. Since making every decision
myself would be highly un-scalable, in practice decisions are spread
across multiple maintainers.
Ideally, the BDFL role is like the Queen of England: awesome crown, but not
an actual operational role day-to-day. The real job of a BDFL is to NEVER GO AWAY.
Every other rule can change, perhaps drastically so, but the BDFL will always
be there, preserving the philosophy and principles of the project, and keeping
ultimate authority over its fate. This gives us great flexibility in experimenting
with various governance models, knowing that we can always press the "reset" button
without fear of fragmentation or deadlock. See the US congress for a counter-example.
BDFL daily routine:
* Is the project governance stuck in a deadlock or irreversibly fragmented?
* If yes: refactor the project governance
* Are there issues or conflicts escalated by core?
* If yes: resolve them
* Go back to polishing that crown.
"""
[Rules.decisions]
title = "How are decisions made?"
text = """
Short answer: EVERYTHING IS A PULL REQUEST.
Docker is an open-source project with an open design philosophy. This
means that the repository is the source of truth for EVERY aspect of the
project, including its philosophy, design, road map, and APIs. *If it's
part of the project, it's in the repo. If it's in the repo, it's part of
the project.*
As a result, all decisions can be expressed as changes to the
repository. An implementation change is a change to the source code. An
API change is a change to the API specification. A philosophy change is
a change to the philosophy manifesto, and so on.
All decisions affecting Docker, big and small, follow the same 3 steps:
* Step 1: Open a pull request. Anyone can do this.
* Step 2: Discuss the pull request. Anyone can do this.
* Step 3: Merge or refuse the pull request. Who does this depends on the nature
of the pull request and which areas of the project it affects. See *review flow*
for details.
Because Docker is such a large and active project, it's important for everyone to know
who is responsible for deciding what. That is determined by a precise set of rules.
* For every *decision* in the project, the rules should designate, in a deterministic way,
who should *decide*.
* For every *problem* in the project, the rules should designate, in a deterministic way,
who should be responsible for *fixing* it.
* For every *question* in the project, the rules should designate, in a deterministic way,
who should be expected to have the *answer*.
"""
[Rules.review]
title = "Review flow"
text = """
Pull requests should be processed according to the following flow:
* For each subsystem affected by the change, the maintainers of the subsystem must approve or refuse it.
It is the responsibility of the subsystem maintainers to process patches affecting them in a timely
manner.
* If the change affects areas of the code which are not part of a subsystem,
or if subsystem maintainers are unable to reach a timely decision, it must be approved by
the core maintainers.
* If the change affects the UI or public APIs, or if it represents a major change in architecture,
the architects must approve or refuse it.
* If the change affects the operations of the project, it must be approved or rejected by
the relevant operators.
* If the change affects the governance, philosophy, goals or principles of the project,
it must be approved by BDFL.
* A pull request can be in 1 of 5 distinct states, for each of which there is a corresponding label
that needs to be applied. `Rules.review.states` contains the list of states with possible targets
for each.
"""
# Triage
[Rules.review.states.0-triage]
# Maintainers are expected to triage new incoming pull requests by removing
# the `0-triage` label and adding the correct labels (e.g. `1-design-review`)
# potentially skipping some steps depending on the kind of pull request.
# Use common sense for judging.
#
# Checking for DCO should be done at this stage.
#
# If an owner, responsible for closing or merging, can be assigned to the PR,
# the better.
close = "e.g. unresponsive contributor without DCO"
3-docs-review = "non-proposal documentation-only change"
2-code-review = "e.g. trivial bugfix"
1-design-review = "general case"
# Design review
[Rules.review.states.1-design-review]
# Maintainers are expected to comment on the design of the pull request.
# Review of documentation is expected only in the context of design validation,
# not for stylistic changes.
#
# Ideally, documentation should reflect the expected behavior of the code.
# No code review should take place in this step.
#
# Once design is approved, a maintainer should make sure to remove this label
# and add the next one.
close = "design rejected"
3-docs-review = "proposals with only documentation changes"
2-code-review = "general case"
# Code review
[Rules.review.states.2-code-review]
# Maintainers are expected to review the code and ensure that it is good
# quality and in accordance with the documentation in the PR.
#
# If documentation is absent but expected, maintainers should ask for documentation.
#
# All tests should pass.
#
# Once code is approved according to the rules of the subsystem, a maintainer
# should make sure to remove this label and add the next one.
close = ""
1-design-review = "raises design concerns"
4-merge = "trivial change not impacting documentation"
3-docs-review = "general case"
# Docs review
[Rules.review.states.3-docs-review]
# Maintainers are expected to review the documentation in its bigger context,
# ensuring consistency, completeness, validity, and breadth of coverage across
# all extent and new documentation.
#
# They should ask for any editorial change that makes the documentation more
# consistent and easier to understand.
#
# Once documentation is approved, a maintainer should make sure to remove this
# label and add the next one.
close = ""
2-code-review = "requires more code changes"
1-design-review = "raises design concerns"
4-merge = "general case"
# Merge
[Rules.review.states.4-merge]
# Maintainers are expected to merge this pull request as soon as possible.
# They can ask for a rebase, or carry the pull request themselves.
# These should be the easy PRs to merge.
close = "carry PR"
merge = ""
[Rules.DCO]
title = "Helping contributors with the DCO"
text = """
The [DCO or `Sign your work`](
https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work)
requirement is not intended as a roadblock or speed bump.
Some Docker contributors are not as familiar with `git`, or have used a web based
editor, and thus asking them to `git commit --amend -s` is not the best way forward.
In this case, maintainers can update the commits based on clause (c) of the DCO. The
most trivial way for a contributor to allow the maintainer to do this, is to add
a DCO signature in a Pull Requests's comment, or a maintainer can simply note that
the change is sufficiently trivial that it does not substantivly change the existing
contribution - i.e., a spelling change.
When you add someone's DCO, please also add your own to keep a log.
"""
[Rules.holiday]
title = "I'm a maintainer, and I'm going on holiday"
text = """
Please let your co-maintainers and other contributors know by raising a pull
request that comments out your `MAINTAINERS` file entry using a `#`.
"""
[Rules."no direct push"]
title = "I'm a maintainer. Should I make pull requests too?"
text = """
Yes. Nobody should ever push to master directly. All changes should be
made through a pull request.
"""
[Rules.meta]
title = "How is this process changed?"
text = "Just like everything else: by making a pull request :)"
# Current project organization
[Org]
bdfl = "shykes"
# The chief architect is responsible for the overall integrity of the technical architecture
# across all subsystems, and the consistency of APIs and UI.
#
# Changes to UI, public APIs and overall architecture (for example a plugin system) must
# be approved by the chief architect.
"Chief Architect" = "shykes"
# The Chief Operator is responsible for the day-to-day operations of the project including:
# - facilitating communications amongst all the contributors;
# - tracking release schedules;
# - managing the relationship with downstream distributions and upstream dependencies;
# - helping new contributors to get involved and become successful contributors and maintainers
#
# The role is also responsible for managing and measuring the success of the overall project
# and ensuring it is governed properly working in concert with the Docker Governance Advisory Board (DGAB).
"Chief Operator" = "spf13"
[Org.Operators]
# The operators make sure the trains run on time. They are responsible for overall operations
# of the project. This includes facilitating communication between all the participants; helping
# newcomers get involved and become successful contributors and maintainers; tracking the schedule
# of releases; managing the relationship with downstream distributions and upstream dependencies;
# define measures of success for the project and measure progress; Devise and implement tools and
# processes which make contributors and maintainers happier and more efficient.
[Org.Operators.security]
people = [
"erw"
]
[Org.Operators."monthly meetings"]
people = [
"sven",
"tianon"
]
[Org.Operators.infrastructure]
people = [
"jfrazelle",
"crosbymichael"
]
# The chief maintainer is responsible for all aspects of quality for the project including
# code reviews, usability, stability, security, performance, etc.
# The most important function of the chief maintainer is to lead by example. On the first
# day of a new maintainer, the best advice should be "follow the C.M.'s example and you'll
# be fine".
"Chief Maintainer" = "crosbymichael"
[Org."Core maintainers"]
# The Core maintainers are the ghostbusters of the project: when there's a problem others
# can't solve, they show up and fix it with bizarre devices and weaponry.
# They have final say on technical implementation and coding style.
# They are ultimately responsible for quality in all its forms: usability polish,
# bugfixes, performance, stability, etc. When ownership can cleanly be passed to
# a subsystem, they are responsible for doing so and holding the
# subsystem maintainers accountable. If ownership is unclear, they are the de facto owners.
# For each release (including minor releases), a "release captain" is assigned from the
# pool of core maintainers. Rotation is encouraged across all maintainers, to ensure
# the release process is clear and up-to-date.
#
# It is common for core maintainers to "branch out" to join or start a subsystem.
people = [
"unclejack",
"crosbymichael",
"erikh",
"icecrime",
"jfrazelle",
"lk4d4",
"tibor",
"vbatts",
"vieux",
"vish"
]
[Org.Subsystems]
# As the project grows, it gets separated into well-defined subsystems. Each subsystem
# has a dedicated group of maintainers, which are dedicated to that subsytem and responsible
# for its quality.
# This "cellular division" is the primary mechanism for scaling maintenance of the project as it grows.
#
# The maintainers of each subsytem are responsible for:
#
# 1. Exposing a clear road map for improving their subsystem.
# 2. Deliver prompt feedback and decisions on pull requests affecting their subsystem.
# 3. Be available to anyone with questions, bug reports, criticism etc.
# on their component. This includes IRC, GitHub requests and the mailing
# list.
# 4. Make sure their subsystem respects the philosophy, design and
# road map of the project.
#
# #### How to review patches to your subsystem
#
# Accepting pull requests:
#
# - If the pull request appears to be ready to merge, give it a `LGTM`, which
# stands for "Looks Good To Me".
# - If the pull request has some small problems that need to be changed, make
# a comment adressing the issues.
# - If the changes needed to a PR are small, you can add a "LGTM once the
# following comments are adressed..." this will reduce needless back and
# forth.
# - If the PR only needs a few changes before being merged, any MAINTAINER can
# make a replacement PR that incorporates the existing commits and fixes the
# problems before a fast track merge.
#
# Closing pull requests:
#
# - If a PR appears to be abandoned, after having attempted to contact the
# original contributor, then a replacement PR may be made. Once the
# replacement PR is made, any contributor may close the original one.
# - If you are not sure if the pull request implements a good feature or you
# do not understand the purpose of the PR, ask the contributor to provide
# more documentation. If the contributor is not able to adequately explain
# the purpose of the PR, the PR may be closed by any MAINTAINER.
# - If a MAINTAINER feels that the pull request is sufficiently architecturally
# flawed, or if the pull request needs significantly more design discussion
# before being considered, the MAINTAINER should close the pull request with
# a short explanation of what discussion still needs to be had. It is
# important not to leave such pull requests open, as this will waste both the
# MAINTAINER's time and the contributor's time. It is not good to string a
# contributor on for weeks or months, having them make many changes to a PR
# that will eventually be rejected.
[Org.Subsystems.Documentation]
people = [
"fredlf",
"james",
"sven",
]
[Org.Subsystems.libcontainer]
people = [
"crosbymichael",
"vmarmol",
"mpatel",
"jnagal",
"lk4d4"
]
[Org.Subsystems.registry]
people = [
"dmp42",
"vbatts",
"joffrey",
"samalba"
]
[Org.Subsystems."build tools"]
people = [
"shykes",
"tianon"
]
[Org.Subsystem."remote api"]
people = [
"vieux"
]
[Org.Subsystem.swarm]
people = [
"aluzzardi",
"vieux"
]
[Org.Subsystem.machine]
people = [
"bfirsh",
"ehazlett"
]
[Org.Subsystem.compose]
people = [
"aanand"
]
[Org.Subsystem.builder]
people = [
"erikh",
"tibor",
"duglin"
]
[people]
# A reference list of all people associated with the project.
# All other sections should refer to people by their canonical key
# in the people section.
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
[people.aanand]
Name = "Aanand Prasad"
Email = "aanand@docker.com"
GitHub = "aanand"
[people.aluzzardi]
Name = "Andrea Luzzardi"
Email = "aluzzardi@docker.com"
GitHub = "aluzzardi"
[people.bfirsh]
Name = "Ben Firshman"
Email = "ben@firshman.co.uk"
GitHub = "bfirsh"
[people.crosbymichael]
Name = "Michael Crosby"
Email = "crosbymichael@gmail.com"
GitHub = "crosbymichael"
[people.duglin]
Name = "Doug Davis"
Email = "dug@us.ibm.com"
GitHub = "duglin"
[people.ehazlett]
Name = "Evan Hazlett"
Email = "ejhazlett@gmail.com"
GitHub = "ehazlett"
[people.erikh]
Name = "Erik Hollensbe"
Email = "erik@docker.com"
GitHub = "erikh"
[people.erw]
Name = "Eric Windisch"
Email = "eric@windisch.us"
GitHub = "ewindisch"
[people.icecrime]
Name = "Arnaud Porterie"
Email = "arnaud@docker.com"
GitHub = "icecrime"
[people.jfrazelle]
Name = "Jessie Frazelle"
Email = "jess@docker.com"
GitHub = "jfrazelle"
[people.lk4d4]
Name = "Alexander Morozov"
Email = "lk4d4@docker.com"
GitHub = "lk4d4"
[people.shykes]
Name = "Solomon Hykes"
Email = "solomon@docker.com"
GitHub = "shykes"
[people.spf13]
Name = "Steve Francia"
Email = "steve.francia@gmail.com"
GitHub = "spf13"
[people.sven]
Name = "Sven Dowideit"
Email = "SvenDowideit@home.org.au"
GitHub = "SvenDowideit"
[people.tianon]
Name = "Tianon Gravi"
Email = "admwiggin@gmail.com"
GitHub = "tianon"
[people.tibor]
Name = "Tibor Vass"
Email = "tibor@docker.com"
GitHub = "tiborvass"
[people.vbatts]
Name = "Vincent Batts"
Email = "vbatts@redhat.com"
GitHub = "vbatts"
[people.vieux]
Name = "Victor Vieux"
Email = "vieux@docker.com"
GitHub = "vieux"
[people.vmarmol]
Name = "Victor Marmol"
Email = "vmarmol@google.com"
GitHub = "vmarmol"
[people.jnagal]
Name = "Rohit Jnagal"
Email = "jnagal@google.com"
GitHub = "rjnagal"
[people.mpatel]
Name = "Mrunal Patel"
Email = "mpatel@redhat.com"
GitHub = "mrunalp"
[people.unclejack]
Name = "Cristian Staretu"
Email = "cristian.staretu@gmail.com"
GitHub = "unclejack"
[people.vish]
Name = "Vishnu Kannan"
Email = "vishnuk@google.com"
GitHub = "vishh"
+1 -1
View File
@@ -74,7 +74,7 @@ test-docker-py: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary test-docker-py $(DOCKER_RUN_DOCKER) hack/make.sh binary test-docker-py
validate: build validate: build
$(DOCKER_RUN_DOCKER) hack/make.sh validate-gofmt validate-dco $(DOCKER_RUN_DOCKER) hack/make.sh validate-gofmt validate-dco validate-toml
shell: build shell: build
$(DOCKER_RUN_DOCKER) bash $(DOCKER_RUN_DOCKER) bash
+8
View File
@@ -195,6 +195,14 @@ Don't know how to use that super cool new feature in the master build? Check
out the master docs at out the master docs at
[docs.master.dockerproject.com](http://docs.master.dockerproject.com). [docs.master.dockerproject.com](http://docs.master.dockerproject.com).
How the project is run
======================
Docker is a very, very active project. If you want to learn more about how it is run,
or want to get more involved, the best place to start is [the project directory](https://github.com/docker/docker/tree/master/project).
We are always open to suggestions on process improvements, and are always looking for more maintainers.
### Legal ### Legal
*Brought to you courtesy of our legal counsel. For more context, *Brought to you courtesy of our legal counsel. For more context,
+1 -1
View File
@@ -1 +1 @@
1.4.1-dev 1.5.0
+3 -4
View File
@@ -17,7 +17,6 @@ import (
flag "github.com/docker/docker/pkg/mflag" flag "github.com/docker/docker/pkg/mflag"
"github.com/docker/docker/pkg/term" "github.com/docker/docker/pkg/term"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/libtrust"
) )
type DockerCli struct { type DockerCli struct {
@@ -27,7 +26,7 @@ type DockerCli struct {
in io.ReadCloser in io.ReadCloser
out io.Writer out io.Writer
err io.Writer err io.Writer
key libtrust.PrivateKey keyFile string
tlsConfig *tls.Config tlsConfig *tls.Config
scheme string scheme string
// inFd holds file descriptor of the client's STDIN, if it's a valid file // inFd holds file descriptor of the client's STDIN, if it's a valid file
@@ -122,7 +121,7 @@ func (cli *DockerCli) CheckTtyInput(attachStdin, ttyMode bool) error {
return nil return nil
} }
func NewDockerCli(in io.ReadCloser, out, err io.Writer, key libtrust.PrivateKey, proto, addr string, tlsConfig *tls.Config) *DockerCli { func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, addr string, tlsConfig *tls.Config) *DockerCli {
var ( var (
inFd uintptr inFd uintptr
outFd uintptr outFd uintptr
@@ -177,7 +176,7 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, key libtrust.PrivateKey,
in: in, in: in,
out: out, out: out,
err: err, err: err,
key: key, keyFile: keyFile,
inFd: inFd, inFd: inFd,
outFd: outFd, outFd: outFd,
isTerminalIn: isTerminalIn, isTerminalIn: isTerminalIn,
+60 -58
View File
@@ -39,6 +39,7 @@ import (
"github.com/docker/docker/pkg/parsers/filters" "github.com/docker/docker/pkg/parsers/filters"
"github.com/docker/docker/pkg/promise" "github.com/docker/docker/pkg/promise"
"github.com/docker/docker/pkg/signal" "github.com/docker/docker/pkg/signal"
"github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/pkg/term" "github.com/docker/docker/pkg/term"
"github.com/docker/docker/pkg/timeutils" "github.com/docker/docker/pkg/timeutils"
"github.com/docker/docker/pkg/units" "github.com/docker/docker/pkg/units"
@@ -46,7 +47,6 @@ import (
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
"github.com/docker/libtrust"
) )
const ( const (
@@ -148,36 +148,36 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
return err return err
} }
var filename string // path to Dockerfile filename := *dockerfileName // path to Dockerfile
var origDockerfile string // used for error msg
if *dockerfileName == "" { if *dockerfileName == "" {
// No -f/--file was specified so use the default // No -f/--file was specified so use the default
origDockerfile = api.DefaultDockerfileName *dockerfileName = api.DefaultDockerfileName
*dockerfileName = origDockerfile
filename = path.Join(absRoot, *dockerfileName) filename = path.Join(absRoot, *dockerfileName)
} else {
origDockerfile = *dockerfileName
if filename, err = filepath.Abs(*dockerfileName); err != nil {
return err
}
// Verify that 'filename' is within the build context
if !strings.HasSuffix(absRoot, string(os.PathSeparator)) {
absRoot += string(os.PathSeparator)
}
if !strings.HasPrefix(filename, absRoot) {
return fmt.Errorf("The Dockerfile (%s) must be within the build context (%s)", *dockerfileName, root)
}
// Now reset the dockerfileName to be relative to the build context
*dockerfileName = filename[len(absRoot):]
} }
if _, err = os.Stat(filename); os.IsNotExist(err) { origDockerfile := *dockerfileName // used for error msg
return fmt.Errorf("Can not locate Dockerfile: %s", origDockerfile)
if filename, err = filepath.Abs(filename); err != nil {
return err
} }
var includes []string = []string{"."}
// Verify that 'filename' is within the build context
filename, err = symlink.FollowSymlinkInScope(filename, absRoot)
if err != nil {
return fmt.Errorf("The Dockerfile (%s) must be within the build context (%s)", origDockerfile, root)
}
// Now reset the dockerfileName to be relative to the build context
*dockerfileName, err = filepath.Rel(absRoot, filename)
if err != nil {
return err
}
if _, err = os.Lstat(filename); os.IsNotExist(err) {
return fmt.Errorf("Cannot locate Dockerfile: %s", origDockerfile)
}
var includes = []string{"."}
excludes, err := utils.ReadDockerIgnore(path.Join(root, ".dockerignore")) excludes, err := utils.ReadDockerIgnore(path.Join(root, ".dockerignore"))
if err != nil { if err != nil {
@@ -1216,25 +1216,6 @@ func (cli *DockerCli) CmdPush(args ...string) error {
v := url.Values{} v := url.Values{}
v.Set("tag", tag) v.Set("tag", tag)
body, _, err := readBody(cli.call("GET", "/images/"+remote+"/manifest?"+v.Encode(), nil, false))
if err != nil {
return err
}
js, err := libtrust.NewJSONSignature(body)
if err != nil {
return err
}
err = js.Sign(cli.key)
if err != nil {
return err
}
signedBody, err := js.PrettySignature("signatures")
if err != nil {
return err
}
push := func(authConfig registry.AuthConfig) error { push := func(authConfig registry.AuthConfig) error {
buf, err := json.Marshal(authConfig) buf, err := json.Marshal(authConfig)
if err != nil { if err != nil {
@@ -1244,7 +1225,7 @@ func (cli *DockerCli) CmdPush(args ...string) error {
base64.URLEncoding.EncodeToString(buf), base64.URLEncoding.EncodeToString(buf),
} }
return cli.stream("POST", "/images/"+remote+"/push?"+v.Encode(), bytes.NewReader(signedBody), cli.out, map[string][]string{ return cli.stream("POST", "/images/"+remote+"/push?"+v.Encode(), nil, cli.out, map[string][]string{
"X-Registry-Auth": registryAuthHeader, "X-Registry-Auth": registryAuthHeader,
}) })
} }
@@ -2634,7 +2615,12 @@ type containerStats struct {
err error err error
} }
func (s *containerStats) Collect(stream io.ReadCloser) { func (s *containerStats) Collect(cli *DockerCli) {
stream, _, err := cli.call("GET", "/containers/"+s.Name+"/stats", nil, false)
if err != nil {
s.err = err
return
}
defer stream.Close() defer stream.Close()
var ( var (
previousCpu uint64 previousCpu uint64
@@ -2714,28 +2700,44 @@ func (cli *DockerCli) CmdStats(args ...string) error {
names := cmd.Args() names := cmd.Args()
sort.Strings(names) sort.Strings(names)
var cStats []*containerStats var (
for _, n := range names { cStats []*containerStats
s := &containerStats{Name: n} w = tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
cStats = append(cStats, s) )
stream, _, err := cli.call("GET", "/containers/"+n+"/stats", nil, false) printHeader := func() {
if err != nil {
return err
}
go s.Collect(stream)
}
w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
for _ = range time.Tick(500 * time.Millisecond) {
fmt.Fprint(cli.out, "\033[2J") fmt.Fprint(cli.out, "\033[2J")
fmt.Fprint(cli.out, "\033[H") fmt.Fprint(cli.out, "\033[H")
fmt.Fprintln(w, "CONTAINER\tCPU %\tMEM USAGE/LIMIT\tMEM %\tNET I/O") fmt.Fprintln(w, "CONTAINER\tCPU %\tMEM USAGE/LIMIT\tMEM %\tNET I/O")
}
for _, n := range names {
s := &containerStats{Name: n}
cStats = append(cStats, s)
go s.Collect(cli)
}
// do a quick pause so that any failed connections for containers that do not exist are able to be
// evicted before we display the initial or default values.
time.Sleep(500 * time.Millisecond)
var errs []string
for _, c := range cStats {
c.mu.Lock()
if c.err != nil {
errs = append(errs, fmt.Sprintf("%s: %s", c.Name, c.err.Error()))
}
c.mu.Unlock()
}
if len(errs) > 0 {
return fmt.Errorf("%s", strings.Join(errs, ", "))
}
for _ = range time.Tick(500 * time.Millisecond) {
printHeader()
toRemove := []int{} toRemove := []int{}
for i, s := range cStats { for i, s := range cStats {
if err := s.Display(w); err != nil { if err := s.Display(w); err != nil {
toRemove = append(toRemove, i) toRemove = append(toRemove, i)
} }
} }
for _, i := range toRemove { for j := len(toRemove) - 1; j >= 0; j-- {
i := toRemove[j]
cStats = append(cStats[:i], cStats[i+1:]...) cStats = append(cStats[:i], cStats[i+1:]...)
} }
if len(cStats) == 0 { if len(cStats) == 0 {
+18
View File
@@ -72,6 +72,15 @@ func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Con
if err != nil { if err != nil {
return nil, err return nil, err
} }
// When we set up a TCP connection for hijack, there could be long periods
// of inactivity (a long running command with no output) that in certain
// network setups may cause ECONNTIMEOUT, leaving the client in an unknown
// state. Setting TCP KeepAlive on the socket connection will prohibit
// ECONNTIMEOUT unless the socket connection truly is broken
if tcpConn, ok := rawConn.(*net.TCPConn); ok {
tcpConn.SetKeepAlive(true)
tcpConn.SetKeepAlivePeriod(30 * time.Second)
}
colonPos := strings.LastIndex(addr, ":") colonPos := strings.LastIndex(addr, ":")
if colonPos == -1 { if colonPos == -1 {
@@ -140,6 +149,15 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
req.Host = cli.addr req.Host = cli.addr
dial, err := cli.dial() dial, err := cli.dial()
// When we set up a TCP connection for hijack, there could be long periods
// of inactivity (a long running command with no output) that in certain
// network setups may cause ECONNTIMEOUT, leaving the client in an unknown
// state. Setting TCP KeepAlive on the socket connection will prohibit
// ECONNTIMEOUT unless the socket connection truly is broken
if tcpConn, ok := dial.(*net.TCPConn); ok {
tcpConn.SetKeepAlive(true)
tcpConn.SetKeepAlivePeriod(30 * time.Second)
}
if err != nil { if err != nil {
if strings.Contains(err.Error(), "connection refused") { if strings.Contains(err.Error(), "connection refused") {
return fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker -d' running on this host?") return fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker -d' running on this host?")
+3 -3
View File
@@ -4,7 +4,7 @@ import (
"fmt" "fmt"
"mime" "mime"
"os" "os"
"path" "path/filepath"
"strings" "strings"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
@@ -55,7 +55,7 @@ func MatchesContentType(contentType, expectedType string) bool {
// LoadOrCreateTrustKey attempts to load the libtrust key at the given path, // LoadOrCreateTrustKey attempts to load the libtrust key at the given path,
// otherwise generates a new one // otherwise generates a new one
func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) { func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) {
err := os.MkdirAll(path.Dir(trustKeyPath), 0700) err := os.MkdirAll(filepath.Dir(trustKeyPath), 0700)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -69,7 +69,7 @@ func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) {
return nil, fmt.Errorf("Error saving key file: %s", err) return nil, fmt.Errorf("Error saving key file: %s", err)
} }
} else if err != nil { } else if err != nil {
return nil, fmt.Errorf("Error loading key file: %s", err) return nil, fmt.Errorf("Error loading key file %s: %s", trustKeyPath, err)
} }
return trustKey, nil return trustKey, nil
} }
-19
View File
@@ -621,18 +621,6 @@ func getImagesSearch(eng *engine.Engine, version version.Version, w http.Respons
return job.Run() return job.Run()
} }
func getImageManifest(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
if err := parseForm(r); err != nil {
return err
}
job := eng.Job("image_manifest", vars["name"])
job.Setenv("tag", r.Form.Get("tag"))
job.Stdout.Add(utils.NewWriteFlusher(w))
return job.Run()
}
func postImagesPush(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error { func postImagesPush(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
if vars == nil { if vars == nil {
return fmt.Errorf("Missing parameter") return fmt.Errorf("Missing parameter")
@@ -664,15 +652,9 @@ func postImagesPush(eng *engine.Engine, version version.Version, w http.Response
} }
} }
manifest, err := ioutil.ReadAll(r.Body)
if err != nil {
return err
}
job := eng.Job("push", vars["name"]) job := eng.Job("push", vars["name"])
job.SetenvJson("metaHeaders", metaHeaders) job.SetenvJson("metaHeaders", metaHeaders)
job.SetenvJson("authConfig", authConfig) job.SetenvJson("authConfig", authConfig)
job.Setenv("manifest", string(manifest))
job.Setenv("tag", r.Form.Get("tag")) job.Setenv("tag", r.Form.Get("tag"))
if version.GreaterThan("1.0") { if version.GreaterThan("1.0") {
job.SetenvBool("json", true) job.SetenvBool("json", true)
@@ -1325,7 +1307,6 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion st
"/images/viz": getImagesViz, "/images/viz": getImagesViz,
"/images/search": getImagesSearch, "/images/search": getImagesSearch,
"/images/get": getImagesGet, "/images/get": getImagesGet,
"/images/{name:.*}/manifest": getImageManifest,
"/images/{name:.*}/get": getImagesGet, "/images/{name:.*}/get": getImagesGet,
"/images/{name:.*}/history": getImagesHistory, "/images/{name:.*}/history": getImagesHistory,
"/images/{name:.*}/json": getImagesByName, "/images/{name:.*}/json": getImagesByName,
+21 -21
View File
@@ -6,21 +6,21 @@ import "time"
type ThrottlingData struct { type ThrottlingData struct {
// Number of periods with throttling active // Number of periods with throttling active
Periods uint64 `json:"periods,omitempty"` Periods uint64 `json:"periods"`
// Number of periods when the container hit its throttling limit. // Number of periods when the container hit its throttling limit.
ThrottledPeriods uint64 `json:"throttled_periods,omitempty"` ThrottledPeriods uint64 `json:"throttled_periods"`
// Aggregate time the container was throttled for in nanoseconds. // Aggregate time the container was throttled for in nanoseconds.
ThrottledTime uint64 `json:"throttled_time,omitempty"` ThrottledTime uint64 `json:"throttled_time"`
} }
// All CPU stats are aggregated since container inception. // All CPU stats are aggregated since container inception.
type CpuUsage struct { type CpuUsage struct {
// Total CPU time consumed. // Total CPU time consumed.
// Units: nanoseconds. // Units: nanoseconds.
TotalUsage uint64 `json:"total_usage,omitempty"` TotalUsage uint64 `json:"total_usage"`
// Total CPU time consumed per core. // Total CPU time consumed per core.
// Units: nanoseconds. // Units: nanoseconds.
PercpuUsage []uint64 `json:"percpu_usage,omitempty"` PercpuUsage []uint64 `json:"percpu_usage"`
// Time spent by tasks of the cgroup in kernel mode. // Time spent by tasks of the cgroup in kernel mode.
// Units: nanoseconds. // Units: nanoseconds.
UsageInKernelmode uint64 `json:"usage_in_kernelmode"` UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
@@ -30,41 +30,41 @@ type CpuUsage struct {
} }
type CpuStats struct { type CpuStats struct {
CpuUsage CpuUsage `json:"cpu_usage,omitempty"` CpuUsage CpuUsage `json:"cpu_usage"`
SystemUsage uint64 `json:"system_cpu_usage"` SystemUsage uint64 `json:"system_cpu_usage"`
ThrottlingData ThrottlingData `json:"throttling_data,omitempty"` ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
} }
type MemoryStats struct { type MemoryStats struct {
// current res_counter usage for memory // current res_counter usage for memory
Usage uint64 `json:"usage,omitempty"` Usage uint64 `json:"usage"`
// maximum usage ever recorded. // maximum usage ever recorded.
MaxUsage uint64 `json:"max_usage,omitempty"` MaxUsage uint64 `json:"max_usage"`
// TODO(vishh): Export these as stronger types. // TODO(vishh): Export these as stronger types.
// all the stats exported via memory.stat. // all the stats exported via memory.stat.
Stats map[string]uint64 `json:"stats,omitempty"` Stats map[string]uint64 `json:"stats"`
// number of times memory usage hits limits. // number of times memory usage hits limits.
Failcnt uint64 `json:"failcnt"` Failcnt uint64 `json:"failcnt"`
Limit uint64 `json:"limit"` Limit uint64 `json:"limit"`
} }
type BlkioStatEntry struct { type BlkioStatEntry struct {
Major uint64 `json:"major,omitempty"` Major uint64 `json:"major"`
Minor uint64 `json:"minor,omitempty"` Minor uint64 `json:"minor"`
Op string `json:"op,omitempty"` Op string `json:"op"`
Value uint64 `json:"value,omitempty"` Value uint64 `json:"value"`
} }
type BlkioStats struct { type BlkioStats struct {
// number of bytes tranferred to and from the block device // number of bytes tranferred to and from the block device
IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive,omitempty"` IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive,omitempty"` IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"`
IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive,omitempty"` IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"`
IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive,omitempty"` IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"`
IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive,omitempty"` IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"`
IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive,omitempty"` IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"`
IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive,omitempty"` IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"`
SectorsRecursive []BlkioStatEntry `json:"sectors_recursive,omitempty"` SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"`
} }
type Network struct { type Network struct {
+12 -8
View File
@@ -24,7 +24,7 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"path" "path/filepath"
"strings" "strings"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
@@ -32,6 +32,7 @@ import (
"github.com/docker/docker/daemon" "github.com/docker/docker/daemon"
"github.com/docker/docker/engine" "github.com/docker/docker/engine"
"github.com/docker/docker/pkg/fileutils" "github.com/docker/docker/pkg/fileutils"
"github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/pkg/tarsum" "github.com/docker/docker/pkg/tarsum"
"github.com/docker/docker/registry" "github.com/docker/docker/registry"
"github.com/docker/docker/runconfig" "github.com/docker/docker/runconfig"
@@ -169,12 +170,15 @@ func (b *Builder) Run(context io.Reader) (string, error) {
// Reads a Dockerfile from the current context. It assumes that the // Reads a Dockerfile from the current context. It assumes that the
// 'filename' is a relative path from the root of the context // 'filename' is a relative path from the root of the context
func (b *Builder) readDockerfile(filename string) error { func (b *Builder) readDockerfile(origFile string) error {
filename = path.Join(b.contextPath, filename) filename, err := symlink.FollowSymlinkInScope(filepath.Join(b.contextPath, origFile), b.contextPath)
if err != nil {
return fmt.Errorf("The Dockerfile (%s) must be within the build context", origFile)
}
fi, err := os.Stat(filename) fi, err := os.Lstat(filename)
if os.IsNotExist(err) { if os.IsNotExist(err) {
return fmt.Errorf("Cannot build a directory without a Dockerfile") return fmt.Errorf("Cannot locate specified Dockerfile: %s", origFile)
} }
if fi.Size() == 0 { if fi.Size() == 0 {
return ErrDockerfileEmpty return ErrDockerfileEmpty
@@ -201,13 +205,13 @@ func (b *Builder) readDockerfile(filename string) error {
// Note that this assumes the Dockerfile has been read into memory and // Note that this assumes the Dockerfile has been read into memory and
// is now safe to be removed. // is now safe to be removed.
excludes, _ := utils.ReadDockerIgnore(path.Join(b.contextPath, ".dockerignore")) excludes, _ := utils.ReadDockerIgnore(filepath.Join(b.contextPath, ".dockerignore"))
if rm, _ := fileutils.Matches(".dockerignore", excludes); rm == true { if rm, _ := fileutils.Matches(".dockerignore", excludes); rm == true {
os.Remove(path.Join(b.contextPath, ".dockerignore")) os.Remove(filepath.Join(b.contextPath, ".dockerignore"))
b.context.(tarsum.BuilderContext).Remove(".dockerignore") b.context.(tarsum.BuilderContext).Remove(".dockerignore")
} }
if rm, _ := fileutils.Matches(b.dockerfileName, excludes); rm == true { if rm, _ := fileutils.Matches(b.dockerfileName, excludes); rm == true {
os.Remove(path.Join(b.contextPath, b.dockerfileName)) os.Remove(filepath.Join(b.contextPath, b.dockerfileName))
b.context.(tarsum.BuilderContext).Remove(b.dockerfileName) b.context.(tarsum.BuilderContext).Remove(b.dockerfileName)
} }
+2 -1
View File
@@ -25,6 +25,7 @@ import (
imagepkg "github.com/docker/docker/image" imagepkg "github.com/docker/docker/image"
"github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/chrootarchive" "github.com/docker/docker/pkg/chrootarchive"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/parsers"
"github.com/docker/docker/pkg/symlink" "github.com/docker/docker/pkg/symlink"
"github.com/docker/docker/pkg/system" "github.com/docker/docker/pkg/system"
@@ -433,7 +434,7 @@ func (b *Builder) pullImage(name string) (*imagepkg.Image, error) {
job.SetenvBool("json", b.StreamFormatter.Json()) job.SetenvBool("json", b.StreamFormatter.Json())
job.SetenvBool("parallel", true) job.SetenvBool("parallel", true)
job.SetenvJson("authConfig", pullRegistryAuth) job.SetenvJson("authConfig", pullRegistryAuth)
job.Stdout.Add(b.OutOld) job.Stdout.Add(ioutils.NopWriteCloser(b.OutOld))
if err := job.Run(); err != nil { if err := job.Run(); err != nil {
return nil, err return nil, err
} }
+91 -5
View File
@@ -104,6 +104,22 @@ __docker_pos_first_nonflag() {
echo $counter echo $counter
} }
# Transforms a multiline list of strings into a single line string
# with the words separated by "|".
# This is used to prepare arguments to __docker_pos_first_nonflag().
__docker_to_alternatives() {
local parts=( $1 )
local IFS='|'
echo "${parts[*]}"
}
# Transforms a multiline list of options into an extglob pattern
# suitable for use in case statements.
__docker_to_extglob() {
local extglob=$( __docker_to_alternatives "$1" )
echo "@($extglob)"
}
__docker_resolve_hostname() { __docker_resolve_hostname() {
command -v host >/dev/null 2>&1 || return command -v host >/dev/null 2>&1 || return
COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') ) COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
@@ -154,15 +170,47 @@ __docker_capabilities() {
} }
_docker_docker() { _docker_docker() {
local boolean_options="
--api-enable-cors
--daemon -d
--debug -D
--help -h
--icc
--ip-forward
--ip-masq
--iptables
--ipv6
--selinux-enabled
--tls
--tlsverify
--version -v
"
case "$prev" in case "$prev" in
-H) --graph|-g)
_filedir -d
return
;;
--log-level|-l)
COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
return
;;
--pidfile|-p|--tlscacert|--tlscert|--tlskey)
_filedir
return
;;
--storage-driver|-s)
COMPREPLY=( $( compgen -W "aufs devicemapper btrfs overlay" -- "$(echo $cur | tr '[:upper:]' '[:lower:]')" ) )
return
;;
$main_options_with_args_glob )
return return
;; ;;
esac esac
case "$cur" in case "$cur" in
-*) -*)
COMPREPLY=( $( compgen -W "-H" -- "$cur" ) ) COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
;; ;;
*) *)
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) ) COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
@@ -561,6 +609,8 @@ _docker_run() {
--sig-proxy --sig-proxy
" "
local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
case "$prev" in case "$prev" in
--add-host) --add-host)
case "$cur" in case "$cur" in
@@ -677,7 +727,7 @@ _docker_run() {
__docker_containers_all __docker_containers_all
return return
;; ;;
--cpuset|--cpu-shares|-c|--dns|--dns-search|--entrypoint|--expose|--hostname|-h|--lxc-conf|--mac-address|--memory|-m|--name|-n|--publish|-p|--user|-u|--workdir|-w) $options_with_args_glob )
return return
;; ;;
esac esac
@@ -687,7 +737,7 @@ _docker_run() {
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) ) COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;; ;;
*) *)
local counter=$( __docker_pos_first_nonflag $( echo $options_with_args | tr -d "\n" | tr " " "|" ) ) local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then if [ $cword -eq $counter ]; then
__docker_image_repos_and_tags_and_ids __docker_image_repos_and_tags_and_ids
@@ -739,6 +789,10 @@ _docker_start() {
esac esac
} }
_docker_stats() {
__docker_containers_running
}
_docker_stop() { _docker_stop() {
case "$prev" in case "$prev" in
--time|-t) --time|-t)
@@ -801,6 +855,9 @@ _docker_wait() {
} }
_docker() { _docker() {
local previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob
local commands=( local commands=(
attach attach
build build
@@ -833,6 +890,7 @@ _docker() {
save save
search search
start start
stats
stop stop
tag tag
top top
@@ -841,6 +899,33 @@ _docker() {
wait wait
) )
local main_options_with_args="
--bip
--bridge -b
--dns
--dns-search
--exec-driver -e
--fixed-cidr
--fixed-cidr-v6
--graph -g
--group -G
--host -H
--insecure-registry
--ip
--label
--log-level -l
--mtu
--pidfile -p
--registry-mirror
--storage-driver -s
--storage-opt
--tlscacert
--tlscert
--tlskey
"
local main_options_with_args_glob=$(__docker_to_extglob "$main_options_with_args")
COMPREPLY=() COMPREPLY=()
local cur prev words cword local cur prev words cword
_get_comp_words_by_ref -n : cur prev words cword _get_comp_words_by_ref -n : cur prev words cword
@@ -849,7 +934,7 @@ _docker() {
local counter=1 local counter=1
while [ $counter -lt $cword ]; do while [ $counter -lt $cword ]; do
case "${words[$counter]}" in case "${words[$counter]}" in
-H) $main_options_with_args_glob )
(( counter++ )) (( counter++ ))
;; ;;
-*) -*)
@@ -867,6 +952,7 @@ _docker() {
local completions_func=_docker_${command} local completions_func=_docker_${command}
declare -F $completions_func >/dev/null && $completions_func declare -F $completions_func >/dev/null && $completions_func
eval "$previous_extglob_setting"
return 0 return 0
} }
+76 -18
View File
@@ -51,23 +51,28 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -s d -l daemon -d 'Enable
complete -c docker -f -n '__fish_docker_no_subcommand' -l dns -d 'Force Docker to use specific DNS servers' complete -c docker -f -n '__fish_docker_no_subcommand' -l dns -d 'Force Docker to use specific DNS servers'
complete -c docker -f -n '__fish_docker_no_subcommand' -l dns-search -d 'Force Docker to use specific DNS search domains' complete -c docker -f -n '__fish_docker_no_subcommand' -l dns-search -d 'Force Docker to use specific DNS search domains'
complete -c docker -f -n '__fish_docker_no_subcommand' -s e -l exec-driver -d 'Force the Docker runtime to use a specific exec driver' complete -c docker -f -n '__fish_docker_no_subcommand' -s e -l exec-driver -d 'Force the Docker runtime to use a specific exec driver'
complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr -d 'IPv4 subnet for fixed IPs (ex: 10.20.0.0/16)' complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr -d 'IPv4 subnet for fixed IPs (e.g. 10.20.0.0/16)'
complete -c docker -f -n '__fish_docker_no_subcommand' -l fixed-cidr-v6 -d 'IPv6 subnet for fixed IPs (e.g.: 2001:a02b/48)'
complete -c docker -f -n '__fish_docker_no_subcommand' -s G -l group -d 'Group to assign the unix socket specified by -H when running in daemon mode' complete -c docker -f -n '__fish_docker_no_subcommand' -s G -l group -d 'Group to assign the unix socket specified by -H when running in daemon mode'
complete -c docker -f -n '__fish_docker_no_subcommand' -s g -l graph -d 'Path to use as the root of the Docker runtime' complete -c docker -f -n '__fish_docker_no_subcommand' -s g -l graph -d 'Path to use as the root of the Docker runtime'
complete -c docker -f -n '__fish_docker_no_subcommand' -s H -l host -d 'The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.' complete -c docker -f -n '__fish_docker_no_subcommand' -s H -l host -d 'The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.'
complete -c docker -f -n '__fish_docker_no_subcommand' -l icc -d 'Enable inter-container communication' complete -c docker -f -n '__fish_docker_no_subcommand' -s h -l help -d 'Print usage'
complete -c docker -f -n '__fish_docker_no_subcommand' -l icc -d 'Allow unrestricted inter-container and Docker daemon host communication'
complete -c docker -f -n '__fish_docker_no_subcommand' -l insecure-registry -d 'Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)' complete -c docker -f -n '__fish_docker_no_subcommand' -l insecure-registry -d 'Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)'
complete -c docker -f -n '__fish_docker_no_subcommand' -l ip -d 'Default IP address to use when binding container ports' complete -c docker -f -n '__fish_docker_no_subcommand' -l ip -d 'Default IP address to use when binding container ports'
complete -c docker -f -n '__fish_docker_no_subcommand' -l ip-forward -d 'Enable net.ipv4.ip_forward' complete -c docker -f -n '__fish_docker_no_subcommand' -l ip-forward -d 'Enable net.ipv4.ip_forward and IPv6 forwarding if --fixed-cidr-v6 is defined. IPv6 forwarding may interfere with your existing IPv6 configuration when using Router Advertisement.'
complete -c docker -f -n '__fish_docker_no_subcommand' -l ip-masq -d "Enable IP masquerading for bridge's IP range" complete -c docker -f -n '__fish_docker_no_subcommand' -l ip-masq -d "Enable IP masquerading for bridge's IP range"
complete -c docker -f -n '__fish_docker_no_subcommand' -l iptables -d "Enable Docker's addition of iptables rules" complete -c docker -f -n '__fish_docker_no_subcommand' -l iptables -d "Enable Docker's addition of iptables rules"
complete -c docker -f -n '__fish_docker_no_subcommand' -l ipv6 -d 'Enable IPv6 networking'
complete -c docker -f -n '__fish_docker_no_subcommand' -s l -l log-level -d 'Set the logging level (debug, info, warn, error, fatal)'
complete -c docker -f -n '__fish_docker_no_subcommand' -l label -d 'Set key=value labels to the daemon (displayed in `docker info`)'
complete -c docker -f -n '__fish_docker_no_subcommand' -l mtu -d 'Set the containers network MTU' complete -c docker -f -n '__fish_docker_no_subcommand' -l mtu -d 'Set the containers network MTU'
complete -c docker -f -n '__fish_docker_no_subcommand' -s p -l pidfile -d 'Path to use for daemon PID file' complete -c docker -f -n '__fish_docker_no_subcommand' -s p -l pidfile -d 'Path to use for daemon PID file'
complete -c docker -f -n '__fish_docker_no_subcommand' -l registry-mirror -d 'Specify a preferred Docker registry mirror' complete -c docker -f -n '__fish_docker_no_subcommand' -l registry-mirror -d 'Specify a preferred Docker registry mirror'
complete -c docker -f -n '__fish_docker_no_subcommand' -s s -l storage-driver -d 'Force the Docker runtime to use a specific storage driver' complete -c docker -f -n '__fish_docker_no_subcommand' -s s -l storage-driver -d 'Force the Docker runtime to use a specific storage driver'
complete -c docker -f -n '__fish_docker_no_subcommand' -l selinux-enabled -d 'Enable selinux support. SELinux does not presently support the BTRFS storage driver' complete -c docker -f -n '__fish_docker_no_subcommand' -l selinux-enabled -d 'Enable selinux support. SELinux does not presently support the BTRFS storage driver'
complete -c docker -f -n '__fish_docker_no_subcommand' -l storage-opt -d 'Set storage driver options' complete -c docker -f -n '__fish_docker_no_subcommand' -l storage-opt -d 'Set storage driver options'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tls -d 'Use TLS; implied by tls-verify flags' complete -c docker -f -n '__fish_docker_no_subcommand' -l tls -d 'Use TLS; implied by --tlsverify flag'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscacert -d 'Trust only remotes providing a certificate signed by the CA given here' complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscacert -d 'Trust only remotes providing a certificate signed by the CA given here'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscert -d 'Path to TLS certificate file' complete -c docker -f -n '__fish_docker_no_subcommand' -l tlscert -d 'Path to TLS certificate file'
complete -c docker -f -n '__fish_docker_no_subcommand' -l tlskey -d 'Path to TLS key file' complete -c docker -f -n '__fish_docker_no_subcommand' -l tlskey -d 'Path to TLS key file'
@@ -77,14 +82,18 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -s v -l version -d 'Print
# subcommands # subcommands
# attach # attach
complete -c docker -f -n '__fish_docker_no_subcommand' -a attach -d 'Attach to a running container' complete -c docker -f -n '__fish_docker_no_subcommand' -a attach -d 'Attach to a running container'
complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l no-stdin -d 'Do not attach STDIN' complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l no-stdin -d 'Do not attach STDIN'
complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l sig-proxy -d 'Proxy all received signals to the process (even in non-TTY mode). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.' complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -l sig-proxy -d 'Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.'
complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from attach' -a '(__fish_print_docker_containers running)' -d "Container"
# build # build
complete -c docker -f -n '__fish_docker_no_subcommand' -a build -d 'Build an image from a Dockerfile' complete -c docker -f -n '__fish_docker_no_subcommand' -a build -d 'Build an image from a Dockerfile'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s f -l file -d "Name of the Dockerfile(Default is 'Dockerfile' at context root)"
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l force-rm -d 'Always remove intermediate containers, even after unsuccessful builds' complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l force-rm -d 'Always remove intermediate containers, even after unsuccessful builds'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l no-cache -d 'Do not use cache when building the image' complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l no-cache -d 'Do not use cache when building the image'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l pull -d 'Always attempt to pull a newer version of the image'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s q -l quiet -d 'Suppress the verbose output generated by the containers' complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s q -l quiet -d 'Suppress the verbose output generated by the containers'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l rm -d 'Remove intermediate containers after a successful build' complete -c docker -A -f -n '__fish_seen_subcommand_from build' -l rm -d 'Remove intermediate containers after a successful build'
complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s t -l tag -d 'Repository name (and optionally a tag) to be applied to the resulting image in case of success' complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s t -l tag -d 'Repository name (and optionally a tag) to be applied to the resulting image in case of success'
@@ -92,12 +101,14 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s t -l tag -d '
# commit # commit
complete -c docker -f -n '__fish_docker_no_subcommand' -a commit -d "Create a new image from a container's changes" complete -c docker -f -n '__fish_docker_no_subcommand' -a commit -d "Create a new image from a container's changes"
complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s a -l author -d 'Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")' complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s a -l author -d 'Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")'
complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s m -l message -d 'Commit message' complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s m -l message -d 'Commit message'
complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s p -l pause -d 'Pause container during commit' complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -s p -l pause -d 'Pause container during commit'
complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -a '(__fish_print_docker_containers all)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from commit' -a '(__fish_print_docker_containers all)' -d "Container"
# cp # cp
complete -c docker -f -n '__fish_docker_no_subcommand' -a cp -d "Copy files/folders from a container's filesystem to the host path" complete -c docker -f -n '__fish_docker_no_subcommand' -a cp -d "Copy files/folders from a container's filesystem to the host path"
complete -c docker -A -f -n '__fish_seen_subcommand_from cp' -l help -d 'Print usage'
# create # create
complete -c docker -f -n '__fish_docker_no_subcommand' -a create -d 'Create a new container' complete -c docker -f -n '__fish_docker_no_subcommand' -a create -d 'Create a new container'
@@ -108,23 +119,29 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cap-add -d '
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cap-drop -d 'Drop Linux capabilities' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cap-drop -d 'Drop Linux capabilities'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cidfile -d 'Write the container ID to the file' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cidfile -d 'Write the container ID to the file'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cpuset -d 'CPUs in which to allow execution (0-3, 0,1)' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l cpuset -d 'CPUs in which to allow execution (0-3, 0,1)'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l device -d 'Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc)' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l device -d 'Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns -d 'Set custom DNS servers' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns -d 'Set custom DNS servers'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns-search -d 'Set custom DNS search domains' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l dns-search -d "Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)"
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s e -l env -d 'Set environment variables' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s e -l env -d 'Set environment variables'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l entrypoint -d 'Overwrite the default ENTRYPOINT of the image' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l entrypoint -d 'Overwrite the default ENTRYPOINT of the image'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l env-file -d 'Read in a line delimited file of environment variables' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l env-file -d 'Read in a line delimited file of environment variables'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l expose -d 'Expose a port from the container without publishing it to your host' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l expose -d 'Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s h -l hostname -d 'Container host name' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s h -l hostname -d 'Container host name'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s i -l interactive -d 'Keep STDIN open even if not attached' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s i -l interactive -d 'Keep STDIN open even if not attached'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l link -d 'Add link to another container in the form of name:alias' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l ipc -d 'Default is to create a private IPC namespace (POSIX SysV IPC) for the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l link -d 'Add link to another container in the form of <name|id>:alias'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l lxc-conf -d '(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l lxc-conf -d '(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s m -l memory -d 'Memory limit (format: <number><optional unit>, where unit = b, k, m or g)' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s m -l memory -d 'Memory limit (format: <number><optional unit>, where unit = b, k, m or g)'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l mac-address -d 'Container MAC address (e.g. 92:d0:c6:0a:29:33)'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l memory-swap -d "Total memory usage (memory + swap), set '-1' to disable swap (format: <number><optional unit>, where unit = b, k, m or g)"
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l name -d 'Assign a name to the container' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l name -d 'Assign a name to the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l net -d 'Set the Network mode for the container' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l net -d 'Set the Network mode for the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s P -l publish-all -d 'Publish all exposed ports to random ports on the host interfaces' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s P -l publish-all -d 'Publish all exposed ports to random ports on the host interfaces'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s p -l publish -d "Publish a container's port to the host" complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s p -l publish -d "Publish a container's port to the host"
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l pid -d 'Default is to create a private PID namespace for the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l privileged -d 'Give extended privileges to this container' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l privileged -d 'Give extended privileges to this container'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l read-only -d "Mount the container's root filesystem as read only"
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l restart -d 'Restart policy to apply when a container exits (no, on-failure[:max-retry], always)' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l restart -d 'Restart policy to apply when a container exits (no, on-failure[:max-retry], always)'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l security-opt -d 'Security Options' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l security-opt -d 'Security Options'
complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s t -l tty -d 'Allocate a pseudo-TTY' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s t -l tty -d 'Allocate a pseudo-TTY'
@@ -136,26 +153,32 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from create' -a '(__fish_pri
# diff # diff
complete -c docker -f -n '__fish_docker_no_subcommand' -a diff -d "Inspect changes on a container's filesystem" complete -c docker -f -n '__fish_docker_no_subcommand' -a diff -d "Inspect changes on a container's filesystem"
complete -c docker -A -f -n '__fish_seen_subcommand_from diff' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from diff' -a '(__fish_print_docker_containers all)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from diff' -a '(__fish_print_docker_containers all)' -d "Container"
# events # events
complete -c docker -f -n '__fish_docker_no_subcommand' -a events -d 'Get real time events from the server' complete -c docker -f -n '__fish_docker_no_subcommand' -a events -d 'Get real time events from the server'
complete -c docker -A -f -n '__fish_seen_subcommand_from events' -s f -l filter -d "Provide filter values (i.e., 'event=stop')"
complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l since -d 'Show all events created since timestamp' complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l since -d 'Show all events created since timestamp'
complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l until -d 'Stream events until this timestamp' complete -c docker -A -f -n '__fish_seen_subcommand_from events' -l until -d 'Stream events until this timestamp'
# exec # exec
complete -c docker -f -n '__fish_docker_no_subcommand' -a exec -d 'Run a command in an existing container' complete -c docker -f -n '__fish_docker_no_subcommand' -a exec -d 'Run a command in a running container'
complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s d -l detach -d 'Detached mode: run command in the background' complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s d -l detach -d 'Detached mode: run command in the background'
complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s i -l interactive -d 'Keep STDIN open even if not attached' complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s i -l interactive -d 'Keep STDIN open even if not attached'
complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s t -l tty -d 'Allocate a pseudo-TTY' complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -s t -l tty -d 'Allocate a pseudo-TTY'
complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from exec' -a '(__fish_print_docker_containers running)' -d "Container"
# export # export
complete -c docker -f -n '__fish_docker_no_subcommand' -a export -d 'Stream the contents of a container as a tar archive' complete -c docker -f -n '__fish_docker_no_subcommand' -a export -d 'Stream the contents of a container as a tar archive'
complete -c docker -A -f -n '__fish_seen_subcommand_from export' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from export' -a '(__fish_print_docker_containers all)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from export' -a '(__fish_print_docker_containers all)' -d "Container"
# history # history
complete -c docker -f -n '__fish_docker_no_subcommand' -a history -d 'Show the history of an image' complete -c docker -f -n '__fish_docker_no_subcommand' -a history -d 'Show the history of an image'
complete -c docker -A -f -n '__fish_seen_subcommand_from history' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from history' -l no-trunc -d "Don't truncate output" complete -c docker -A -f -n '__fish_seen_subcommand_from history' -l no-trunc -d "Don't truncate output"
complete -c docker -A -f -n '__fish_seen_subcommand_from history' -s q -l quiet -d 'Only show numeric IDs' complete -c docker -A -f -n '__fish_seen_subcommand_from history' -s q -l quiet -d 'Only show numeric IDs'
complete -c docker -A -f -n '__fish_seen_subcommand_from history' -a '(__fish_print_docker_images)' -d "Image" complete -c docker -A -f -n '__fish_seen_subcommand_from history' -a '(__fish_print_docker_images)' -d "Image"
@@ -164,34 +187,40 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from history' -a '(__fish_pr
complete -c docker -f -n '__fish_docker_no_subcommand' -a images -d 'List images' complete -c docker -f -n '__fish_docker_no_subcommand' -a images -d 'List images'
complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s a -l all -d 'Show all images (by default filter out the intermediate image layers)' complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s a -l all -d 'Show all images (by default filter out the intermediate image layers)'
complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s f -l filter -d "Provide filter values (i.e., 'dangling=true')" complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s f -l filter -d "Provide filter values (i.e., 'dangling=true')"
complete -c docker -A -f -n '__fish_seen_subcommand_from images' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from images' -l no-trunc -d "Don't truncate output" complete -c docker -A -f -n '__fish_seen_subcommand_from images' -l no-trunc -d "Don't truncate output"
complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s q -l quiet -d 'Only show numeric IDs' complete -c docker -A -f -n '__fish_seen_subcommand_from images' -s q -l quiet -d 'Only show numeric IDs'
complete -c docker -A -f -n '__fish_seen_subcommand_from images' -a '(__fish_print_docker_repositories)' -d "Repository" complete -c docker -A -f -n '__fish_seen_subcommand_from images' -a '(__fish_print_docker_repositories)' -d "Repository"
# import # import
complete -c docker -f -n '__fish_docker_no_subcommand' -a import -d 'Create a new filesystem image from the contents of a tarball' complete -c docker -f -n '__fish_docker_no_subcommand' -a import -d 'Create a new filesystem image from the contents of a tarball'
complete -c docker -A -f -n '__fish_seen_subcommand_from import' -l help -d 'Print usage'
# info # info
complete -c docker -f -n '__fish_docker_no_subcommand' -a info -d 'Display system-wide information' complete -c docker -f -n '__fish_docker_no_subcommand' -a info -d 'Display system-wide information'
# inspect # inspect
complete -c docker -f -n '__fish_docker_no_subcommand' -a inspect -d 'Return low-level information on a container' complete -c docker -f -n '__fish_docker_no_subcommand' -a inspect -d 'Return low-level information on a container or image'
complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -s f -l format -d 'Format the output using the given go template.' complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -s f -l format -d 'Format the output using the given go template.'
complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -a '(__fish_print_docker_images)' -d "Image" complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -a '(__fish_print_docker_images)' -d "Image"
complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -a '(__fish_print_docker_containers all)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from inspect' -a '(__fish_print_docker_containers all)' -d "Container"
# kill # kill
complete -c docker -f -n '__fish_docker_no_subcommand' -a kill -d 'Kill a running container' complete -c docker -f -n '__fish_docker_no_subcommand' -a kill -d 'Kill a running container'
complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -s s -l signal -d 'Signal to send to the container' complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -s s -l signal -d 'Signal to send to the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from kill' -a '(__fish_print_docker_containers running)' -d "Container"
# load # load
complete -c docker -f -n '__fish_docker_no_subcommand' -a load -d 'Load an image from a tar archive' complete -c docker -f -n '__fish_docker_no_subcommand' -a load -d 'Load an image from a tar archive'
complete -c docker -A -f -n '__fish_seen_subcommand_from load' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from load' -s i -l input -d 'Read from a tar archive file, instead of STDIN' complete -c docker -A -f -n '__fish_seen_subcommand_from load' -s i -l input -d 'Read from a tar archive file, instead of STDIN'
# login # login
complete -c docker -f -n '__fish_docker_no_subcommand' -a login -d 'Register or log in to a Docker registry server' complete -c docker -f -n '__fish_docker_no_subcommand' -a login -d 'Register or log in to a Docker registry server'
complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s e -l email -d 'Email' complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s e -l email -d 'Email'
complete -c docker -A -f -n '__fish_seen_subcommand_from login' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s p -l password -d 'Password' complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s p -l password -d 'Password'
complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s u -l username -d 'Username' complete -c docker -A -f -n '__fish_seen_subcommand_from login' -s u -l username -d 'Username'
@@ -201,12 +230,14 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -a logout -d 'Log out fro
# logs # logs
complete -c docker -f -n '__fish_docker_no_subcommand' -a logs -d 'Fetch the logs of a container' complete -c docker -f -n '__fish_docker_no_subcommand' -a logs -d 'Fetch the logs of a container'
complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -s f -l follow -d 'Follow log output' complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -s f -l follow -d 'Follow log output'
complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -s t -l timestamps -d 'Show timestamps' complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -s t -l timestamps -d 'Show timestamps'
complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -l tail -d 'Output the specified number of lines at the end of logs (defaults to all logs)' complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -l tail -d 'Output the specified number of lines at the end of logs (defaults to all logs)'
complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from logs' -a '(__fish_print_docker_containers running)' -d "Container"
# port # port
complete -c docker -f -n '__fish_docker_no_subcommand' -a port -d 'Lookup the public-facing port that is NAT-ed to PRIVATE_PORT' complete -c docker -f -n '__fish_docker_no_subcommand' -a port -d 'Lookup the public-facing port that is NAT-ed to PRIVATE_PORT'
complete -c docker -A -f -n '__fish_seen_subcommand_from port' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from port' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from port' -a '(__fish_print_docker_containers running)' -d "Container"
# pause # pause
@@ -218,32 +249,40 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -a ps -d 'List containers
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s a -l all -d 'Show all containers. Only running containers are shown by default.' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s a -l all -d 'Show all containers. Only running containers are shown by default.'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l before -d 'Show only container created before Id or Name, include non-running ones.' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l before -d 'Show only container created before Id or Name, include non-running ones.'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s f -l filter -d 'Provide filter values. Valid filters:' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s f -l filter -d 'Provide filter values. Valid filters:'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s l -l latest -d 'Show only the latest created container, include non-running ones.' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s l -l latest -d 'Show only the latest created container, include non-running ones.'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s n -d 'Show n last created containers, include non-running ones.' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s n -d 'Show n last created containers, include non-running ones.'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l no-trunc -d "Don't truncate output" complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l no-trunc -d "Don't truncate output"
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s q -l quiet -d 'Only display numeric IDs' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s q -l quiet -d 'Only display numeric IDs'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s s -l size -d 'Display sizes' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -s s -l size -d 'Display total file sizes'
complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l since -d 'Show only containers created since Id or Name, include non-running ones.' complete -c docker -A -f -n '__fish_seen_subcommand_from ps' -l since -d 'Show only containers created since Id or Name, include non-running ones.'
# pull # pull
complete -c docker -f -n '__fish_docker_no_subcommand' -a pull -d 'Pull an image or a repository from a Docker registry server' complete -c docker -f -n '__fish_docker_no_subcommand' -a pull -d 'Pull an image or a repository from a Docker registry server'
complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -s a -l all-tags -d 'Download all tagged images in the repository' complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -s a -l all-tags -d 'Download all tagged images in the repository'
complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -a '(__fish_print_docker_images)' -d "Image" complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -a '(__fish_print_docker_images)' -d "Image"
complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -a '(__fish_print_docker_repositories)' -d "Repository" complete -c docker -A -f -n '__fish_seen_subcommand_from pull' -a '(__fish_print_docker_repositories)' -d "Repository"
# push # push
complete -c docker -f -n '__fish_docker_no_subcommand' -a push -d 'Push an image or a repository to a Docker registry server' complete -c docker -f -n '__fish_docker_no_subcommand' -a push -d 'Push an image or a repository to a Docker registry server'
complete -c docker -A -f -n '__fish_seen_subcommand_from push' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from push' -a '(__fish_print_docker_images)' -d "Image" complete -c docker -A -f -n '__fish_seen_subcommand_from push' -a '(__fish_print_docker_images)' -d "Image"
complete -c docker -A -f -n '__fish_seen_subcommand_from push' -a '(__fish_print_docker_repositories)' -d "Repository" complete -c docker -A -f -n '__fish_seen_subcommand_from push' -a '(__fish_print_docker_repositories)' -d "Repository"
# rename
complete -c docker -f -n '__fish_docker_no_subcommand' -a rename -d 'Rename an existing container'
# restart # restart
complete -c docker -f -n '__fish_docker_no_subcommand' -a restart -d 'Restart a running container' complete -c docker -f -n '__fish_docker_no_subcommand' -a restart -d 'Restart a running container'
complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -s t -l time -d 'Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.' complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -s t -l time -d 'Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.'
complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from restart' -a '(__fish_print_docker_containers running)' -d "Container"
# rm # rm
complete -c docker -f -n '__fish_docker_no_subcommand' -a rm -d 'Remove one or more containers' complete -c docker -f -n '__fish_docker_no_subcommand' -a rm -d 'Remove one or more containers'
complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s f -l force -d 'Force the removal of a running container (uses SIGKILL)' complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s f -l force -d 'Force the removal of a running container (uses SIGKILL)'
complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s l -l link -d 'Remove the specified link and not the underlying container' complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s l -l link -d 'Remove the specified link and not the underlying container'
complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s v -l volumes -d 'Remove the volumes associated with the container' complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -s v -l volumes -d 'Remove the volumes associated with the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -a '(__fish_print_docker_containers stopped)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -a '(__fish_print_docker_containers stopped)' -d "Container"
@@ -251,6 +290,7 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -a '(__fish_print_d
# rmi # rmi
complete -c docker -f -n '__fish_docker_no_subcommand' -a rmi -d 'Remove one or more images' complete -c docker -f -n '__fish_docker_no_subcommand' -a rmi -d 'Remove one or more images'
complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -s f -l force -d 'Force removal of the image' complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -s f -l force -d 'Force removal of the image'
complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -l no-prune -d 'Do not delete untagged parents' complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -l no-prune -d 'Do not delete untagged parents'
complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -a '(__fish_print_docker_images)' -d "Image" complete -c docker -A -f -n '__fish_seen_subcommand_from rmi' -a '(__fish_print_docker_images)' -d "Image"
@@ -264,27 +304,33 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cap-drop -d 'Dr
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cidfile -d 'Write the container ID to the file' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cidfile -d 'Write the container ID to the file'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cpuset -d 'CPUs in which to allow execution (0-3, 0,1)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l cpuset -d 'CPUs in which to allow execution (0-3, 0,1)'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s d -l detach -d 'Detached mode: run the container in the background and print the new container ID' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s d -l detach -d 'Detached mode: run the container in the background and print the new container ID'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l device -d 'Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l device -d 'Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns -d 'Set custom DNS servers' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns -d 'Set custom DNS servers'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns-search -d 'Set custom DNS search domains' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l dns-search -d "Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain)"
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s e -l env -d 'Set environment variables' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s e -l env -d 'Set environment variables'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l entrypoint -d 'Overwrite the default ENTRYPOINT of the image' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l entrypoint -d 'Overwrite the default ENTRYPOINT of the image'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l env-file -d 'Read in a line delimited file of environment variables' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l env-file -d 'Read in a line delimited file of environment variables'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l expose -d 'Expose a port from the container without publishing it to your host' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l expose -d 'Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s h -l hostname -d 'Container host name' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s h -l hostname -d 'Container host name'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s i -l interactive -d 'Keep STDIN open even if not attached' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s i -l interactive -d 'Keep STDIN open even if not attached'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l link -d 'Add link to another container in the form of name:alias' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l ipc -d 'Default is to create a private IPC namespace (POSIX SysV IPC) for the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l link -d 'Add link to another container in the form of <name|id>:alias'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l lxc-conf -d '(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l lxc-conf -d '(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s m -l memory -d 'Memory limit (format: <number><optional unit>, where unit = b, k, m or g)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s m -l memory -d 'Memory limit (format: <number><optional unit>, where unit = b, k, m or g)'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l mac-address -d 'Container MAC address (e.g. 92:d0:c6:0a:29:33)'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l memory-swap -d "Total memory usage (memory + swap), set '-1' to disable swap (format: <number><optional unit>, where unit = b, k, m or g)"
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l name -d 'Assign a name to the container' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l name -d 'Assign a name to the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l net -d 'Set the Network mode for the container' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l net -d 'Set the Network mode for the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s P -l publish-all -d 'Publish all exposed ports to random ports on the host interfaces' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s P -l publish-all -d 'Publish all exposed ports to random ports on the host interfaces'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s p -l publish -d "Publish a container's port to the host" complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s p -l publish -d "Publish a container's port to the host"
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l pid -d 'Default is to create a private PID namespace for the container'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l privileged -d 'Give extended privileges to this container' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l privileged -d 'Give extended privileges to this container'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l read-only -d "Mount the container's root filesystem as read only"
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l restart -d 'Restart policy to apply when a container exits (no, on-failure[:max-retry], always)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l restart -d 'Restart policy to apply when a container exits (no, on-failure[:max-retry], always)'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l rm -d 'Automatically remove the container when it exits (incompatible with -d)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l rm -d 'Automatically remove the container when it exits (incompatible with -d)'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l security-opt -d 'Security Options' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l security-opt -d 'Security Options'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l sig-proxy -d 'Proxy received signals to the process (even in non-TTY mode). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l sig-proxy -d 'Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s t -l tty -d 'Allocate a pseudo-TTY' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s t -l tty -d 'Allocate a pseudo-TTY'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s u -l user -d 'Username or UID' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s u -l user -d 'Username or UID'
complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s v -l volume -d 'Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s v -l volume -d 'Bind mount a volume (e.g., from the host: -v /host:/container, from Docker: -v /container)'
@@ -294,32 +340,43 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from run' -a '(__fish_print_
# save # save
complete -c docker -f -n '__fish_docker_no_subcommand' -a save -d 'Save an image to a tar archive' complete -c docker -f -n '__fish_docker_no_subcommand' -a save -d 'Save an image to a tar archive'
complete -c docker -A -f -n '__fish_seen_subcommand_from save' -s o -l output -d 'Write to a file, instead of STDOUT' complete -c docker -A -f -n '__fish_seen_subcommand_from save' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from save' -s o -l output -d 'Write to an file, instead of STDOUT'
complete -c docker -A -f -n '__fish_seen_subcommand_from save' -a '(__fish_print_docker_images)' -d "Image" complete -c docker -A -f -n '__fish_seen_subcommand_from save' -a '(__fish_print_docker_images)' -d "Image"
# search # search
complete -c docker -f -n '__fish_docker_no_subcommand' -a search -d 'Search for an image on the Docker Hub' complete -c docker -f -n '__fish_docker_no_subcommand' -a search -d 'Search for an image on the Docker Hub'
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l automated -d 'Only show automated builds' complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l automated -d 'Only show automated builds'
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l no-trunc -d "Don't truncate output" complete -c docker -A -f -n '__fish_seen_subcommand_from search' -l no-trunc -d "Don't truncate output"
complete -c docker -A -f -n '__fish_seen_subcommand_from search' -s s -l stars -d 'Only displays with at least x stars' complete -c docker -A -f -n '__fish_seen_subcommand_from search' -s s -l stars -d 'Only displays with at least x stars'
# start # start
complete -c docker -f -n '__fish_docker_no_subcommand' -a start -d 'Start a stopped container' complete -c docker -f -n '__fish_docker_no_subcommand' -a start -d 'Start a stopped container'
complete -c docker -A -f -n '__fish_seen_subcommand_from start' -s a -l attach -d "Attach container's STDOUT and STDERR and forward all signals to the process" complete -c docker -A -f -n '__fish_seen_subcommand_from start' -s a -l attach -d "Attach container's STDOUT and STDERR and forward all signals to the process"
complete -c docker -A -f -n '__fish_seen_subcommand_from start' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from start' -s i -l interactive -d "Attach container's STDIN" complete -c docker -A -f -n '__fish_seen_subcommand_from start' -s i -l interactive -d "Attach container's STDIN"
complete -c docker -A -f -n '__fish_seen_subcommand_from start' -a '(__fish_print_docker_containers stopped)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from start' -a '(__fish_print_docker_containers stopped)' -d "Container"
# stats
complete -c docker -f -n '__fish_docker_no_subcommand' -a stats -d "Display a live stream of one or more containers' resource usage statistics"
complete -c docker -A -f -n '__fish_seen_subcommand_from stats' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from stats' -a '(__fish_print_docker_containers running)' -d "Container"
# stop # stop
complete -c docker -f -n '__fish_docker_no_subcommand' -a stop -d 'Stop a running container' complete -c docker -f -n '__fish_docker_no_subcommand' -a stop -d 'Stop a running container'
complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -s t -l time -d 'Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.' complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -s t -l time -d 'Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.'
complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from stop' -a '(__fish_print_docker_containers running)' -d "Container"
# tag # tag
complete -c docker -f -n '__fish_docker_no_subcommand' -a tag -d 'Tag an image into a repository' complete -c docker -f -n '__fish_docker_no_subcommand' -a tag -d 'Tag an image into a repository'
complete -c docker -A -f -n '__fish_seen_subcommand_from tag' -s f -l force -d 'Force' complete -c docker -A -f -n '__fish_seen_subcommand_from tag' -s f -l force -d 'Force'
complete -c docker -A -f -n '__fish_seen_subcommand_from tag' -l help -d 'Print usage'
# top # top
complete -c docker -f -n '__fish_docker_no_subcommand' -a top -d 'Lookup the running processes of a container' complete -c docker -f -n '__fish_docker_no_subcommand' -a top -d 'Lookup the running processes of a container'
complete -c docker -A -f -n '__fish_seen_subcommand_from top' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from top' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from top' -a '(__fish_print_docker_containers running)' -d "Container"
# unpause # unpause
@@ -331,6 +388,7 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -a version -d 'Show the D
# wait # wait
complete -c docker -f -n '__fish_docker_no_subcommand' -a wait -d 'Block until a container stops, then print its exit code' complete -c docker -f -n '__fish_docker_no_subcommand' -a wait -d 'Block until a container stops, then print its exit code'
complete -c docker -A -f -n '__fish_seen_subcommand_from wait' -l help -d 'Print usage'
complete -c docker -A -f -n '__fish_seen_subcommand_from wait' -a '(__fish_print_docker_containers running)' -d "Container" complete -c docker -A -f -n '__fish_seen_subcommand_from wait' -a '(__fish_print_docker_containers running)' -d "Container"
+2 -6
View File
@@ -820,7 +820,7 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
if os.Geteuid() != 0 { if os.Geteuid() != 0 {
return nil, fmt.Errorf("The Docker daemon needs to be run as root") return nil, fmt.Errorf("The Docker daemon needs to be run as root")
} }
if err := checkKernelAndArch(); err != nil { if err := checkKernel(); err != nil {
return nil, err return nil, err
} }
@@ -1205,11 +1205,7 @@ func (daemon *Daemon) ImageGetCached(imgID string, config *runconfig.Config) (*i
return match, nil return match, nil
} }
func checkKernelAndArch() error { func checkKernel() error {
// Check for unsupported architectures
if runtime.GOARCH != "amd64" {
return fmt.Errorf("The Docker runtime currently only supports amd64 (not %s). This will change in the future. Aborting.", runtime.GOARCH)
}
// Check for unsupported kernel versions // Check for unsupported kernel versions
// FIXME: it would be cleaner to not test for specific versions, but rather // FIXME: it would be cleaner to not test for specific versions, but rather
// test for specific functionalities. // test for specific functionalities.
+2 -2
View File
@@ -75,8 +75,8 @@ lxc.aa_profile = unconfined
# In non-privileged mode, lxc will automatically mount /proc and /sys in readonly mode # In non-privileged mode, lxc will automatically mount /proc and /sys in readonly mode
# for security. See: http://man7.org/linux/man-pages/man5/lxc.container.conf.5.html # for security. See: http://man7.org/linux/man-pages/man5/lxc.container.conf.5.html
lxc.mount.auto = proc sys lxc.mount.auto = proc sys
{{if .AppArmor}} {{if .AppArmorProfile}}
lxc.aa_profile = .AppArmorProfile lxc.aa_profile = {{.AppArmorProfile}}
{{end}} {{end}}
{{end}} {{end}}
@@ -248,7 +248,8 @@ func TestCustomLxcConfigMisc(t *testing.T) {
} }
defer os.RemoveAll(root) defer os.RemoveAll(root)
os.MkdirAll(path.Join(root, "containers", "1"), 0777) os.MkdirAll(path.Join(root, "containers", "1"), 0777)
driver, err := NewDriver(root, "", false) driver, err := NewDriver(root, "", true)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -271,9 +272,10 @@ func TestCustomLxcConfigMisc(t *testing.T) {
Bridge: "docker0", Bridge: "docker0",
}, },
}, },
ProcessConfig: processConfig, ProcessConfig: processConfig,
CapAdd: []string{"net_admin", "syslog"}, CapAdd: []string{"net_admin", "syslog"},
CapDrop: []string{"kill", "mknod"}, CapDrop: []string{"kill", "mknod"},
AppArmorProfile: "lxc-container-default-with-nesting",
} }
p, err := driver.generateLXCConfig(command) p, err := driver.generateLXCConfig(command)
@@ -287,7 +289,7 @@ func TestCustomLxcConfigMisc(t *testing.T) {
grepFile(t, p, "lxc.network.ipv4 = 10.10.10.10/24") grepFile(t, p, "lxc.network.ipv4 = 10.10.10.10/24")
grepFile(t, p, "lxc.network.ipv4.gateway = 10.10.10.1") grepFile(t, p, "lxc.network.ipv4.gateway = 10.10.10.1")
grepFile(t, p, "lxc.network.flags = up") grepFile(t, p, "lxc.network.flags = up")
grepFile(t, p, "lxc.aa_profile = lxc-container-default-with-nesting")
// hostname // hostname
grepFile(t, p, "lxc.utsname = testhost") grepFile(t, p, "lxc.utsname = testhost")
grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1") grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
+1 -1
View File
@@ -201,7 +201,7 @@ Here is the list of supported options:
Enables or disables the use of blkdiscard when removing Enables or disables the use of blkdiscard when removing
devicemapper devices. This is enabled by default (only) if using devicemapper devices. This is enabled by default (only) if using
loopback devices and is required to res-parsify the loopback file loopback devices and is required to resparsify the loopback file
on image/container removal. on image/container removal.
Disabling this on loopback can lead to *much* faster container Disabling this on loopback can lead to *much* faster container
+41 -15
View File
@@ -150,6 +150,21 @@ func InitDriver(job *engine.Job) engine.Status {
} }
} }
// a bridge might exist but not have any IPv6 addr associated with it yet
// (for example, an existing Docker installation that has only been used
// with IPv4 and docker0 already is set up) In that case, we can perform
// the bridge init for IPv6 here, else we will error out below if --ipv6=true
if len(addrsv6) == 0 && enableIPv6 {
if err := setupIPv6Bridge(bridgeIPv6); err != nil {
return job.Error(err)
}
// recheck addresses now that IPv6 is setup on the bridge
addrv4, addrsv6, err = networkdriver.GetIfaceAddr(bridgeIface)
if err != nil {
return job.Error(err)
}
}
// TODO: Check if route to fixedCIDRv6 is set // TODO: Check if route to fixedCIDRv6 is set
} }
@@ -173,7 +188,6 @@ func InitDriver(job *engine.Job) engine.Status {
networkv4 = addrv4.(*net.IPNet) networkv4 = addrv4.(*net.IPNet)
log.Infof("enableIPv6 = %t", enableIPv6)
if enableIPv6 { if enableIPv6 {
if len(addrsv6) == 0 { if len(addrsv6) == 0 {
return job.Error(errors.New("IPv6 enabled but no IPv6 detected")) return job.Error(errors.New("IPv6 enabled but no IPv6 detected"))
@@ -396,26 +410,14 @@ func configureBridge(bridgeIP string, bridgeIPv6 string, enableIPv6 bool) error
return err return err
} }
if netlink.NetworkLinkAddIp(iface, ipAddr, ipNet); err != nil { if err := netlink.NetworkLinkAddIp(iface, ipAddr, ipNet); err != nil {
return fmt.Errorf("Unable to add private network: %s", err) return fmt.Errorf("Unable to add private network: %s", err)
} }
if enableIPv6 { if enableIPv6 {
// Enable IPv6 on the bridge if err := setupIPv6Bridge(bridgeIPv6); err != nil {
procFile := "/proc/sys/net/ipv6/conf/" + iface.Name + "/disable_ipv6"
if err := ioutil.WriteFile(procFile, []byte{'0', '\n'}, 0644); err != nil {
return fmt.Errorf("unable to enable IPv6 addresses on bridge: %s\n", err)
}
ipAddr6, ipNet6, err := net.ParseCIDR(bridgeIPv6)
if err != nil {
log.Errorf("BridgeIPv6 parsing failed")
return err return err
} }
if netlink.NetworkLinkAddIp(iface, ipAddr6, ipNet6); err != nil {
return fmt.Errorf("Unable to add private IPv6 network: %s", err)
}
} }
if err := netlink.NetworkLinkUp(iface); err != nil { if err := netlink.NetworkLinkUp(iface); err != nil {
@@ -424,6 +426,30 @@ func configureBridge(bridgeIP string, bridgeIPv6 string, enableIPv6 bool) error
return nil return nil
} }
func setupIPv6Bridge(bridgeIPv6 string) error {
iface, err := net.InterfaceByName(bridgeIface)
if err != nil {
return err
}
// Enable IPv6 on the bridge
procFile := "/proc/sys/net/ipv6/conf/" + iface.Name + "/disable_ipv6"
if err := ioutil.WriteFile(procFile, []byte{'0', '\n'}, 0644); err != nil {
return fmt.Errorf("Unable to enable IPv6 addresses on bridge: %v", err)
}
ipAddr6, ipNet6, err := net.ParseCIDR(bridgeIPv6)
if err != nil {
return fmt.Errorf("Unable to parse bridge IPv6 address: %q, error: %v", bridgeIPv6, err)
}
if err := netlink.NetworkLinkAddIp(iface, ipAddr6, ipNet6); err != nil {
return fmt.Errorf("Unable to add private IPv6 network: %v", err)
}
return nil
}
func createBridgeIface(name string) error { func createBridgeIface(name string) error {
kv, err := kernel.GetKernelVersion() kv, err := kernel.GetKernelVersion()
// only set the bridge's mac address if the kernel version is > 3.3 // only set the bridge's mac address if the kernel version is > 3.3
+1 -1
View File
@@ -74,7 +74,7 @@ func NetworkRange(network *net.IPNet) (net.IP, net.IP) {
return netIP.Mask(network.Mask), net.IP(lastIP) return netIP.Mask(network.Mask), net.IP(lastIP)
} }
// Return the IPv4 address of a network interface // Return the first IPv4 address and slice of IPv6 addresses for the specified network interface
func GetIfaceAddr(name string) (net.Addr, []net.Addr, error) { func GetIfaceAddr(name string) (net.Addr, []net.Addr, error) {
iface, err := net.InterfaceByName(name) iface, err := net.InterfaceByName(name)
if err != nil { if err != nil {
+2 -7
View File
@@ -79,11 +79,6 @@ func main() {
} }
protoAddrParts := strings.SplitN(flHosts[0], "://", 2) protoAddrParts := strings.SplitN(flHosts[0], "://", 2)
trustKey, err := api.LoadOrCreateTrustKey(*flTrustKey)
if err != nil {
log.Fatal(err)
}
var ( var (
cli *client.DockerCli cli *client.DockerCli
tlsConfig tls.Config tlsConfig tls.Config
@@ -125,9 +120,9 @@ func main() {
} }
if *flTls || *flTlsVerify { if *flTls || *flTlsVerify {
cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, trustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig) cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig)
} else { } else {
cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, trustKey, protoAddrParts[0], protoAddrParts[1], nil) cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], nil)
} }
if err := cli.Cmd(flag.Args()...); err != nil { if err := cli.Cmd(flag.Args()...); err != nil {
+1 -1
View File
@@ -97,7 +97,7 @@ func init() {
{"images", "List images"}, {"images", "List images"},
{"import", "Create a new filesystem image from the contents of a tarball"}, {"import", "Create a new filesystem image from the contents of a tarball"},
{"info", "Display system-wide information"}, {"info", "Display system-wide information"},
{"inspect", "Return low-level information on a container"}, {"inspect", "Return low-level information on a container or image"},
{"kill", "Kill a running container"}, {"kill", "Kill a running container"},
{"load", "Load an image from a tar archive"}, {"load", "Load an image from a tar archive"},
{"login", "Register or log in to a Docker registry server"}, {"login", "Register or log in to a Docker registry server"},
+12 -12
View File
@@ -64,23 +64,23 @@ CMD ["mkdocs", "serve"]
# Sven plans to move each Dockerfile into the respective repository # Sven plans to move each Dockerfile into the respective repository
# Docker Swarm # Docker Swarm
ADD https://raw.githubusercontent.com/docker/swarm/master/logo.png /docs/sources/swarm/logo.png #ADD https://raw.githubusercontent.com/docker/swarm/master/userguide.md /docs/sources/swarm/README.md
ADD https://raw.githubusercontent.com/docker/swarm/master/README.md /docs/sources/swarm/README.md #ADD https://raw.githubusercontent.com/docker/swarm/master/discovery/README.md /docs/sources/swarm/discovery.md
ADD https://raw.githubusercontent.com/docker/swarm/master/discovery/README.md /docs/sources/swarm/discovery.md #ADD https://raw.githubusercontent.com/docker/swarm/master/api/README.md /docs/sources/swarm/API.md
ADD https://raw.githubusercontent.com/docker/swarm/master/api/README.md /docs/sources/swarm/API.md #ADD https://raw.githubusercontent.com/docker/swarm/master/scheduler/filter/README.md /docs/sources/swarm/scheduler/filter.md
ADD https://raw.githubusercontent.com/docker/swarm/master/scheduler/filter/README.md /docs/sources/swarm/filters.md #ADD https://raw.githubusercontent.com/docker/swarm/master/scheduler/strategy/README.md /docs/sources/swarm/scheduler/strategy.md
# Docker Machine # Docker Machine
ADD https://raw.githubusercontent.com/docker/machine/master/docs/dockermachine.md /docs/sources/machine/userguide.md # ADD https://raw.githubusercontent.com/docker/machine/master/docs/dockermachine.md /docs/sources/machine/userguide.md
# Docker Compose # Docker Compose
ADD https://raw.githubusercontent.com/docker/fig/master/docs/index.md /docs/sources/compose/userguide.md # ADD https://raw.githubusercontent.com/docker/fig/master/docs/index.md /docs/sources/compose/userguide.md
ADD https://raw.githubusercontent.com/docker/fig/master/docs/install.md /docs/sources/compose/install.md # ADD https://raw.githubusercontent.com/docker/fig/master/docs/install.md /docs/sources/compose/install.md
ADD https://raw.githubusercontent.com/docker/fig/master/docs/cli.md /docs/sources/compose/cli.md # ADD https://raw.githubusercontent.com/docker/fig/master/docs/cli.md /docs/sources/compose/cli.md
ADD https://raw.githubusercontent.com/docker/fig/master/docs/yml.md /docs/sources/compose/yml.md # ADD https://raw.githubusercontent.com/docker/fig/master/docs/yml.md /docs/sources/compose/yml.md
# add the project docs from the `mkdocs-<project>.yml` files # add the project docs from the `mkdocs-<project>.yml` files
RUN cd /docs && ./build.sh # RUN cd /docs && ./build.sh
# remove `^---*` lines from md's # remove `^---*` lines from md's
RUN cd /docs/sources && find . -name "*.md" | xargs sed -i~ -n '/^---*/!p' # RUN cd /docs/sources && find . -name "*.md" | xargs sed -i~ -n '/^---*/!p'
+4 -2
View File
@@ -89,8 +89,10 @@ you need to access the AWS bucket you'll be deploying to.
The release script will create an s3 if needed, and will then push the files to it. The release script will create an s3 if needed, and will then push the files to it.
[profile dowideit-docs] aws_access_key_id = IHOIUAHSIDH234rwf.... [profile dowideit-docs]
aws_secret_access_key = OIUYSADJHLKUHQWIUHE...... region = ap-southeast-2 aws_access_key_id = IHOIUAHSIDH234rwf....
aws_secret_access_key = OIUYSADJHLKUHQWIUHE......
region = ap-southeast-2
The `profile` name must be the same as the name of the bucket you are deploying The `profile` name must be the same as the name of the bucket you are deploying
to - which you call from the `docker` directory: to - which you call from the `docker` directory:
+2 -2
View File
@@ -138,7 +138,7 @@ or
whitespace. whitespace.
The ADD instruction copies new files, directories The ADD instruction copies new files, directories
or remote file URLs to the filesystem of the container at path <dest>. or remote file URLs to the filesystem of the container at path <dest>.
Mutliple <src> resources may be specified but if they are files or directories Multiple <src> resources may be specified but if they are files or directories
then they must be relative to the source directory that is being built then they must be relative to the source directory that is being built
(the context of the build). The <dest> is the absolute path, or path relative (the context of the build). The <dest> is the absolute path, or path relative
to `WORKDIR`, into which the source is copied inside the target container. to `WORKDIR`, into which the source is copied inside the target container.
@@ -195,7 +195,7 @@ or
**WORKDIR** **WORKDIR**
-- **WORKDIR /path/to/workdir** -- **WORKDIR /path/to/workdir**
The WORKDIR instruction sets the working directory for the **RUN**, **CMD**, and **ENTRYPOINT** Dockerfile commands that follow it. The WORKDIR instruction sets the working directory for the **RUN**, **CMD**, **ENTRYPOINT**, **COPY** and **ADD** Dockerfile commands that follow it.
It can be used multiple times in a single Dockerfile. Relative paths are defined relative to the path of the previous **WORKDIR** instruction. For example: It can be used multiple times in a single Dockerfile. Relative paths are defined relative to the path of the previous **WORKDIR** instruction. For example:
**WORKDIR /a WORKDIR b WORKDIR c RUN pwd** **WORKDIR /a WORKDIR b WORKDIR c RUN pwd**
In the above example, the output of the **pwd** command is **a/b/c**. In the above example, the output of the **pwd** command is **a/b/c**.
-37
View File
@@ -5,43 +5,6 @@ This directory contains the Docker user manual in the Markdown format.
Do *not* edit the man pages in the man1 directory. Instead, amend the Do *not* edit the man pages in the man1 directory. Instead, amend the
Markdown (*.md) files. Markdown (*.md) files.
# File List
docker.md
docker-attach.md
docker-build.md
docker-commit.md
docker-cp.md
docker-diff.md
docker-events.md
docker-export.md
docker-history.md
docker-images.md
docker-import.md
docker-info.md
docker-inspect.md
docker-kill.md
docker-load.md
docker-login.md
docker-logs.md
docker-port.md
docker-ps.md
docker-pull.md
docker-push.md
docker-restart.md
docker-rmi.md
docker-rm.md
docker-run.md
docker-save.md
docker-search.md
docker-start.md
docker-stop.md
docker-tag.md
docker-top.md
docker-wait.md
Dockerfile
md2man-all.sh
# Generating man pages from the Markdown files # Generating man pages from the Markdown files
The recommended approach for generating the man pages is via a Docker The recommended approach for generating the man pages is via a Docker
+11 -9
View File
@@ -12,17 +12,19 @@ docker-attach - Attach to a running container
CONTAINER CONTAINER
# DESCRIPTION # DESCRIPTION
If you **docker run** a container in detached mode (**-d**), you can reattach to The **docker attach** command allows you to attach to a running container using
the detached container with **docker attach** using the container's ID or name. the container's ID or name, either to view its ongoing output or to control it
interactively. You can attach to the same contained process multiple times
simultaneously, screen sharing style, or quickly view the progress of your
daemonized process.
You can detach from the container again (and leave it running) with `CTRL-p You can detach from the container (and leave it running) with `CTRL-p CTRL-q`
CTRL-q` (for a quiet exit), or `CTRL-c` which will send a SIGKILL to the (for a quiet exit) or `CTRL-c` which will send a `SIGKILL` to the container.
container, or `CTRL-\` to get a stacktrace of the Docker client when it quits. When you are attached to a container, and exit its main process, the process's
When you detach from a container the exit code will be returned to exit code will be returned to the client.
the client.
It is forbidden to redirect the standard input of a docker attach command while It is forbidden to redirect the standard input of a `docker attach` command while
attaching to a tty-enabled container (i.e.: launched with -t`). attaching to a tty-enabled container (i.e.: launched with `-t`).
# OPTIONS # OPTIONS
**--help** **--help**
+2 -2
View File
@@ -59,7 +59,7 @@ as context.
# EXAMPLES # EXAMPLES
## Building an image using a Dockefile located inside the current directory ## Building an image using a Dockerfile located inside the current directory
Docker images can be built using the build command and a Dockerfile: Docker images can be built using the build command and a Dockerfile:
@@ -91,7 +91,7 @@ no hard rules here but it is best to give the names consideration.
The **-t**/**--tag** flag is used to rename an image. Here are some examples: The **-t**/**--tag** flag is used to rename an image. Here are some examples:
Though it is not a good practice, image names can be arbtrary: Though it is not a good practice, image names can be arbitrary:
docker build -t myimage . docker build -t myimage .
+13 -13
View File
@@ -45,23 +45,23 @@ After running docker events a container 786d698004576 is started and stopped
(The container name has been shortened in the output below): (The container name has been shortened in the output below):
# docker events # docker events
[2014-04-12 18:23:04 -0400 EDT] 786d69800457: (from whenry/testimage:latest) start 2015-01-28T20:21:31.000000000-08:00 59211849bc10: (from whenry/testimage:latest) start
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) die 2015-01-28T20:21:31.000000000-08:00 59211849bc10: (from whenry/testimage:latest) die
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) stop 2015-01-28T20:21:32.000000000-08:00 59211849bc10: (from whenry/testimage:latest) stop
## Listening for events since a given date ## Listening for events since a given date
Again the output container IDs have been shortened for the purposes of this document: Again the output container IDs have been shortened for the purposes of this document:
# docker events --since '2014-04-12' # docker events --since '2015-01-28'
[2014-04-12 18:11:28 -0400 EDT] c655dbf640dc: (from whenry/testimage:latest) create 2015-01-28T20:25:38.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) create
[2014-04-12 18:11:28 -0400 EDT] c655dbf640dc: (from whenry/testimage:latest) start 2015-01-28T20:25:38.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start
[2014-04-12 18:14:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) create 2015-01-28T20:25:39.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) create
[2014-04-12 18:14:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) start 2015-01-28T20:25:39.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start
[2014-04-12 18:22:44 -0400 EDT] 786d69800457: (from whenry/testimage:latest) die 2015-01-28T20:25:40.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) die
[2014-04-12 18:22:44 -0400 EDT] 786d69800457: (from whenry/testimage:latest) stop 2015-01-28T20:25:42.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) stop
[2014-04-12 18:23:04 -0400 EDT] 786d69800457: (from whenry/testimage:latest) start 2015-01-28T20:25:45.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) die 2015-01-28T20:25:45.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) die
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) stop 2015-01-28T20:25:46.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) stop
# HISTORY # HISTORY
April 2014, Originally compiled by William Henry (whenry at redhat dot com) April 2014, Originally compiled by William Henry (whenry at redhat dot com)
+2
View File
@@ -13,6 +13,8 @@ docker-stats - Display a live stream of one or more containers' resource usage s
Display a live stream of one or more containers' resource usage statistics Display a live stream of one or more containers' resource usage statistics
Note: this functionality currently only works when using the *libcontainer* exec-driver.
# OPTIONS # OPTIONS
**--help** **--help**
Print usage statement Print usage statement
+2 -2
View File
@@ -144,7 +144,7 @@ unix://[/path/to/socket] to use.
Display system-wide information Display system-wide information
**docker-inspect(1)** **docker-inspect(1)**
Return low-level information on a container Return low-level information on a container or image
**docker-kill(1)** **docker-kill(1)**
Kill a running container (which includes the wrapper process and everything Kill a running container (which includes the wrapper process and everything
@@ -277,7 +277,7 @@ is 64K.
#### dm.blkdiscard #### dm.blkdiscard
Enables or disables the use of blkdiscard when removing devicemapper devices. Enables or disables the use of blkdiscard when removing devicemapper devices.
This is enabled by default (only) if using loopback devices and is required to This is enabled by default (only) if using loopback devices and is required to
res-parsify the loopback file on image/container removal. resparsify the loopback file on image/container removal.
Disabling this on loopback can lead to *much* faster container removal times, Disabling this on loopback can lead to *much* faster container removal times,
but will prevent the space used in `/var/lib/docker` directory from being returned to but will prevent the space used in `/var/lib/docker` directory from being returned to
+1 -1
View File
@@ -2,4 +2,4 @@
- ['swarm/README.md', 'User Guide', 'Docker Swarm' ] - ['swarm/README.md', 'User Guide', 'Docker Swarm' ]
- ['swarm/discovery.md', 'Reference', 'Swarm discovery'] - ['swarm/discovery.md', 'Reference', 'Swarm discovery']
- ['swarm/API.md', 'Reference', 'Swarm API'] - ['swarm/API.md', 'Reference', 'Swarm API']
- ['swarm/filters.md', 'Reference', 'Swarm filters'] - ['swarm/scheduler/filter.md', 'Reference', 'Swarm filters']
+11 -5
View File
@@ -69,6 +69,11 @@ pages:
- ['docker-hub/builds.md', 'Docker Hub', 'Automated Builds'] - ['docker-hub/builds.md', 'Docker Hub', 'Automated Builds']
- ['docker-hub/official_repos.md', 'Docker Hub', 'Official Repo Guidelines'] - ['docker-hub/official_repos.md', 'Docker Hub', 'Official Repo Guidelines']
# Docker Hub Enterprise
#- ['docker-hub-enterprise/index.md', '**HIDDEN**' ]
#- ['docker-hub-enterprise/install-config.md', 'Docker Hub Enterprise', 'Installation and Configuration' ]
#- ['docker-hub-enterprise/usage.md', 'Docker Hub Enterprise', 'User Guide' ]
# Examples: # Examples:
- ['examples/index.md', '**HIDDEN**'] - ['examples/index.md', '**HIDDEN**']
- ['examples/nodejs_web_app.md', 'Examples', 'Dockerizing a Node.js web application'] - ['examples/nodejs_web_app.md', 'Examples', 'Dockerizing a Node.js web application']
@@ -86,6 +91,7 @@ pages:
- ['articles/networking.md', 'Articles', 'Advanced networking'] - ['articles/networking.md', 'Articles', 'Advanced networking']
- ['articles/security.md', 'Articles', 'Security'] - ['articles/security.md', 'Articles', 'Security']
- ['articles/https.md', 'Articles', 'Running Docker with HTTPS'] - ['articles/https.md', 'Articles', 'Running Docker with HTTPS']
- ['articles/registry_mirror.md', 'Articles', 'Run a local registry mirror']
- ['articles/host_integration.md', 'Articles', 'Automatically starting containers'] - ['articles/host_integration.md', 'Articles', 'Automatically starting containers']
- ['articles/baseimages.md', 'Articles', 'Creating a base image'] - ['articles/baseimages.md', 'Articles', 'Creating a base image']
- ['articles/dockerfile_best-practices.md', 'Articles', 'Best practices for writing Dockerfiles'] - ['articles/dockerfile_best-practices.md', 'Articles', 'Best practices for writing Dockerfiles']
@@ -115,11 +121,11 @@ pages:
- ['reference/api/docker_remote_api.md', 'Reference', 'Docker Remote API'] - ['reference/api/docker_remote_api.md', 'Reference', 'Docker Remote API']
- ['reference/api/docker_remote_api_v1.17.md', 'Reference', 'Docker Remote API v1.17'] - ['reference/api/docker_remote_api_v1.17.md', 'Reference', 'Docker Remote API v1.17']
- ['reference/api/docker_remote_api_v1.16.md', 'Reference', 'Docker Remote API v1.16'] - ['reference/api/docker_remote_api_v1.16.md', 'Reference', 'Docker Remote API v1.16']
- ['reference/api/docker_remote_api_v1.15.md', 'Reference', 'Docker Remote API v1.15'] - ['reference/api/docker_remote_api_v1.15.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.14.md', 'Reference', 'Docker Remote API v1.14'] - ['reference/api/docker_remote_api_v1.14.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.13.md', 'Reference', 'Docker Remote API v1.13'] - ['reference/api/docker_remote_api_v1.13.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.12.md', 'Reference', 'Docker Remote API v1.12'] - ['reference/api/docker_remote_api_v1.12.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.11.md', 'Reference', 'Docker Remote API v1.11'] - ['reference/api/docker_remote_api_v1.11.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.10.md', '**HIDDEN**'] - ['reference/api/docker_remote_api_v1.10.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.9.md', '**HIDDEN**'] - ['reference/api/docker_remote_api_v1.9.md', '**HIDDEN**']
- ['reference/api/docker_remote_api_v1.8.md', '**HIDDEN**'] - ['reference/api/docker_remote_api_v1.8.md', '**HIDDEN**']
+6 -2
View File
@@ -72,6 +72,9 @@ setup_s3() {
build_current_documentation() { build_current_documentation() {
mkdocs build mkdocs build
cd site/
gzip -9k -f search_content.json
cd ..
} }
upload_current_documentation() { upload_current_documentation() {
@@ -87,8 +90,6 @@ upload_current_documentation() {
echo "Uploading $src" echo "Uploading $src"
echo " to $dst" echo " to $dst"
echo echo
#s3cmd --recursive --follow-symlinks --preserve --acl-public sync "$src" "$dst"
#aws s3 cp --profile $BUCKET --cache-control "max-age=3600" --acl public-read "site/search_content.json" "$dst"
# a really complicated way to send only the files we want # a really complicated way to send only the files we want
# if there are too many in any one set, aws s3 sync seems to fall over with 2 files to go # if there are too many in any one set, aws s3 sync seems to fall over with 2 files to go
@@ -100,6 +101,9 @@ upload_current_documentation() {
echo "$run" echo "$run"
echo "=======================" echo "======================="
$run $run
# Make sure the search_content.json.gz file has the right content-encoding
aws s3 cp --profile $BUCKET --cache-control $cache --content-encoding="gzip" --acl public-read "site/search_content.json.gz" "$dst"
} }
invalidate_cache() { invalidate_cache() {
-15
View File
@@ -1,15 +0,0 @@
# Articles
- [Docker Basics](basics/)
- [Docker Security](security/)
- [Running the Docker daemon with HTTPS](https/)
- [Configure Networking](networking/)
- [Using Supervisor with Docker](using_supervisord/)
- [Process Management with CFEngine](cfengine_process_management/)
- [Using Puppet](puppet/)
- [Create a Base Image](baseimages/)
- [Runtime Metrics](runmetrics/)
- [Automatically Start Containers](host_integration/)
- [Link via an Ambassador Container](ambassador_pattern_linking/)
- [Increase a Boot2Docker Volume](b2d_volume_resize/)
- [Run a Local Registry Mirror](registry_mirror/)
+1 -1
View File
@@ -45,7 +45,7 @@ Our example is set up like this:
## Creating the client certificates ## Creating the client certificates
You will use OpenSSL's `genrsa` and `req` commands to first generate an RSA You will use OpenSSL's `genrsa` and `req` commands to first generate an RSA
key and then use the key to create the certificate request. key and then use the key to create the certificate.
$ openssl genrsa -out client.key 1024 $ openssl genrsa -out client.key 1024
$ openssl req -new -x509 -text -key client.key -out client.cert $ openssl req -new -x509 -text -key client.key -out client.cert
@@ -359,7 +359,7 @@ like `RUN groupadd -r postgres && useradd -r -g postgres postgres`.
> rebuilds. So, if its critical, you should assign an explicit UID/GID. > rebuilds. So, if its critical, you should assign an explicit UID/GID.
You should avoid installing or using `sudo` since it has unpredictable TTY and You should avoid installing or using `sudo` since it has unpredictable TTY and
signal-forwarding behavior that can cause more more problems than it solves. If signal-forwarding behavior that can cause more problems than it solves. If
you absolutely need functionality similar to `sudo` (e.g., initializing the you absolutely need functionality similar to `sudo` (e.g., initializing the
daemon as root but running it as non-root), you may be able to use daemon as root but running it as non-root), you may be able to use
[“gosu”](https://github.com/tianon/gosu). [“gosu”](https://github.com/tianon/gosu).
+44 -29
View File
@@ -26,7 +26,7 @@ it will only connect to servers with a certificate signed by that CA.
## Create a CA, server and client keys with OpenSSL ## Create a CA, server and client keys with OpenSSL
> **Note:** replace all instances of `$HOST` in the following example with the > **Note**: replace all instances of `$HOST` in the following example with the
> DNS name of your Docker daemon's host. > DNS name of your Docker daemon's host.
First generate CA private and public keys: First generate CA private and public keys:
@@ -40,26 +40,26 @@ First generate CA private and public keys:
Verifying - Enter pass phrase for ca-key.pem: Verifying - Enter pass phrase for ca-key.pem:
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem $ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Enter pass phrase for ca-key.pem: Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated You are about to be asked to enter information that will be incorporated
into your certificate request. into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN. What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank There are quite a few fields but you can leave some blank
For some fields there will be a default value, For some fields there will be a default value,
If you enter '.', the field will be left blank. If you enter '.', the field will be left blank.
----- -----
Country Name (2 letter code) [AU]: Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:Queensland State or Province Name (full name) [Some-State]:Queensland
Locality Name (eg, city) []:Brisbane Locality Name (eg, city) []:Brisbane
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc
Organizational Unit Name (eg, section) []:Boot2Docker Organizational Unit Name (eg, section) []:Boot2Docker
Common Name (e.g. server FQDN or YOUR name) []:$HOST Common Name (e.g. server FQDN or YOUR name) []:$HOST
Email Address []:Sven@home.org.au Email Address []:Sven@home.org.au
Now that we have a CA, you can create a server key and certificate Now that we have a CA, you can create a server key and certificate
signing request (CSR). Make sure that "Common Name" (i.e., server FQDN or YOUR signing request (CSR). Make sure that "Common Name" (i.e., server FQDN or YOUR
name) matches the hostname you will use to connect to Docker: name) matches the hostname you will use to connect to Docker:
> **Note:** replace all instances of `$HOST` in the following example with the > **Note**: replace all instances of `$HOST` in the following example with the
> DNS name of your Docker daemon's host. > DNS name of your Docker daemon's host.
$ openssl genrsa -out server-key.pem 2048 $ openssl genrsa -out server-key.pem 2048
@@ -69,7 +69,7 @@ name) matches the hostname you will use to connect to Docker:
e is 65537 (0x10001) e is 65537 (0x10001)
$ openssl req -subj "/CN=$HOST" -new -key server-key.pem -out server.csr $ openssl req -subj "/CN=$HOST" -new -key server-key.pem -out server.csr
Next, we're going to sign the key with our CA: Next, we're going to sign the public key with our CA:
$ openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \ $ openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -CAcreateserial -out server-cert.pem
@@ -93,7 +93,7 @@ config file:
$ echo extendedKeyUsage = clientAuth > extfile.cnf $ echo extendedKeyUsage = clientAuth > extfile.cnf
Now sign the key: Now sign the public key:
$ openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem \ $ openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile.cnf -CAcreateserial -out cert.pem -extfile extfile.cnf
@@ -102,6 +102,24 @@ Now sign the key:
Getting CA Private Key Getting CA Private Key
Enter pass phrase for ca-key.pem: Enter pass phrase for ca-key.pem:
After generating `cert.pem` and `server-cert.pem` you can safely remove the
two certificate signing requests:
$ rm -v client.csr server.csr
With a default `umask` of 022, your secret keys will be *world-readable* and
writable for you and your group.
In order to protect your keys from accidental damage, you will want to remove their
write permissions. To make them only readable by you, change file modes as follows:
$ chmod -v 0400 ca-key.pem key.pem server-key.pem
Certificates can be world-readable, but you might want to remove write access to
prevent accidental damage:
$ chmod -v 0444 ca.pem server-cert.pem cert.pem
Now you can make the Docker daemon only accept connections from clients Now you can make the Docker daemon only accept connections from clients
providing a certificate trusted by our CA: providing a certificate trusted by our CA:
@@ -111,7 +129,7 @@ providing a certificate trusted by our CA:
To be able to connect to Docker and validate its certificate, you now To be able to connect to Docker and validate its certificate, you now
need to provide your client keys, certificates and trusted CA: need to provide your client keys, certificates and trusted CA:
> **Note:** replace all instances of `$HOST` in the following example with the > **Note**: replace all instances of `$HOST` in the following example with the
> DNS name of your Docker daemon's host. > DNS name of your Docker daemon's host.
$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \ $ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \
@@ -130,16 +148,13 @@ need to provide your client keys, certificates and trusted CA:
## Secure by default ## Secure by default
If you want to secure your Docker client connections by default, you can move If you want to secure your Docker client connections by default, you can move
the files to the `.docker` directory in your home directory - and set the the files to the `.docker` directory in your home directory -- and set the
`DOCKER_HOST` and `DOCKER_TLS_VERIFY` variables as well (instead of passing `DOCKER_HOST` and `DOCKER_TLS_VERIFY` variables as well (instead of passing
`-H=tcp://:2376` and `--tlsverify` on every call). `-H=tcp://$HOST:2376` and `--tlsverify` on every call).
$ mkdir -p ~/.docker $ mkdir -pv ~/.docker
$ cp ca.pem ~/.docker/ca.pem $ cp -v {ca,cert,key}.pem ~/.docker
$ cp cert.pem ~/.docker/cert.pem $ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1
$ cp key.pem ~/.docker/key.pem
$ export DOCKER_HOST=tcp://:2376
$ export DOCKER_TLS_VERIFY=1
Docker will now connect securely by default: Docker will now connect securely by default:
@@ -165,11 +180,11 @@ Docker in various other modes by mixing the flags.
certificate and authenticate server based on given CA certificate and authenticate server based on given CA
If found, the client will send its client certificate, so you just need If found, the client will send its client certificate, so you just need
to drop your keys into `~/.docker/<ca, cert or key>.pem`. Alternatively, to drop your keys into `~/.docker/{ca,cert,key}.pem`. Alternatively,
if you want to store your keys in another location, you can specify that if you want to store your keys in another location, you can specify that
location using the environment variable `DOCKER_CERT_PATH`. location using the environment variable `DOCKER_CERT_PATH`.
$ export DOCKER_CERT_PATH=${HOME}/.docker/zone1/ $ export DOCKER_CERT_PATH=~/.docker/zone1/
$ docker --tlsverify ps $ docker --tlsverify ps
### Connecting to the Secure Docker port using `curl` ### Connecting to the Secure Docker port using `curl`
+4 -3
View File
@@ -13,11 +13,12 @@ cert: build
certs: cert certs: cert
run: run:
docker -d -D --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:6666 --pidfile=$(pwd)/docker.pid --graph=$(pwd)/graph sudo docker -d -D --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:6666 --pidfile=$(pwd)/docker.pid --graph=$(pwd)/graph
client: client:
docker --tls --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 version sudo docker --tls --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 version
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 info sudo docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 info
sudo curl https://$(HOST):6666/images/json --cert cert.pem --key key.pem --cacert ca.pem
clean: clean:
rm ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server-key.pem server.csr rm ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server-key.pem server.csr
+7 -1
View File
@@ -1,4 +1,10 @@
#!/bin/sh #!/bin/sh
echo "#!/bin/sh" echo "#!/bin/sh"
cat ../https.md | awk '{if (sub(/\\$/,"")) printf "%s", $0; else print $0}' | grep ' $ ' | sed 's/ $ //g' | sed 's/2375/7777/g' | sed 's/2376/7778/g' cat ../https.md | awk '{if (sub(/\\$/,"")) printf "%s", $0; else print $0}' \
| grep ' $ ' \
| sed 's/ $ //g' \
| sed 's/2375/7777/g' \
| sed 's/2376/7778/g' \
| sed 's/^docker/# docker/g' \
| sed 's/^curl/# curl/g'
+13 -3
View File
@@ -433,7 +433,7 @@ To assign globally routable IPv6 addresses to your containers you have to
specify an IPv6 subnet to pick the addresses from. Set the IPv6 subnet via the specify an IPv6 subnet to pick the addresses from. Set the IPv6 subnet via the
`--fixed-cidr-v6` parameter when starting Docker daemon: `--fixed-cidr-v6` parameter when starting Docker daemon:
docker -d --ipv6 --fixed-cidr-v6="2001:db8:0:2:/64" docker -d --ipv6 --fixed-cidr-v6="2001:db8:0:2::/64"
The subnet for Docker containers should at least have a size of `/80`. This way The subnet for Docker containers should at least have a size of `/80`. This way
an IPv6 address can end with the container's MAC address and you prevent NDP an IPv6 address can end with the container's MAC address and you prevent NDP
@@ -443,11 +443,11 @@ With the `--fixed-cidr-v6` parameter set Docker will add a new route to the
routing table. Further IPv6 routing will be enabled (you may prevent this by routing table. Further IPv6 routing will be enabled (you may prevent this by
starting Docker daemon with `--ip-forward=false`): starting Docker daemon with `--ip-forward=false`):
$ route -A inet6 add 2001:db8:0:2/64 dev docker0 $ route -A inet6 add 2001:db8:0:2::/64 dev docker0
$ echo 1 > /proc/sys/net/ipv6/conf/default/forwarding $ echo 1 > /proc/sys/net/ipv6/conf/default/forwarding
$ echo 1 > /proc/sys/net/ipv6/conf/all/forwarding $ echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
All traffic to the subnet `2001:db8:0:2/64` will now be routed All traffic to the subnet `2001:db8:0:2::/64` will now be routed
via the `docker0` interface. via the `docker0` interface.
Be aware that IPv6 forwarding may interfere with your existing IPv6 Be aware that IPv6 forwarding may interfere with your existing IPv6
@@ -687,6 +687,7 @@ stopping the service and removing the interface:
$ sudo service docker stop $ sudo service docker stop
$ sudo ip link set dev docker0 down $ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0 $ sudo brctl delbr docker0
$ sudo iptables -t nat -F POSTROUTING
Then, before starting the Docker service, create your own bridge and Then, before starting the Docker service, create your own bridge and
give it whatever configuration you want. Here we will create a simple give it whatever configuration you want. Here we will create a simple
@@ -713,6 +714,15 @@ illustrate the technique.
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker $ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start $ sudo service docker start
# Confirming new outgoing NAT masquerade is set up
$ sudo iptables -t nat -L -n
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.5.0/24 0.0.0.0/0
The result should be that the Docker server starts successfully and is The result should be that the Docker server starts successfully and is
now prepared to bind containers to the new bridge. After pausing to now prepared to bind containers to the new bridge. After pausing to
verify the bridge's configuration, try creating a container — you will verify the bridge's configuration, try creating a container — you will
+1 -1
View File
@@ -38,7 +38,7 @@ For example, if your mirror is serving on `http://10.0.0.2:5000`, you would run:
**NOTE:** **NOTE:**
Depending on your local host setup, you may be able to add the Depending on your local host setup, you may be able to add the
`--registry-mirror` options to the `DOCKER_OPTS` variable in `--registry-mirror` options to the `DOCKER_OPTS` variable in
`/etc/defaults/docker`. `/etc/default/docker`.
### Step 2: Run the local registry mirror ### Step 2: Run the local registry mirror
+1 -1
View File
@@ -59,7 +59,7 @@ In this example, we'll assume that your `docker.service` file looks something li
This will allow us to add extra flags to the `/etc/sysconfig/docker` file by This will allow us to add extra flags to the `/etc/sysconfig/docker` file by
setting `OPTIONS`: setting `OPTIONS`:
OPTIONS="--graph /mnt/docker-data --storage btrfs" OPTIONS="--graph /mnt/docker-data --storage-driver btrfs"
You can also set other environment variables in this file, for example, the You can also set other environment variables in this file, for example, the
`HTTP_PROXY` environment variables described below. `HTTP_PROXY` environment variables described below.
+1 -1
View File
@@ -39,7 +39,7 @@ our container.
Here we're installing the `openssh-server`, Here we're installing the `openssh-server`,
`apache2` and `supervisor` `apache2` and `supervisor`
(which provides the Supervisor daemon) packages. We're also creating two (which provides the Supervisor daemon) packages. We're also creating four
new directories that are needed to run our SSH daemon and Supervisor. new directories that are needed to run our SSH daemon and Supervisor.
## Adding Supervisor's configuration file ## Adding Supervisor's configuration file
+18 -12
View File
@@ -10,6 +10,12 @@ used for all tests, builds and releases. The standard development
environment defines all build dependencies: system libraries and environment defines all build dependencies: system libraries and
binaries, go environment, go dependencies, etc. binaries, go environment, go dependencies, etc.
**Things you need:**
* Docker
* git
* make
## Install Docker ## Install Docker
Docker's build environment itself is a Docker container, so the first Docker's build environment itself is a Docker container, so the first
@@ -43,18 +49,18 @@ with the name of branch or revision number.
This following command builds a development environment using the This following command builds a development environment using the
`Dockerfile` in the current directory. Essentially, it installs all `Dockerfile` in the current directory. Essentially, it installs all
the build and runtime dependencies necessary to build and test Docker. the build and runtime dependencies necessary to build and test Docker.
Your first build will take some time to complete. On Linux systems: Your first build will take some time to complete. On Linux systems and on Mac
OS X from within the `boot2docker` shell:
$ sudo make build
On Mac OS X, from within the `boot2docker` shell:
$ make build $ make build
> **Note**: > **Note**:
> On Mac OS X, the Docker make targets such as `build`, `binary`, and `test` > On Mac OS X, the Docker make targets such as `build`, `binary`, and `test`
> should **not** be built by the 'root' user. Therefore, you shouldn't use `sudo` when > should **not** be built by the 'root' user. Therefore, you shouldn't use `sudo` when
> running these commands on OS X. > running these commands on OS X.
> On Linux, we suggest you add your current user to the `docker` group via
> [these
> instructions](http://docs.docker.com/installation/ubuntulinux/#giving-non-root-access).
If the build is successful, congratulations! You have produced a clean If the build is successful, congratulations! You have produced a clean
build of docker, neatly encapsulated in a standard build environment. build of docker, neatly encapsulated in a standard build environment.
@@ -64,13 +70,13 @@ build of docker, neatly encapsulated in a standard build environment.
To create the Docker binary, run this command: To create the Docker binary, run this command:
$ sudo make binary $ make binary
This will create the Docker binary in `./bundles/<version>-dev/binary/`. If you This will create the Docker binary in `./bundles/<version>-dev/binary/`. If you
do not see files in the `./bundles` directory in your host, your `BINDDIR` do not see files in the `./bundles` directory in your host, your `BINDDIR`
setting is not set quite right. You want to run the following command: setting is not set quite right. You want to run the following command:
$ sudo make BINDDIR=. binary $ make BINDDIR=. binary
If you are on a non-Linux platform, e.g., OSX, you'll want to run `make cross` If you are on a non-Linux platform, e.g., OSX, you'll want to run `make cross`
or `make BINDDIR=. cross`. or `make BINDDIR=. cross`.
@@ -91,7 +97,7 @@ on ubuntu:
To execute the test cases, run this command: To execute the test cases, run this command:
$ sudo make test $ make test
If the test are successful then the tail of the output should look If the test are successful then the tail of the output should look
something like this something like this
@@ -138,7 +144,7 @@ is recommended.
You can run an interactive session in the newly built container: You can run an interactive session in the newly built container:
$ sudo make shell $ make shell
# type 'exit' or Ctrl-D to exit # type 'exit' or Ctrl-D to exit
@@ -148,7 +154,7 @@ If you want to read the documentation from a local website, or are
making changes to it, you can build the documentation and then serve it making changes to it, you can build the documentation and then serve it
by: by:
$ sudo make docs $ make docs
# when its done, you can point your browser to http://yourdockerhost:8000 # when its done, you can point your browser to http://yourdockerhost:8000
# type Ctrl-C to exit # type Ctrl-C to exit
@@ -0,0 +1,8 @@
page_title: Using Docker Hub Enterprise Installation
page_description: Docker Hub Enterprise Installation
page_keywords: docker hub enterprise
# Docker Hub Enterprise Installation
Documenation coming soon.
@@ -0,0 +1,9 @@
page_title: Using Docker Hub Enterprise
page_description: Docker Hub Enterprise
page_keywords: docker hub enterprise
# Docker Hub Enterprise
Documenation coming soon.
+16 -8
View File
@@ -8,7 +8,7 @@ page_keywords: Docker, docker, registry, accounts, plans, Dockerfile, Docker Hub
*Automated Builds* are a special feature of Docker Hub which allow you to *Automated Builds* are a special feature of Docker Hub which allow you to
use [Docker Hub's](https://hub.docker.com) build clusters to automatically use [Docker Hub's](https://hub.docker.com) build clusters to automatically
create images from a specified `Dockerfile` and a GitHub or Bitbucket repo create images from a specified `Dockerfile` and a GitHub or Bitbucket repository
(or "context"). The system will clone your repository and build the image (or "context"). The system will clone your repository and build the image
described by the `Dockerfile` using the repository as the context. The described by the `Dockerfile` using the repository as the context. The
resulting automated image will then be uploaded to the Docker Hub registry resulting automated image will then be uploaded to the Docker Hub registry
@@ -148,7 +148,7 @@ https://registry.hub.docker.com/associate/bitbucket/).
Then follow the onscreen instructions to authorize and link your Then follow the onscreen instructions to authorize and link your
Bitbucket account to Docker Hub. Once it is linked, you'll be able Bitbucket account to Docker Hub. Once it is linked, you'll be able
to choose a repo from which to create the Automatic Build. to choose a repository from which to create the Automatic Build.
### Creating an Automated Build ### Creating an Automated Build
@@ -159,7 +159,7 @@ public or private Bitbucket repositories with a `Dockerfile`.
### Adding a Hook ### Adding a Hook
When you link your Docker Hub account, a `POST` hook should get automatically When you link your Docker Hub account, a `POST` hook should get automatically
added to your Bitbucket repo. Follow the steps below to confirm or modify the added to your Bitbucket repository. Follow the steps below to confirm or modify the
Bitbucket hooks for your Automated Build: Bitbucket hooks for your Automated Build:
<table class="table table-bordered"> <table class="table table-bordered">
@@ -195,8 +195,8 @@ Bitbucket hooks for your Automated Build:
During the build process, Docker will copy the contents of your `Dockerfile`. During the build process, Docker will copy the contents of your `Dockerfile`.
It will also add it to the [Docker Hub](https://hub.docker.com) for the Docker It will also add it to the [Docker Hub](https://hub.docker.com) for the Docker
community (for public repos) or approved team members/orgs (for private repos) community (for public repositories) or approved team members/orgs (for private
to see on the repository page. repositories) to see on the repository page.
### README.md ### README.md
@@ -217,7 +217,7 @@ Automated Build, it will give you a URL to which you can send POST requests.
This will trigger the Automated Build, much as with a GitHub webhook. This will trigger the Automated Build, much as with a GitHub webhook.
Build triggers are available under the Settings menu of each Automated Build Build triggers are available under the Settings menu of each Automated Build
repo on the Docker Hub. repository on the Docker Hub.
![Build trigger screen](/docker-hub/hub-images/build-trigger.png) ![Build trigger screen](/docker-hub/hub-images/build-trigger.png)
@@ -249,7 +249,11 @@ payload:
{ {
"callback_url": "https://registry.hub.docker.com/u/svendowideit/testhook/hook/2141b5bi5i5b02bec211i4eeih0242eg11000a/", "callback_url": "https://registry.hub.docker.com/u/svendowideit/testhook/hook/2141b5bi5i5b02bec211i4eeih0242eg11000a/",
"push_data": { "push_data": {
"images": [], "images": [
"27d47432a69bca5f2700e4dff7de0388ed65f9d3fb1ec645e2bc24c223dc1cc3",
"51a9c7c1f8bb2fa19bcd09789a34e63f35abb80044bc10196e304f6634cc582c",
...
],
"pushed_at": 1.417566161e+09, "pushed_at": 1.417566161e+09,
"pusher": "trustedbuilder" "pusher": "trustedbuilder"
}, },
@@ -278,6 +282,10 @@ Webhooks are available under the Settings menu of each Repository.
> **Note:** If you want to test your webhook out we recommend using > **Note:** If you want to test your webhook out we recommend using
> a tool like [requestb.in](http://requestb.in/). > a tool like [requestb.in](http://requestb.in/).
> **Note**: The Docker Hub servers are currently in the IP range
> `162.242.195.64 - 162.242.195.127`, so you can restrict your webhooks to
> accept webhook requests from that set of IP addresses.
### Webhook chains ### Webhook chains
Webhook chains allow you to chain calls to multiple services. For example, Webhook chains allow you to chain calls to multiple services. For example,
@@ -332,7 +340,7 @@ another. If one gets updated,the linking system triggers a rebuild
for the other Automated Build. This makes it easy to keep all your for the other Automated Build. This makes it easy to keep all your
Automated Builds up to date. Automated Builds up to date.
To add a link, go to the repo for the Automated Build you want to To add a link, go to the repository for the Automated Build you want to
link to and click on *Repository Links* under the Settings menu at link to and click on *Repository Links* under the Settings menu at
right. Then, enter the name of the repository that you want have linked. right. Then, enter the name of the repository that you want have linked.
+13 -5
View File
@@ -105,16 +105,17 @@ Settings page. A webhook is called only after a successful `push` is
made. The webhook calls are HTTP POST requests with a JSON payload made. The webhook calls are HTTP POST requests with a JSON payload
similar to the example shown below. similar to the example shown below.
> **Note:** For testing, you can try an HTTP request tool like
> [requestb.in](http://requestb.in/).
*Example webhook JSON payload:* *Example webhook JSON payload:*
``` ```
{ {
"callback_url": "https://registry.hub.docker.com/u/svendowideit/busybox/hook/2141bc0cdec4hebec411i4c1g40242eg110020/", "callback_url": "https://registry.hub.docker.com/u/svendowideit/busybox/hook/2141bc0cdec4hebec411i4c1g40242eg110020/",
"push_data": { "push_data": {
"images": [], "images": [
"27d47432a69bca5f2700e4dff7de0388ed65f9d3fb1ec645e2bc24c223dc1cc3",
"51a9c7c1f8bb2fa19bcd09789a34e63f35abb80044bc10196e304f6634cc582c",
...
],
"pushed_at": 1.417566822e+09, "pushed_at": 1.417566822e+09,
"pusher": "svendowideit" "pusher": "svendowideit"
}, },
@@ -138,9 +139,16 @@ similar to the example shown below.
Webhooks allow you to notify people, services and other applications of Webhooks allow you to notify people, services and other applications of
new updates to your images and repositories. To get started adding webhooks, new updates to your images and repositories. To get started adding webhooks,
go to the desired repo in the Hub, and click "Webhooks" under the "Settings" go to the desired repository in the Hub, and click "Webhooks" under the "Settings"
box. box.
> **Note:** For testing, you can try an HTTP request tool like
> [requestb.in](http://requestb.in/).
> **Note**: The Docker Hub servers are currently in the IP range
> `162.242.195.64 - 162.242.195.127`, so you can restrict your webhooks to
> accept webhook requests from that set of IP addresses.
### Webhook chains ### Webhook chains
Webhook chains allow you to chain calls to multiple services. For example, Webhook chains allow you to chain calls to multiple services. For example,
+38 -4
View File
@@ -32,18 +32,52 @@ runtime:
Docker in daemon mode has specific kernel requirements. For details, Docker in daemon mode has specific kernel requirements. For details,
check your distribution in [*Installation*](../#installation-list). check your distribution in [*Installation*](../#installation-list).
In general, a 3.8 Linux kernel is the minimum requirement for Docker, as A 3.10 Linux kernel is the minimum requirement for Docker.
some of the prior versions have known issues that are triggered by Docker. Kernels older than 3.10 lack some of the features required to run Docker
Linux kernel versions older than 3.8 are known to cause kernel panics and containers. These older versions are known to have bugs which cause data loss
to break Docker. and frequently panic under certain conditions.
The latest minor version (3.x.y) of the 3.10 (or a newer maintained version) The latest minor version (3.x.y) of the 3.10 (or a newer maintained version)
Linux kernel is recommended. Keeping the kernel up to date with the latest Linux kernel is recommended. Keeping the kernel up to date with the latest
minor version will ensure critical kernel bugs get fixed. minor version will ensure critical kernel bugs get fixed.
> **Warning**:
> Installing custom kernels and kernel packages is probably not
> supported by your Linux distribution's vendor. Please make sure to
> ask your vendor about Docker support first before attempting to
> install custom kernels on your distribution.
> **Warning**:
> Installing a newer kernel might not be enough for some distributions
> which provide packages which are too old or incompatible with
> newer kernels.
Note that Docker also has a client mode, which can run on virtually any Note that Docker also has a client mode, which can run on virtually any
Linux kernel (it even builds on OS X!). Linux kernel (it even builds on OS X!).
## Enable AppArmor and SELinux when possible
Please use AppArmor or SELinux if your Linux distribution supports
either of the two. This helps improve security and blocks certain
types of exploits. Your distribution's documentation should provide
detailed steps on how to enable the recommended security mechanism.
Some Linux distributions enable AppArmor or SELinux by default and
they run a kernel which doesn't meet the minimum requirements (3.10
or newer). Updating the kernel to 3.10 or newer on such a system
might not be enough to start Docker and run containers.
Incompatibilities between the version of AppArmor/SELinux user
space utilities provided by the system and the kernel could prevent
Docker from running, from starting containers or, cause containers to
exhibit unexpected behaviour.
> **Warning**:
> If either of the security mechanisms is enabled, it should not be
> disabled to make Docker or its containers run. This will reduce
> security in that environment, lose support from the distribution's
> vendor for the system, and might break regulations and security
> policies in heavily regulated environments.
## Get the docker binary: ## Get the docker binary:
$ wget https://get.docker.com/builds/Linux/x86_64/docker-latest -O docker $ wget https://get.docker.com/builds/Linux/x86_64/docker-latest -O docker
+51 -48
View File
@@ -4,48 +4,34 @@ page_keywords: Docker, Docker documentation, requirements, linux, centos, epel,
# CentOS # CentOS
While the Docker package is provided by default as part of CentOS-7, Docker is supported on the following versions of CentOS:
it is provided by the EPEL repository for CentOS-6. Please note that
this changes the installation instructions slightly between versions. If you
need the latest version, you can always use the latest binary which works on
kernel 3.8 and above.
These instructions work for CentOS 6 and later. They will likely work for - [*CentOS 7 (64-bit)*](#installing-docker---centos-7)
other binary compatible EL6 distributions such as Scientific Linux, but - [*CentOS 6.5 (64-bit)*](#installing-docker---centos-6.5) or later
they haven't been tested.
These instructions are likely work for other binary compatible EL6/EL7 distributions
such as Scientific Linux, but they haven't been tested.
Please note that due to the current Docker limitations, Docker is able to Please note that due to the current Docker limitations, Docker is able to
run only on the **64 bit** architecture. run only on the **64 bit** architecture.
To run Docker, you will need [CentOS6](http://www.centos.org) or higher, ## Kernel support
with a kernel version 2.6.32-431 or higher as this has specific kernel
fixes to allow Docker to run. Currently the CentOS project will only support Docker when running on kernels
shipped by the distribution. There are kernel changes which will cause issues
if one decides to step outside that box and run non-distribution kernel packages.
To run Docker on [CentOS-6.5](http://www.centos.org) or later, you will need
kernel version 2.6.32-431 or higher as this has specific kernel fixes to allow
Docker to run.
## Installing Docker - CentOS-7 ## Installing Docker - CentOS-7
Docker is included by default in the CentOS-Extras repository. To install Docker is included by default in the CentOS-Extras repository. To install
simply run the following command. run the following command:
$ sudo yum install docker $ sudo yum install docker
## Kernel support Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
Currently the CentOS project will only support Docker via the EPEL package when
running on kernels shipped by the distribution. There are things like namespace
changes which will cause issues if one decides to step outside that box and run
non-distro kernel packages.
### Manual installation of latest version
While using a package is the recommended way of installing Docker,
the above package might not be the latest version. If you need the latest
version, [you can install the binary directly](
https://docs.docker.com/installation/binaries/).
When installing the binary without a package, you may want
to integrate Docker with systemd. For this, simply install the two unit files
(service and socket) from [the github
repository](https://github.com/docker/docker/tree/master/contrib/init/systemd)
to `/etc/systemd/system`.
### FirewallD ### FirewallD
@@ -55,32 +41,49 @@ conflict with Docker.
When `firewalld` is started or restarted it will remove the `DOCKER` chain When `firewalld` is started or restarted it will remove the `DOCKER` chain
from iptables, preventing Docker from working properly. from iptables, preventing Docker from working properly.
When using systemd, `firewalld` is started before Docker, but if you When using Systemd, `firewalld` is started before Docker, but if you
start or restart `firewalld` after Docker, you will have to restart the Docker daemon. start or restart `firewalld` after Docker, you will have to restart the Docker daemon.
## Installing Docker - CentOS-6 ## Installing Docker - CentOS-6.5
Please note that this for CentOS-6, this package is part of [Extra Packages
for Enterprise Linux (EPEL)](https://fedoraproject.org/wiki/EPEL), a community effort For Centos-6.5, the Docker package is part of [Extra Packages
to create and maintain additional packages for the RHEL distribution. for Enterprise Linux (EPEL)](https://fedoraproject.org/wiki/EPEL) repository,
a community effort to create and maintain additional packages for the RHEL distribution.
Firstly, you need to ensure you have the EPEL repository enabled. Please Firstly, you need to ensure you have the EPEL repository enabled. Please
follow the [EPEL installation instructions]( follow the [EPEL installation instructions](
https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F). https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F).
The `docker-io` package provides Docker on EPEL. For CentOS-6, there is a package name conflict with a system tray application
and its executable, so the Docker RPM package was called `docker-io`.
If you already have the (unrelated) `docker` package To proceed with `docker-io` installation on CentOS-6, you may need to remove the
installed, it will conflict with `docker-io`. `docker` package first.
There's a [bug report](
https://bugzilla.redhat.com/show_bug.cgi?id=1043676) filed for it.
To proceed with `docker-io` installation, please remove `docker` first.
Next, let's install the `docker-io` package which $ sudo yum -y remove docker
will install Docker on our host.
Next, let's install the `docker-io` package which will install Docker on our host.
$ sudo yum install docker-io $ sudo yum install docker-io
## Using Docker Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
## Manual installation of latest Docker release
While using a package is the recommended way of installing Docker,
the above package might not be the current release version. If you need the latest
version, [you can install the binary directly](
https://docs.docker.com/installation/binaries/).
When installing the binary without a package, you may want
to integrate Docker with Systemd. For this, install the two unit files
(service and socket) from [the GitHub
repository](https://github.com/docker/docker/tree/master/contrib/init/systemd)
to `/etc/systemd/system`.
Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
## Starting the Docker daemon
Once Docker is installed, you will need to start the docker daemon. Once Docker is installed, you will need to start the docker daemon.
@@ -115,13 +118,13 @@ If everything is working properly, you'll get a simple bash prompt. Type
## Custom daemon options ## Custom daemon options
If you need to add an HTTP Proxy, set a different directory or partition for the If you need to add an HTTP Proxy, set a different directory or partition for the
Docker runtime files, or make other customizations, read our systemd article to Docker runtime files, or make other customizations, read our Systemd article to
learn how to [customize your systemd Docker daemon options](/articles/systemd/). learn how to [customize your Systemd Docker daemon options](/articles/systemd/).
## Dockerfiles ## Dockerfiles
The CentOS Project provides a number of sample Dockerfiles which you may use The CentOS Project provides a number of sample Dockerfiles which you may use
either as templates or to familiarize yourself with docker. These templates either as templates or to familiarize yourself with docker. These templates
are available on github at [https://github.com/CentOS/CentOS-Dockerfiles]( are available on GitHub at [https://github.com/CentOS/CentOS-Dockerfiles](
https://github.com/CentOS/CentOS-Dockerfiles) https://github.com/CentOS/CentOS-Dockerfiles)
**Done!** You can either continue with the [Docker User **Done!** You can either continue with the [Docker User
+41 -36
View File
@@ -1,41 +1,49 @@
page_title: Installation on Fedora page_title: Installation on Fedora
page_description: Installation instructions for Docker on Fedora. page_description: Instructions for installing Docker on Fedora.
page_keywords: Docker, Docker documentation, Fedora, requirements, virtualbox, vagrant, git, ssh, putty, cygwin, linux page_keywords: Docker, Docker documentation, Fedora, requirements, linux
# Fedora # Fedora
Docker is available in **Fedora 19 and later**. Please note that due to Docker is supported on the following versions of Fedora:
the current Docker limitations Docker is able to run only on the **64
bit** architecture.
## Installation - [*Fedora 20 (64-bit)*](#fedora-20-installation)
- [*Fedora 21 and later (64-bit)*](#fedora-21-and-later-installation)
The `docker-io` package provides Docker on Fedora. Currently the Fedora project will only support Docker when running on kernels
shipped by the distribution. There are kernel changes which will cause issues
if one decides to step outside that box and run non-distribution kernel packages.
If you have the (unrelated) `docker` package installed already, it will ## Fedora 21 and later installation
conflict with `docker-io`. There's a [bug
report](https://bugzilla.redhat.com/show_bug.cgi?id=1043676) filed for Install the `docker` package which will install Docker on our host.
it. To proceed with `docker-io` installation on Fedora 19, please remove
`docker` first. $ sudo yum -y install docker
To update the `docker` package:
$ sudo yum -y update docker
Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
## Fedora 20 installation
For `Fedora 20`, there is a package name conflict with a system tray application
and its executable, so the Docker RPM package was called `docker-io`.
To proceed with `docker-io` installation on Fedora 20, please remove the `docker`
package first.
$ sudo yum -y remove docker $ sudo yum -y remove docker
For Fedora 21 and later, the `wmdocker` package will
provide the same functionality as `docker` and will
also not conflict with `docker-io`.
$ sudo yum -y install wmdocker
$ sudo yum -y remove docker
Install the `docker-io` package which will install
Docker on our host.
$ sudo yum -y install docker-io $ sudo yum -y install docker-io
To update the `docker-io` package: To update the `docker` package:
$ sudo yum -y update docker-io $ sudo yum -y update docker-io
Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
## Starting the Docker daemon
Now that it's installed, let's start the Docker daemon. Now that it's installed, let's start the Docker daemon.
$ sudo systemctl start docker $ sudo systemctl start docker
@@ -54,24 +62,21 @@ Now let's verify that Docker is working.
## Granting rights to users to use Docker ## Granting rights to users to use Docker
Fedora 19 and 20 shipped with Docker 0.11. The package has already been updated
to 1.0 in Fedora 20. If you are still using the 0.11 version you will need to
grant rights to users of Docker.
The `docker` command line tool contacts the `docker` daemon process via a The `docker` command line tool contacts the `docker` daemon process via a
socket file `/var/run/docker.sock` owned by group `docker`. One must be socket file `/var/run/docker.sock` owned by `root:root`. Though it's
member of that group in order to contact the `docker -d` process. [recommended](https://lists.projectatomic.io/projectatomic-archives/atomic-devel/2015-January/msg00034.html)
to use `sudo` for docker commands, if users wish to avoid it, an administrator can
create a `docker` group, have it own `/var/run/docker.sock`, and add users to this group.
$ usermod -a -G docker login_name $ sudo groupadd docker
$ sudo chown root:docker /var/run/docker.sock
Adding users to the `docker` group is *not* necessary for Docker versions 1.0 $ sudo usermod -a -G docker $USERNAME
and above.
## Custom daemon options ## Custom daemon options
If you need to add an HTTP Proxy, set a different directory or partition for the If you need to add an HTTP Proxy, set a different directory or partition for the
Docker runtime files, or make other customizations, read our systemd article to Docker runtime files, or make other customizations, read our Systemd article to
learn how to [customize your systemd Docker daemon options](/articles/systemd/). learn how to [customize your Systemd Docker daemon options](/articles/systemd/).
## What next? ## What next?
+48 -26
View File
@@ -1,10 +1,24 @@
page_title: Installation on Red Hat Enterprise Linux page_title: Installation on Red Hat Enterprise Linux
page_description: Installation instructions for Docker on Red Hat Enterprise Linux. page_description: Instructions for installing Docker on Red Hat Enterprise Linux.
page_keywords: Docker, Docker documentation, requirements, linux, rhel, centos page_keywords: Docker, Docker documentation, requirements, linux, rhel
# Red Hat Enterprise Linux 7 # Red Hat Enterprise Linux
**Red Hat Enterprise Linux 7** has [shipped with Docker is supported on the following versions of RHEL:
- [*Red Hat Enterprise Linux 7 (64-bit)*](#red-hat-enterprise-linux-7-installation)
- [*Red Hat Enterprise Linux 6.5 (64-bit)*](#red-hat-enterprise-linux-6.5-installation) or later
## Kernel support
RHEL will only support Docker via the *extras* channel or EPEL package when
running on kernels shipped by the distribution. There are kernel changes which
will cause issues if one decides to step outside that box and run
non-distribution kernel packages.
## Red Hat Enterprise Linux 7 Installation
**Red Hat Enterprise Linux 7 (64 bit)** has [shipped with
Docker](https://access.redhat.com/site/products/red-hat-enterprise-linux/docker-and-containers). Docker](https://access.redhat.com/site/products/red-hat-enterprise-linux/docker-and-containers).
An overview and some guidance can be found in the [Release An overview and some guidance can be found in the [Release
Notes](https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.0_Release_Notes/chap-Red_Hat_Enterprise_Linux-7.0_Release_Notes-Linux_Containers_with_Docker_Format.html). Notes](https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.0_Release_Notes/chap-Red_Hat_Enterprise_Linux-7.0_Release_Notes-Linux_Containers_with_Docker_Format.html).
@@ -25,51 +39,59 @@ Enterprise Linux 7](https://access.redhat.com/site/articles/881893)
guide, can be found by Red Hat customers on the [Red Hat Customer guide, can be found by Red Hat customers on the [Red Hat Customer
Portal](https://access.redhat.com/). Portal](https://access.redhat.com/).
# Red Hat Enterprise Linux 6 Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
Docker is available for **RHEL** on EPEL. Please note that ## Red Hat Enterprise Linux 6.5 Installation
You will need **64 bit** [RHEL
6.5](https://access.redhat.com/site/articles/3078#RHEL6) or later, with
a RHEL 6 kernel version 2.6.32-431 or higher as this has specific kernel
fixes to allow Docker to work.
Docker is available for **RHEL6.5** on EPEL. Please note that
this package is part of [Extra Packages for Enterprise Linux this package is part of [Extra Packages for Enterprise Linux
(EPEL)](https://fedoraproject.org/wiki/EPEL), a community effort to (EPEL)](https://fedoraproject.org/wiki/EPEL), a community effort to
create and maintain additional packages for the RHEL distribution. create and maintain additional packages for the RHEL distribution.
Also note that due to the current Docker limitations, Docker is able to ### Kernel support
run only on the **64 bit** architecture.
You will need [RHEL
6.5](https://access.redhat.com/site/articles/3078#RHEL6) or higher, with
a RHEL 6 kernel version 2.6.32-431 or higher as this has specific kernel
fixes to allow Docker to work.
## Kernel support
RHEL will only support Docker via the *extras* channel or EPEL package when RHEL will only support Docker via the *extras* channel or EPEL package when
running on kernels shipped by the distribution. There are things like namespace running on kernels shipped by the distribution. There are things like namespace
changes which will cause issues if one decides to step outside that box and run changes which will cause issues if one decides to step outside that box and run
non-distro kernel packages. non-distro kernel packages.
> **Warning**:
> Please keep your system up to date using `yum update` and rebooting
> your system. Keeping your system updated ensures critical security
> vulnerabilities and severe bugs (such as those found in kernel 2.6.32)
> are fixed.
## Installation ## Installation
Firstly, you need to install the EPEL repository. Please follow the Firstly, you need to install the EPEL repository. Please follow the
[EPEL installation [EPEL installation
instructions](https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F). instructions](https://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F).
The `docker-io` package provides Docker on EPEL. There is a package name conflict with a system tray application
and its executable, so the Docker RPM package was called `docker-io`.
If you already have the (unrelated) `docker` package To proceed with `docker-io` installation, you may need to remove the
installed, it will conflict with `docker-io`. `docker` package first.
There's a [bug report](
https://bugzilla.redhat.com/show_bug.cgi?id=1043676) filed for it.
To proceed with `docker-io` installation, please remove `docker` first.
Next, let's install the `docker-io` package which $ sudo yum -y remove docker
will install Docker on our host.
$ sudo yum -y install docker-io Next, let's install the `docker-io` package which will install Docker on our host.
$ sudo yum install docker-io
To update the `docker-io` package To update the `docker-io` package
$ sudo yum -y update docker-io $ sudo yum -y update docker-io
Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
## Starting the Docker daemon
Now that it's installed, let's start the Docker daemon. Now that it's installed, let's start the Docker daemon.
$ sudo service docker start $ sudo service docker start
@@ -93,8 +115,8 @@ Continue with the [User Guide](/userguide/).
## Custom daemon options ## Custom daemon options
If you need to add an HTTP Proxy, set a different directory or partition for the If you need to add an HTTP Proxy, set a different directory or partition for the
Docker runtime files, or make other customizations, read our systemd article to Docker runtime files, or make other customizations, read our Systemd article to
learn how to [customize your systemd Docker daemon options](/articles/systemd/). learn how to [customize your Systemd Docker daemon options](/articles/systemd/).
## Issues? ## Issues?
+22 -10
View File
@@ -80,21 +80,33 @@ To verify that everything has worked as expected:
Which should download the `ubuntu` image, and then start `bash` in a container. Which should download the `ubuntu` image, and then start `bash` in a container.
Type `exit` to exit
**Done!**, continue with the [User Guide](/userguide/).
## Ubuntu Precise 12.04 (LTS) (64-bit) ## Ubuntu Precise 12.04 (LTS) (64-bit)
This installation path should work at all times. This installation path should work at all times.
### Dependencies ### Dependencies
**Linux kernel 3.8** **Linux kernel 3.13**
Due to a bug in LXC, Docker works best on the 3.8 kernel. Precise comes For Ubuntu Precise, the currently recommended kernel version is 3.13.
with a 3.2 kernel, so we need to upgrade it. The kernel you'll install Ubuntu Precise installations with older kernels must be upgraded. The
when following these steps comes with AUFS built in. We also include the kernel you'll install when following these steps has AUFS built in.
generic headers to enable packages that depend on them, like ZFS and the We also include the generic headers to enable packages that depend on them,
VirtualBox guest additions. If you didn't install the headers for your like ZFS and the VirtualBox guest additions. If you didn't install the
"precise" kernel, then you can skip these headers for the "raring" headers for your "precise" kernel, then you can skip these headers for the
kernel. But it is safer to include them if you're not sure. "trusty" kernel. If you're unsure, you should include the headers for safety.
> **Warning**:
> Kernels 3.8 and 3.11 are no longer supported by Canonical. Systems
> running these kernels need to be updated using the instructions below.
> Running Docker on these unsupported systems isn't supported either.
> These old kernels are no longer patched for security vulnerabilities
> and severe bugs which lead to data loss.
Please read the installation instructions for backported kernels at Please read the installation instructions for backported kernels at
Ubuntu.org to understand why you also need to install the Xorg packages Ubuntu.org to understand why you also need to install the Xorg packages
@@ -104,10 +116,10 @@ each version.
# install the backported kernel # install the backported kernel
$ sudo apt-get update $ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring $ sudo apt-get install linux-image-generic-lts-trusty linux-headers-generic-lts-trusty
# install the backported kernel and xorg if using Unity/Xorg # install the backported kernel and xorg if using Unity/Xorg
$ sudo apt-get install --install-recommends linux-generic-lts-raring xserver-xorg-lts-raring libgl1-mesa-glx-lts-raring $ sudo apt-get install --install-recommends linux-generic-lts-trusty xserver-xorg-lts-trusty libgl1-mesa-glx-lts-trusty
# reboot # reboot
$ sudo reboot $ sudo reboot
@@ -73,6 +73,8 @@ root filesystem as read only.
**New!** **New!**
This endpoint returns a live stream of a container's resource usage statistics. This endpoint returns a live stream of a container's resource usage statistics.
> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
## v1.16 ## v1.16
@@ -385,6 +385,41 @@ Status Codes:
- **404** no such container - **404** no such container
- **500** server error - **500** server error
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -385,6 +385,41 @@ Status Codes:
- **404** no such container - **404** no such container
- **500** server error - **500** server error
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -35,7 +35,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -45,7 +45,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -55,7 +55,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -65,7 +65,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -119,7 +119,7 @@ Create a container
"Cmd":[ "Cmd":[
"date" "date"
], ],
"Image":"base", "Image":"ubuntu",
"Volumes":{ "Volumes":{
"/tmp": {} "/tmp": {}
}, },
@@ -194,7 +194,7 @@ Return low-level information on the container `id`
"Cmd": [ "Cmd": [
"date" "date"
], ],
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"WorkingDir":"" "WorkingDir":""
@@ -539,6 +539,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1) 5. Goto 1)
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -667,7 +702,7 @@ Create an image, either by pull it from the registry or by importing
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -739,7 +774,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -766,7 +801,7 @@ Return low-level information on the image `name`
"StdinOnce":false, "StdinOnce":false,
"Env":null, "Env":null,
"Cmd": ["/bin/bash"] "Cmd": ["/bin/bash"]
"Image":"base", "Image":"ubuntu",
"Volumes":null, "Volumes":null,
"WorkingDir":"" "WorkingDir":""
}, },
@@ -787,7 +822,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1004,6 +1039,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** - remove intermediate containers after a successful build - **rm** - remove intermediate containers after a successful build
@@ -1194,10 +1230,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -35,7 +35,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -45,7 +45,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -55,7 +55,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -65,7 +65,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -119,7 +119,7 @@ Create a container
"Cmd":[ "Cmd":[
"date" "date"
], ],
"Image":"base", "Image":"ubuntu",
"Volumes":{ "Volumes":{
"/tmp": {} "/tmp": {}
}, },
@@ -195,7 +195,7 @@ Return low-level information on the container `id`
"date" "date"
], ],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -574,6 +574,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1) 5. Goto 1)
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -701,7 +736,7 @@ Create an image, either by pull it from the registry or by importing i
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -742,7 +777,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -770,7 +805,7 @@ Return low-level information on the image `name`
"Env":null, "Env":null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns":null, "Dns":null,
"Image":"base", "Image":"ubuntu",
"Volumes":null, "Volumes":null,
"VolumesFrom":"", "VolumesFrom":"",
"WorkingDir":"" "WorkingDir":""
@@ -792,7 +827,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1010,6 +1045,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** - remove intermediate containers after a successful build - **rm** - remove intermediate containers after a successful build
@@ -1224,10 +1260,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -36,7 +36,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -46,7 +46,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -56,7 +56,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -66,7 +66,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -127,7 +127,7 @@ Create a container
"Cmd":[ "Cmd":[
"date" "date"
], ],
"Image":"base", "Image":"ubuntu",
"Volumes":{ "Volumes":{
"/tmp": {} "/tmp": {}
}, },
@@ -204,7 +204,7 @@ Return low-level information on the container `id`
"date" "date"
], ],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -622,6 +622,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1 5. Goto 1
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -760,7 +795,7 @@ Create an image, either by pull it from the registry or by importing i
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -803,7 +838,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -829,7 +864,7 @@ Return low-level information on the image `name`
"Env": null, "Env": null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": null, "Volumes": null,
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -853,7 +888,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1071,6 +1106,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** - remove intermediate containers after a successful build (default behavior) - **rm** - remove intermediate containers after a successful build (default behavior)
@@ -1290,10 +1326,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -36,7 +36,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -46,7 +46,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -56,7 +56,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -66,7 +66,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -121,7 +121,7 @@ Create a container
"Cmd":[ "Cmd":[
"date" "date"
], ],
"Image":"base", "Image":"ubuntu",
"Volumes":{ "Volumes":{
"/tmp": {} "/tmp": {}
}, },
@@ -198,7 +198,7 @@ Return low-level information on the container `id`
"date" "date"
], ],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -615,6 +615,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1 5. Goto 1
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -749,7 +784,7 @@ Create an image, either by pulling it from the registry or by importing it
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -792,7 +827,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -818,7 +853,7 @@ Return low-level information on the image `name`
"Env": null, "Env": null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": null, "Volumes": null,
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -842,7 +877,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1060,6 +1095,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** - remove intermediate containers after a successful build (default behavior) - **rm** - remove intermediate containers after a successful build (default behavior)
@@ -1279,10 +1315,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -36,7 +36,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -46,7 +46,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -56,7 +56,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -66,7 +66,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -124,7 +124,7 @@ Create a container
"Cmd":[ "Cmd":[
"date" "date"
], ],
"Image":"base", "Image":"ubuntu",
"Volumes":{ "Volumes":{
"/tmp": {} "/tmp": {}
}, },
@@ -207,7 +207,7 @@ Return low-level information on the container `id`
"date" "date"
], ],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -625,6 +625,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1 5. Goto 1
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -759,7 +794,7 @@ Create an image, either by pulling it from the registry or by importing it
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -802,7 +837,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -828,7 +863,7 @@ Return low-level information on the image `name`
"Env": null, "Env": null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": null, "Volumes": null,
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -852,7 +887,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1070,6 +1105,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** - remove intermediate containers after a successful build (default behavior) - **rm** - remove intermediate containers after a successful build (default behavior)
@@ -1289,10 +1325,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -36,7 +36,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -46,7 +46,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -56,7 +56,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -66,7 +66,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -128,7 +128,7 @@ Create a container
"date" "date"
], ],
"Entrypoint": "", "Entrypoint": "",
"Image": "base", "Image": "ubuntu",
"Volumes": { "Volumes": {
"/tmp": {} "/tmp": {}
}, },
@@ -148,6 +148,7 @@ Create a container
"Privileged": false, "Privileged": false,
"Dns": ["8.8.8.8"], "Dns": ["8.8.8.8"],
"DnsSearch": [""], "DnsSearch": [""],
"ExtraHosts": null,
"VolumesFrom": ["parent", "other:ro"], "VolumesFrom": ["parent", "other:ro"],
"CapAdd": ["NET_ADMIN"], "CapAdd": ["NET_ADMIN"],
"CapDrop": ["MKNOD"], "CapDrop": ["MKNOD"],
@@ -220,6 +221,8 @@ Json Parameters:
a boolean value. a boolean value.
- **Dns** - A list of dns servers for the container to use. - **Dns** - A list of dns servers for the container to use.
- **DnsSearch** - A list of DNS search domains - **DnsSearch** - A list of DNS search domains
- **ExtraHosts** - A list of hostnames/IP mappings to be added to the
container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`.
- **VolumesFrom** - A list of volumes to inherit from another container. - **VolumesFrom** - A list of volumes to inherit from another container.
Specified in the form `<container name>[:<ro|rw>]` Specified in the form `<container name>[:<ro|rw>]`
- **CapAdd** - A list of kernel capabilties to add to the container. - **CapAdd** - A list of kernel capabilties to add to the container.
@@ -288,7 +291,7 @@ Return low-level information on the container `id`
"date" "date"
], ],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -767,6 +770,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1 5. Goto 1
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -901,7 +939,7 @@ Create an image, either by pulling it from the registry or by importing it
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -945,7 +983,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -971,7 +1009,7 @@ Return low-level information on the image `name`
"Env": null, "Env": null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": null, "Volumes": null,
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -995,7 +1033,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1214,6 +1252,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** - remove intermediate containers after a successful build (default behavior) - **rm** - remove intermediate containers after a successful build (default behavior)
@@ -1433,10 +1472,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -36,7 +36,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -46,7 +46,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -56,7 +56,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -66,7 +66,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -128,7 +128,7 @@ Create a container
"date" "date"
], ],
"Entrypoint": "", "Entrypoint": "",
"Image": "base", "Image": "ubuntu",
"Volumes": { "Volumes": {
"/tmp": {} "/tmp": {}
}, },
@@ -148,6 +148,7 @@ Create a container
"Privileged": false, "Privileged": false,
"Dns": ["8.8.8.8"], "Dns": ["8.8.8.8"],
"DnsSearch": [""], "DnsSearch": [""],
"ExtraHosts": null,
"VolumesFrom": ["parent", "other:ro"], "VolumesFrom": ["parent", "other:ro"],
"CapAdd": ["NET_ADMIN"], "CapAdd": ["NET_ADMIN"],
"CapDrop": ["MKNOD"], "CapDrop": ["MKNOD"],
@@ -220,6 +221,8 @@ Json Parameters:
a boolean value. a boolean value.
- **Dns** - A list of dns servers for the container to use. - **Dns** - A list of dns servers for the container to use.
- **DnsSearch** - A list of DNS search domains - **DnsSearch** - A list of DNS search domains
- **ExtraHosts** - A list of hostnames/IP mappings to be added to the
container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`.
- **VolumesFrom** - A list of volumes to inherit from another container. - **VolumesFrom** - A list of volumes to inherit from another container.
Specified in the form `<container name>[:<ro|rw>]` Specified in the form `<container name>[:<ro|rw>]`
- **CapAdd** - A list of kernel capabilties to add to the container. - **CapAdd** - A list of kernel capabilties to add to the container.
@@ -288,7 +291,7 @@ Return low-level information on the container `id`
"date" "date"
], ],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": {}, "Volumes": {},
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -713,6 +716,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1 5. Goto 1
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -847,7 +885,7 @@ Create an image, either by pulling it from the registry or by importing it
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -891,7 +929,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -917,7 +955,7 @@ Return low-level information on the image `name`
"Env": null, "Env": null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": null, "Volumes": null,
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -941,7 +979,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1160,6 +1198,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **pull** - attempt to pull the image even if an older image exists locally - **pull** - attempt to pull the image even if an older image exists locally
@@ -1389,10 +1428,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -36,7 +36,7 @@ List containers
[ [
{ {
"Id": "8dfafdbc3a40", "Id": "8dfafdbc3a40",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 1", "Command": "echo 1",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -46,7 +46,7 @@ List containers
}, },
{ {
"Id": "9cd87474be90", "Id": "9cd87474be90",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 222222", "Command": "echo 222222",
"Created": 1367854155, "Created": 1367854155,
"Status": "Exit 0", "Status": "Exit 0",
@@ -56,7 +56,7 @@ List containers
}, },
{ {
"Id": "3176a2479c92", "Id": "3176a2479c92",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 3333333333333333", "Command": "echo 3333333333333333",
"Created": 1367854154, "Created": 1367854154,
"Status": "Exit 0", "Status": "Exit 0",
@@ -66,7 +66,7 @@ List containers
}, },
{ {
"Id": "4cb07b47f9fb", "Id": "4cb07b47f9fb",
"Image": "base:latest", "Image": "ubuntu:latest",
"Command": "echo 444444444444444444444444444444444", "Command": "echo 444444444444444444444444444444444",
"Created": 1367854152, "Created": 1367854152,
"Status": "Exit 0", "Status": "Exit 0",
@@ -128,7 +128,7 @@ Create a container
"date" "date"
], ],
"Entrypoint": "", "Entrypoint": "",
"Image": "base", "Image": "ubuntu",
"Volumes": { "Volumes": {
"/tmp": {} "/tmp": {}
}, },
@@ -149,6 +149,7 @@ Create a container
"ReadonlyRootfs": false, "ReadonlyRootfs": false,
"Dns": ["8.8.8.8"], "Dns": ["8.8.8.8"],
"DnsSearch": [""], "DnsSearch": [""],
"ExtraHosts": null,
"VolumesFrom": ["parent", "other:ro"], "VolumesFrom": ["parent", "other:ro"],
"CapAdd": ["NET_ADMIN"], "CapAdd": ["NET_ADMIN"],
"CapDrop": ["MKNOD"], "CapDrop": ["MKNOD"],
@@ -223,6 +224,8 @@ Json Parameters:
Specified as a boolean value. Specified as a boolean value.
- **Dns** - A list of dns servers for the container to use. - **Dns** - A list of dns servers for the container to use.
- **DnsSearch** - A list of DNS search domains - **DnsSearch** - A list of DNS search domains
- **ExtraHosts** - A list of hostnames/IP mappings to be added to the
container's `/etc/hosts` file. Specified in the form `["hostname:IP"]`.
- **VolumesFrom** - A list of volumes to inherit from another container. - **VolumesFrom** - A list of volumes to inherit from another container.
Specified in the form `<container name>[:<ro|rw>]` Specified in the form `<container name>[:<ro|rw>]`
- **CapAdd** - A list of kernel capabilties to add to the container. - **CapAdd** - A list of kernel capabilties to add to the container.
@@ -520,6 +523,8 @@ Status Codes:
This endpoint returns a live stream of a container's resource usage statistics. This endpoint returns a live stream of a container's resource usage statistics.
> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
**Example request**: **Example request**:
GET /containers/redis1/stats HTTP/1.1 GET /containers/redis1/stats HTTP/1.1
@@ -870,6 +875,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1 5. Goto 1
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -1034,6 +1074,7 @@ Query Parameters:
- **dockerfile** - path within the build context to the Dockerfile - **dockerfile** - path within the build context to the Dockerfile
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** git or HTTP/HTTPS URI build source
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **pull** - attempt to pull the image even if an older image exists locally - **pull** - attempt to pull the image even if an older image exists locally
@@ -1058,7 +1099,7 @@ Create an image, either by pulling it from the registry or by importing it
**Example request**: **Example request**:
POST /images/create?fromImage=base HTTP/1.1 POST /images/create?fromImage=ubuntu HTTP/1.1
**Example response**: **Example response**:
@@ -1102,7 +1143,7 @@ Return low-level information on the image `name`
**Example request**: **Example request**:
GET /images/base/json HTTP/1.1 GET /images/ubuntu/json HTTP/1.1
**Example response**: **Example response**:
@@ -1128,7 +1169,7 @@ Return low-level information on the image `name`
"Env": null, "Env": null,
"Cmd": ["/bin/bash"], "Cmd": ["/bin/bash"],
"Dns": null, "Dns": null,
"Image": "base", "Image": "ubuntu",
"Volumes": null, "Volumes": null,
"VolumesFrom": "", "VolumesFrom": "",
"WorkingDir": "" "WorkingDir": ""
@@ -1152,7 +1193,7 @@ Return the history of the image `name`
**Example request**: **Example request**:
GET /images/base/history HTTP/1.1 GET /images/ubuntu/history HTTP/1.1
**Example response**: **Example response**:
@@ -1551,10 +1592,10 @@ and Docker images will report:
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924} {"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966} {"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970} {"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
Query Parameters: Query Parameters:
@@ -397,6 +397,41 @@ Status Codes:
- **404** no such container - **404** no such container
- **500** server error - **500** server error
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -445,6 +445,41 @@ Status Codes:
- **404** no such container - **404** no such container
- **500** server error - **500** server error
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -863,6 +898,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
Status Codes: Status Codes:
@@ -460,6 +460,41 @@ Status Codes:
- **404** no such container - **404** no such container
- **500** server error - **500** server error
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -905,6 +940,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
@@ -458,6 +458,41 @@ Status Codes:
- **404** no such container - **404** no such container
- **500** server error - **500** server error
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -916,6 +951,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** remove intermediate containers after a successful build - **rm** remove intermediate containers after a successful build
@@ -564,6 +564,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1) 5. Goto 1)
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -1014,6 +1049,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
@@ -509,6 +509,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1) 5. Goto 1)
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -956,6 +991,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
@@ -557,6 +557,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1) 5. Goto 1)
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -1006,6 +1041,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
@@ -561,6 +561,41 @@ Status Codes:
4. Read the extracted size and output it on the correct output 4. Read the extracted size and output it on the correct output
5. Goto 1) 5. Goto 1)
### Attach to a container (websocket)
`GET /containers/(id)/attach/ws`
Attach to the container `id` via websocket
Implements websocket protocol handshake according to [RFC 6455](http://tools.ietf.org/html/rfc6455)
**Example request**
GET /containers/e90e34656806/attach/ws?logs=0&stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
**Example response**
{{ STREAM }}
Query Parameters:
- **logs** 1/True/true or 0/False/false, return logs. Default false
- **stream** 1/True/true or 0/False/false, return stream.
Default false
- **stdin** 1/True/true or 0/False/false, if stream=true, attach
to stdin. Default false
- **stdout** 1/True/true or 0/False/false, if logs=true, return
stdout log, if stream=true, attach to stdout. Default false
- **stderr** 1/True/true or 0/False/false, if logs=true, return
stderr log, if stream=true, attach to stderr. Default false
Status Codes:
- **200** no error
- **400** bad parameter
- **404** no such container
- **500** server error
### Wait a container ### Wait a container
`POST /containers/(id)/wait` `POST /containers/(id)/wait`
@@ -1009,6 +1044,7 @@ Query Parameters:
- **t** repository name (and optionally a tag) to be applied to - **t** repository name (and optionally a tag) to be applied to
the resulting image in case of success the resulting image in case of success
- **remote** build source URI (git or HTTPS/HTTP)
- **q** suppress verbose build output - **q** suppress verbose build output
- **nocache** do not use the cache when building the image - **nocache** do not use the cache when building the image
- **rm** Remove intermediate containers after a successful build - **rm** Remove intermediate containers after a successful build
+9 -9
View File
@@ -113,7 +113,7 @@ was no formal definition on as to which instructions handled environment
replacement at the time. After 1.3 this behavior will be preserved and replacement at the time. After 1.3 this behavior will be preserved and
canonical. canonical.
Environment variables (declared with the `ENV` statement) can also be used in Environment variables (declared with [the `ENV` statement](#env)) can also be used in
certain instructions as variables to be interpreted by the `Dockerfile`. Escapes certain instructions as variables to be interpreted by the `Dockerfile`. Escapes
are also handled for including variable-like syntax into a statement literally. are also handled for including variable-like syntax into a statement literally.
@@ -349,9 +349,8 @@ accessible from the host by default. To expose ports to the host, at runtime,
ENV <key>=<value> ... ENV <key>=<value> ...
The `ENV` instruction sets the environment variable `<key>` to the value The `ENV` instruction sets the environment variable `<key>` to the value
`<value>`. This value will be passed to all future `<value>`. This value will be in the environment of all "descendent" `Dockerfile`
`RUN`, `ENTRYPOINT`, and `CMD` instructions. This is commands and can be [replaced inline](#environment-replacement) in many as well.
functionally equivalent to prefixing the command with `<key>=<value>`
The `ENV` instruction has two forms. The first form, `ENV <key> <value>`, The `ENV` instruction has two forms. The first form, `ENV <key> <value>`,
will set a single variable to a value. The entire string after the first will set a single variable to a value. The entire string after the first
@@ -382,9 +381,10 @@ from the resulting image. You can view the values using `docker inspect`, and
change them using `docker run --env <key>=<value>`. change them using `docker run --env <key>=<value>`.
> **Note**: > **Note**:
> One example where this can cause unexpected consequences, is setting > Environment persistence can cause unexpected effects. For example,
> `ENV DEBIAN_FRONTEND noninteractive`. Which will persist when the container > setting `ENV DEBIAN_FRONTEND noninteractive` may confuse apt-get
> is run interactively; for example: `docker run -t -i image bash` > users on a Debian-based image. To set a value for a single command, use
> `RUN <key>=<value> <command>`.
## ADD ## ADD
@@ -801,8 +801,8 @@ and for any `RUN`, `CMD` and `ENTRYPOINT` instructions that follow it in the
WORKDIR /path/to/workdir WORKDIR /path/to/workdir
The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD` and The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD`,
`ENTRYPOINT` instructions that follow it in the `Dockerfile`. `ENTRYPOINT`, `COPY` and `ADD` instructions that follow it in the `Dockerfile`.
It can be used multiple times in the one `Dockerfile`. If a relative path It can be used multiple times in the one `Dockerfile`. If a relative path
is provided, it will be relative to the path of the previous `WORKDIR` is provided, it will be relative to the path of the previous `WORKDIR`
+65 -34
View File
@@ -32,19 +32,24 @@ To list the help on any command just execute the command, followed by the `--hel
## Option types ## Option types
Single character commandline options can be combined, so rather than Single character command line options can be combined, so rather than
typing `docker run -t -i --name test busybox sh`, typing `docker run -t -i --name test busybox sh`,
you can write `docker run -ti --name test busybox sh`. you can write `docker run -ti --name test busybox sh`.
### Boolean ### Boolean
Boolean options look like `-d=false`. The value you Boolean options take the form `-d=false`. The value you see in the help text is the
see is the default value which gets set if you do **not** use the default value which is set if you do **not** specify that flag. If you specify
boolean flag. If you do call `run -d`, that sets the a Boolean flag without a value, this will set the flag to `true`, irrespective
opposite boolean value, so in this case, `true`, and of the default value.
so `docker run -d` **will** run in "detached" mode,
in the background. Other boolean options are similar specifying them For example, running `docker run -d` will set the value to `true`, so
will set the value to the opposite of the default value. your container **will** run in "detached" mode, in the background.
Options which default to `true` (e.g., `docker build --rm=true`) can only
be set to the non-default value by explicitly setting them to `false`:
$ docker build --rm=false .
### Multi ### Multi
@@ -139,7 +144,7 @@ for un-encrypted, and port `2376` for encrypted communication with the daemon.
> for security reasons. > for security reasons.
On Systemd based systems, you can communicate with the daemon via On Systemd based systems, you can communicate with the daemon via
[systemd socket activation](http://0pointer.de/blog/projects/socket-activation.html), use [Systemd socket activation](http://0pointer.de/blog/projects/socket-activation.html), use
`docker -d -H fd://`. Using `fd://` will work perfectly for most setups but `docker -d -H fd://`. Using `fd://` will work perfectly for most setups but
you can also specify individual sockets: `docker -d -H fd://3`. If the you can also specify individual sockets: `docker -d -H fd://3`. If the
specified socket activated files aren't found, then Docker will exit. You specified socket activated files aren't found, then Docker will exit. You
@@ -329,7 +334,7 @@ Currently supported options are:
Enables or disables the use of blkdiscard when removing devicemapper Enables or disables the use of blkdiscard when removing devicemapper
devices. This is enabled by default (only) if using loopback devices and is devices. This is enabled by default (only) if using loopback devices and is
required to res-parsify the loopback file on image/container removal. required to resparsify the loopback file on image/container removal.
Disabling this on loopback can lead to *much* faster container removal Disabling this on loopback can lead to *much* faster container removal
times, but will make the space used in `/var/lib/docker` directory not be times, but will make the space used in `/var/lib/docker` directory not be
@@ -430,29 +435,24 @@ Docker supports softlinks for the Docker data directory
--no-stdin=false Do not attach STDIN --no-stdin=false Do not attach STDIN
--sig-proxy=true Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied. --sig-proxy=true Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.
The `attach` command lets you view or interact with any running container's The `docker attach` command allows you to attach to a running container using
primary process (`pid 1`). the container's ID or name, either to view its ongoing output or to control it
interactively. You can attach to the same contained process multiple times
simultaneously, screen sharing style, or quickly view the progress of your
daemonized process.
You can attach to the same contained process multiple times simultaneously, screen You can detach from the container (and leave it running) with `CTRL-p CTRL-q`
sharing style, or quickly view the progress of your daemonized process. (for a quiet exit) or `CTRL-c` which will send a `SIGKILL` to the container.
When you are attached to a container, and exit its main process, the process's
exit code will be returned to the client.
> **Note:** This command is not for running a new process in a container. It is forbidden to redirect the standard input of a `docker attach` command while
> See: [`docker exec`](#exec). attaching to a tty-enabled container (i.e.: launched with `-t`).
You can detach from the container again (and leave it running) with
`CTRL-p CTRL-q` (for a quiet exit), or `CTRL-c` which will send a
SIGKILL to the container, or `CTRL-\` to get a stacktrace of the
Docker client when it quits. When you detach from the container's
process the exit code will be returned to the client.
To stop a container, use `docker stop`.
To kill the container, use `docker kill`.
#### Examples #### Examples
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b) $ sudo docker run -d --name topdemo ubuntu /usr/bin/top -b)
$ sudo docker attach $ID $ sudo docker attach topdemo
top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05 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 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 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
@@ -481,7 +481,23 @@ To kill the container, use `docker kill`.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 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 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top
^C$ ^C$
$ sudo docker stop $ID $ echo $?
0
$ docker ps -a | grep topdemo
7998ac8581f9 ubuntu:14.04 "/usr/bin/top -b" 38 seconds ago Exited (0) 21 seconds ago topdemo
And in this second example, you can see the exit code returned by the `bash` process
is returned by the `docker attach` command to its caller too:
$ sudo docker run --name test -d -it debian
275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab
$ sudo docker attach test
$$ exit 13
exit
$ echo $?
13
$ sudo docker ps -a | grep test
275c44472aeb debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test
## build ## build
@@ -926,7 +942,7 @@ You'll need two shells for this example.
2014-05-10T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) die 2014-05-10T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) die
2014-09-03T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) stop 2014-09-03T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) stop
$ sudo docker events --since '2013-09-03 15:49:29 +0200 CEST' $ sudo docker events --since '2013-09-03T15:49:29'
2014-09-03T15:49:29.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) die 2014-09-03T15:49:29.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) die
2014-05-10T17:42:14.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) stop 2014-05-10T17:42:14.999999999Z07:00 4386fb97867d: (from ubuntu-1:14.04) stop
2014-05-10T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) die 2014-05-10T17:42:14.999999999Z07:00 7805c1d35632: (from redis:2.8) die
@@ -1430,12 +1446,12 @@ The `docker rename` command allows the container to be renamed to a different na
-s, --size=false Display total file sizes -s, --size=false Display total file sizes
--since="" Show only containers created since Id or Name, include non-running ones. --since="" Show only containers created since Id or Name, include non-running ones.
Running `docker ps` showing 2 linked containers. Running `docker ps --no-trunc` showing 2 linked containers.
$ sudo docker ps $ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c01db0b339c ubuntu:12.04 bash 17 seconds ago Up 16 seconds webapp f7ee772232194fcc088c6bdec6ea09f7b3f6c54d53934658164b8602d7cd4744 ubuntu:12.04 bash 17 seconds ago Up 16 seconds webapp
d7886598dbe2 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db d0963715a061c7c7b7cc80b2646da913a959fbf13e80a971d4a60f6997a2f595 crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db
`docker ps` will show only running containers by default. To see all containers: `docker ps` will show only running containers by default. To see all containers:
`docker ps -a` `docker ps -a`
@@ -1659,6 +1675,19 @@ and linking containers.
#### Examples #### Examples
$ sudo docker run --name test -it debian
$$ exit 13
exit
$ echo $?
13
$ sudo docker ps -a | grep test
275c44472aeb debian:7 "/bin/bash" 26 seconds ago Exited (13) 17 seconds ago test
In this example, we are running `bash` interactively in the `debian:latest` image, and giving
the container the name `test`. We then quit `bash` by running `exit 13`, which means `bash`
will have an exit code of `13`. This is then passed on to the caller of `docker run`, and
is recorded in the `test` container metadata.
$ sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test" $ sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
This will create a container and print `test` to the console. The `cidfile` This will create a container and print `test` to the console. The `cidfile`
@@ -2012,6 +2041,8 @@ more details on finding shared images from the command line.
--help=false Print usage --help=false Print usage
> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
Running `docker stats` on multiple containers Running `docker stats` on multiple containers
$ sudo docker stats redis1 redis2 $ sudo docker stats redis1 redis2
+38 -65
View File
@@ -2,78 +2,44 @@ page_title: Docker 1.x Series Release Notes
page_description: Release Notes for Docker 1.x. page_description: Release Notes for Docker 1.x.
page_keywords: docker, documentation, about, technology, understanding, release page_keywords: docker, documentation, about, technology, understanding, release
#Release Notes # Release Notes
You can view release notes for earlier version of Docker by selecting the You can view release notes for earlier version of Docker by selecting the
desired version from the drop-down list at the top right of this page. desired version from the drop-down list at the top right of this page.
##Version 1.4.1 ## Version 1.5.0
(2014-12-17) (2015-02-03)
This release fixes an issue related to mounting volumes on `create`. Details available in the [Github milestone](https://github.com/docker/docker/issues?q=milestone%3A1.4.1+is%3Aclosed).
##Version 1.4.0 For a complete list of patches, fixes, and other improvements, see the
(2014-12-11) [merge PR on GitHub](https://github.com/docker/docker/pull/10286).
This release provides a number of new features, but is mainly focused on bug
fixes and improvements to platform stability and security.
For a complete list of patches, fixes, and other improvements, see the [merge PR on GitHub](https://github.com/docker/docker/pull/9345).
*New Features* *New Features*
* You can now add labels to the Docker daemon using key=value pairs defined with * The Docker daemon has now supports for IPv6 networking between containers
the new `--label` flag. The labels are displayed by running `docker info`. In and on the `docker0` bridge. For more information see the
addition, `docker info` also now returns an ID and hostname field. For more [IPv6 networking reference](/articles/networking/#ipv6).
information, see the * Docker container filesystems can now be set to`--read-only`, restricting your
[command line reference](http://docs.docker.com/reference/commandline/cli/#daemon). container to writing to volumes [PR# 10093](https://github.com/docker/docker/pull/10093).
* The `ENV` instruction in the `Dockerfile` now supports arguments in the form * A new `docker stats CONTAINERID` command has been added to allow users to view a
of `ENV name=value name2=value2..`. For more information, see the continuously updating stream of container resource usage statistics. See the
[command line reference](http://docs.docker.com/reference/builder/#env) [`stats` command line reference](/reference/commandline/cli/#stats) and the
* Introducing a new, still [container `stats` API reference](/reference/api/docker_remote_api_v1.17/#get-container-stats-based-on-resource-usage).
[experimental, overlayfs storage driver](https://github.com/docker/docker/pull/7619/). **Note**: this feature is only enabled for the `libcontainer` exec-driver at this point.
* You can now add filters to `docker events` to filter events by event name, * Users can now specify the file to use as the `Dockerfile` by running
container, or image. For more information, see the `docker build -f alternate.dockerfile .`. This will allow the definition of multiple
[command line reference](http://docs.docker.com/reference/commandline/cli/#events). `Dockerfile`s for a single project. See the [`docker build` command reference](
* The `docker cp` command now supports copying files from the filesystem of a /reference/commandline/cli/#build) for more information.
container's volumes. For more information, see the * The v1 Open Image specification has been created to document the current Docker image
[remote API reference](http://docs.docker.com/reference/api/docker_remote_api/). format and metadata. Please see [the Open Image specification document](
* The `docker tag` command has been fixed so that it correctly honors `--force` https://github.com/docker/docker/blob/master/image/spec/v1.md) for more details.
when overriding a tag for existing image. For more information, see * This release also includes a number of significant performance improvements in
the [command line reference](http://docs.docker.com/reference/commandline/cli/#tag). build and image management ([PR #9720](https://github.com/docker/docker/pull/9720),
[PR #8827](https://github.com/docker/docker/pull/8827))
* Container volumes are now initialized during `docker create`. For more information, see * The `docker inspect` command now lists ExecIDs generated for each `docker exec` process.
the [command line reference](http://docs.docker.com/reference/commandline/cli/#create). See [PR #9800](https://github.com/docker/docker/pull/9800)) for more details.
* The `docker inspect` command now shows the number of container restarts when there
*Security Fixes* is a restart policy ([PR #9621](https://github.com/docker/docker/pull/9621))
* This version of Docker is built using Go 1.4
Patches and changes were made to address the following vulnerabilities:
* CVE-2014-9356: Path traversal during processing of absolute symlinks.
Absolute symlinks were not adequately checked for traversal which created a
vulnerability via image extraction and/or volume mounts.
* CVE-2014-9357: Escalation of privileges during decompression of LZMA (.xz)
archives. Docker 1.3.2 added `chroot` for archive extraction. This created a
vulnerability that could allow malicious images or builds to write files to the
host system and escape containerization, leading to privilege escalation.
* CVE-2014-9358: Path traversal and spoofing opportunities via image
identifiers. Image IDs passed either via `docker load` or registry communications
were not sufficiently validated. This created a vulnerability to path traversal
attacks wherein malicious images or repository spoofing could lead to graph
corruption and manipulation.
> **Note:** the above CVEs are also patched in Docker 1.3.3, which was released
> concurrently with 1.4.0.
*Runtime fixes*
* Fixed an issue that caused image archives to be read slowly.
*Client fixes*
* Fixed a regression related to STDIN redirection.
* Fixed a regression involving `docker cp` when the current directory is the
destination.
> **Note:** > **Note:**
> Development history prior to version 1.0 can be found by > Development history prior to version 1.0 can be found by
@@ -89,4 +55,11 @@ impact on users. This list will be updated as issues are resolved.
An idiosyncrasy in AUFS prevents permissions from propagating predictably An idiosyncrasy in AUFS prevents permissions from propagating predictably
between upper and lower layers. This can cause issues with accessing private between upper and lower layers. This can cause issues with accessing private
keys, database instances, etc. For complete information and workarounds see keys, database instances, etc. For complete information and workarounds see
[Github Issue 783](https://github.com/docker/docker/issues/783). [Github Issue 783](https://github.com/docker/docker/issues/783).
* **Docker Hub incompatible with Safari 8**
Docker Hub has multiple issues displaying on Safari 8, the default browser
for OS X 10.10 (Yosemite). Users should access the hub using a different
browser. Most notably, changes in the way Safari handles cookies means that the
user is repeatedly logged out. For more information, see the [Docker
forum post](https://forums.docker.com/t/new-safari-in-yosemite-issue/300).
+1 -1
View File
@@ -263,7 +263,7 @@ this case we're basing our new image on an Ubuntu 14.04 image.
Next we use the `MAINTAINER` instruction to specify who maintains our new image. Next we use the `MAINTAINER` instruction to specify who maintains our new image.
Lastly, we've specified three `RUN` instructions. A `RUN` instruction executes Lastly, we've specified two `RUN` instructions. A `RUN` instruction executes
a command inside the image, for example installing a package. Here we're a command inside the image, for example installing a package. Here we're
updating our APT cache, installing Ruby and RubyGems and then installing the updating our APT cache, installing Ruby and RubyGems and then installing the
Sinatra gem. Sinatra gem.
+1 -1
View File
@@ -233,7 +233,7 @@ command to list the specified container's environment variables.
> will scrub them when spawning shells for connection. > will scrub them when spawning shells for connection.
> **Note**: > **Note**:
> Unlike host entries in the [`/ets/hosts` file](#updating-the-etchosts-file), > Unlike host entries in the [`/etc/hosts` file](#updating-the-etchosts-file),
> IP addresses stored in the environment variables are not automatically updated > IP addresses stored in the environment variables are not automatically updated
> if the source container is restarted. We recommend using the host entries in > if the source container is restarted. We recommend using the host entries in
> `/etc/hosts` to resolve the IP address of linked containers. > `/etc/hosts` to resolve the IP address of linked containers.
+2 -2
View File
@@ -64,7 +64,7 @@ This will mount the host directory, `/src/webapp`, into the container at
`/opt/webapp`. `/opt/webapp`.
> **Note:** > **Note:**
> If the path `/opt/webapp` already exists inside the container's image, it's > If the path `/opt/webapp` already exists inside the container's image, its
> contents will be replaced by the contents of `/src/webapp` on the host to stay > contents will be replaced by the contents of `/src/webapp` on the host to stay
> consistent with the expected behavior of `mount` > consistent with the expected behavior of `mount`
@@ -115,7 +115,7 @@ it.
Let's create a new named container with a volume to share. Let's create a new named container with a volume to share.
While this container doesn't run an application, it reuses the `training/postgres` While this container doesn't run an application, it reuses the `training/postgres`
image so that all containers are using layers in common, saveing disk space. image so that all containers are using layers in common, saving disk space.
$ sudo docker create -v /dbdata --name dbdata training/postgres $ sudo docker create -v /dbdata --name dbdata training/postgres
+3 -2
View File
@@ -167,8 +167,9 @@ host. You might be asking about now: why wouldn't we just want to always
use 1:1 port mappings in Docker containers rather than mapping to high use 1:1 port mappings in Docker containers rather than mapping to high
ports? Well 1:1 mappings have the constraint of only being able to map ports? Well 1:1 mappings have the constraint of only being able to map
one of each port on your local host. Let's say you want to test two one of each port on your local host. Let's say you want to test two
Python applications: both bound to port 5000 inside your container. Python applications: both bound to port 5000 inside their own containers.
Without Docker's port mapping you could only access one at a time. Without Docker's port mapping you could only access one at a time on the
Docker host.
So let's now browse to port 49155 in a web browser to So let's now browse to port 49155 in a web browser to
see the application. see the application.
+34 -23
View File
@@ -22,22 +22,39 @@
#leftnav { #leftnav {
height: 100%; height: 100%;
}
#leftnav h3 {
font-size: 10px;
font-weight: 700;
color: #394d54;
line-height: 1;
margin: 10px 0 10px 0;
padding-left: 20px;
white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis;
} }
#leftnav li.active { #leftnav .nav ul {
margin-bottom: 10px; line-height: 1;
margin: 10px 10px 0px 16px;
padding: 0;
list-style: none;
}
#leftnav .nav li ul a,
#leftnav .nav li ul a:hover {
margin: 0 !important;
padding: 0 !important;
font-size: 13px;
font-weight: 400;
color: #394d54;
}
#leftnav .nav li ul a:hover {
color: #24b8eb;
}
#leftnav .nav.nav-tabs li a,
#leftnav .nav.nav-tabs li li {
line-height: 1.1 !important;
}
#leftnav li {
margin-top: 20px;
// text-indent: -16px;
padding-left: 10px;
}
#leftnav .nav-tabs.nav ul li {
margin-top: 5px;
} }
.content-body { .content-body {
@@ -60,6 +77,7 @@ pre {
/* Main Navigation */ /* Main Navigation */
#nav_menu > #docsnav { #nav_menu > #docsnav {
max-width: 940px; max-width: 940px;
width: 940px;
margin: 0 auto; margin: 0 auto;
} }
#nav_menu > #docsnav > #nav_search { #nav_menu > #docsnav > #nav_search {
@@ -112,7 +130,7 @@ pre {
box-sizing: border-box; box-sizing: border-box;
} }
#nav_menu #docsnav #main-nav > li { #nav_menu #docsnav #main-nav > li {
font-size: 14px; font-size: 15px;
font-weight: 400; font-weight: 400;
color: #253237; color: #253237;
line-height: 2em; line-height: 2em;
@@ -177,13 +195,13 @@ pre {
display: block; display: block;
} }
.dd_menu li a { .dd_menu li a {
font-size: 14px; font-size: 15px;
font-weight: 400; font-weight: 400;
color: #005976; color: #005976;
} }
.dd_menu li a:hover { .dd_menu li a:hover {
text-decoration: none; text-decoration: none;
font-size: 14px; font-size: 15px;
font-weight: 400; font-weight: 400;
color: #24b8eb; color: #24b8eb;
} }
@@ -321,13 +339,6 @@ pre {
font-weight: bold; font-weight: bold;
} }
#leftnav .nav.nav-tabs li a {
line-height: 20px !important;
padding-top: 15px !important;
padding-right: 8px;
padding-bottom: 15px !important;
}
/* Logged-in/out header */ /* Logged-in/out header */
.topmostnav_loggedin { .topmostnav_loggedin {
display: none; display: none;
+3 -7
View File
@@ -801,10 +801,6 @@ div + .form-inline {
transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s; transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
width: 140px; width: 140px;
} }
#topmostnav .navbar-index-search .search-query:focus,
#topmostnav .navbar-index-search .search-query.focused {
width: 200px;
}
#topmostnav.public { #topmostnav.public {
border-bottom: none; border-bottom: none;
height: 80px; height: 80px;
@@ -995,7 +991,7 @@ div + .form-inline {
#leftnav .nav.nav-tabs.nav-stacked > li > a { #leftnav .nav.nav-tabs.nav-stacked > li > a {
border: 0; border: 0;
} }
#leftnav .nav.nav-tabs li.active a { Killwithfire #leftnav .nav.nav-tabs li.active a {
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
color: #394d54; color: #394d54;
@@ -1005,14 +1001,14 @@ div + .form-inline {
border-left: 10px solid #ade5f9; border-left: 10px solid #ade5f9;
padding-left: 9px; padding-left: 9px;
} }
#leftnav .nav.nav-tabs li.active a:hover { Killwithfire #leftnav .nav.nav-tabs li.active a:hover {
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
color: #24b8eb; color: #24b8eb;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
#leftnav .nav.nav-tabs li.active a:focus { Killwithfire #leftnav .nav.nav-tabs li.active a:focus {
outline: none; outline: none;
} }
#leftnav .nav.nav-tabs > li > a { #leftnav .nav.nav-tabs > li > a {
+10 -8
View File
@@ -1,13 +1,14 @@
<div id="topmostnav" class="topmostnav_loggedout navbar navbar-static-top public"> <div id="topmostnav" class="topmostnav_loggedout navbar navbar-static-top">
<div class="container"> <div class="container">
<a href="http://www.docker.com/" title="Homepage"> <a href="/" title="Docker Docs Home"><div class="brand logo"><img src="/img/nav/docker-logo-loggedin.png"> </div></a>
<div class="brand logo"><img src="/img/nav/docker-logo-loggedout.png"> </div> <form id="nav_search" class="navbar-index-search pull-right" action="/jsearch/">
</a> <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span>
<input name="q" id="tipue_search_input" type="text" class="search_input search-query ui-autocomplete-input" placeholder="Search the Docs" autocomplete="off">
</form>
<ul class="nav"> <ul class="nav">
<li class=""><a href="http://www.docker.com/whatisdocker/" title="What is Docker">What is Docker?</a></li> <li class=""><a href="http://www.docker.com/whatisdocker/" title="What is Docker">What is Docker?</a></li>
<li class=""><a href="http://www.docker.com/resources/usecases/" title="Use Cases">Use Cases</a></li> <li class=""><a href="http://www.docker.com/resources/usecases/" title="Use Cases">Use Cases</a></li>
<li class=""><a href="http://www.docker.com/tryit/" title="Try It!">Try It!</a></li> <li class=""><a href="http://www.docker.com/tryit/" title="Try It!">Try It!</a></li>
<li class="active"><a href="https://docs.docker.com" title="Install &amp; Docs">Install &amp; Docs</a></li>
<li><a href="https://registry.hub.docker.com" title="Browse">Browse</a></li> <li><a href="https://registry.hub.docker.com" title="Browse">Browse</a></li>
</ul> </ul>
<div id="usernav" class="pull-right"> <div id="usernav" class="pull-right">
@@ -18,9 +19,10 @@
</div> </div>
<div id="topmostnav" class="topmostnav_loggedin navbar navbar-static-top"> <div id="topmostnav" class="topmostnav_loggedin navbar navbar-static-top">
<div class="container"> <div class="container">
<a href="http://www.docker.com/" title="Docker Docs Home"><div class="brand logo"><img src="/img/nav/docker-logo-loggedin.png"> </div></a> <a href="/" title="Docker Docs Home"><div class="brand logo"><img src="/img/nav/docker-logo-loggedin.png"> </div></a>
<form id="search_box_header" class="navbar-index-search pull-right" action="https://registry.hub.docker.com/search"> <form id="nav_search" class="navbar-index-search pull-right" action="/jsearch/">
<span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span><input type="text" class="search-query ui-autocomplete-input" placeholder="Search..." name="q" value="" autocomplete="off"> <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span>
<input name="q" id="tipue_search_input" type="text" class="search_input search-query ui-autocomplete-input" placeholder="Search the Docs" autocomplete="off">
</form> </form>
<ul class="nav"> <ul class="nav">
<li><a href="https://registry.hub.docker.com" title="Browse Repos">Browse Repos</a></li> <li><a href="https://registry.hub.docker.com" title="Browse Repos">Browse Repos</a></li>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

+13 -7
View File
@@ -1,12 +1,6 @@
$(document).ready(function () $(document).ready(function ()
{ {
// Tipue Search activation
$('#tipue_search_input').tipuesearch({
'mode': 'json',
'contentLocation': '/search_content.json'
});
prettyPrint(); prettyPrint();
// Resizing // Resizing
@@ -51,6 +45,18 @@ $(document).ready(function ()
}, },
}); });
function getURLP(name)
{
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20')) || null;
}
if (getURLP("q")) {
// Tipue Search activation
$('#tipue_search_input').tipuesearch({
'mode': 'json',
'contentLocation': '/search_content.json.gz'
});
}
}); });
function resizeMenuDropdown () function resizeMenuDropdown ()
@@ -92,4 +98,4 @@ function getCookie(cname) {
if (c.indexOf(name) == 0) return c.substring(name.length,c.length); if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
} }
return ""; return "";
} }
-4
View File
@@ -18,9 +18,5 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</ul> </ul>
<form id="nav_search" class="pull-right" action="/jsearch/">
<span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span>
<input name="q" id="tipue_search_input" type="text" class="search_input search-query ui-autocomplete-input" placeholder="Search the Docs" autocomplete="off">
</form>
</div> </div>
</nav> </nav>
+5 -2
View File
@@ -1,8 +1,11 @@
{% for toc_item in toc %} {% for toc_item in toc %}
{% for toc_h2_item in toc_item.children %} {% for toc_h2_item in toc_item.children %}
<li class=""><a href="{{ toc_h2_item.url }}">{{ toc_h2_item.title }}</a></li> <li class=""><a href="{{ toc_h2_item.url }}">{{ toc_h2_item.title }}</a>
<ul>
{% for toc_h3_item in toc_h2_item.children %} {% for toc_h3_item in toc_h2_item.children %}
<h3><a href="{{ toc_h3_item.url }}">{{ toc_h3_item.title }}</a></h3> <li><a href="{{ toc_h3_item.url }}">{{ toc_h3_item.title }}</a></li>
{% endfor %} {% endfor %}
</ul>
</li>
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
+84
View File
@@ -4,6 +4,8 @@ import (
"bytes" "bytes"
"strings" "strings"
"testing" "testing"
"github.com/docker/docker/pkg/ioutils"
) )
func TestRegister(t *testing.T) { func TestRegister(t *testing.T) {
@@ -150,3 +152,85 @@ func TestCatchallEmptyName(t *testing.T) {
t.Fatalf("Engine.Job(\"\").Run() should return an error") t.Fatalf("Engine.Job(\"\").Run() should return an error")
} }
} }
// Ensure that a job within a job both using the same underlying standard
// output writer does not close the output of the outer job when the inner
// job's stdout is wrapped with a NopCloser. When not wrapped, it should
// close the outer job's output.
func TestNestedJobSharedOutput(t *testing.T) {
var (
outerHandler Handler
innerHandler Handler
wrapOutput bool
)
outerHandler = func(job *Job) Status {
job.Stdout.Write([]byte("outer1"))
innerJob := job.Eng.Job("innerJob")
if wrapOutput {
innerJob.Stdout.Add(ioutils.NopWriteCloser(job.Stdout))
} else {
innerJob.Stdout.Add(job.Stdout)
}
if err := innerJob.Run(); err != nil {
t.Fatal(err)
}
// If wrapOutput was *false* this write will do nothing.
// FIXME (jlhawn): It should cause an error to write to
// closed output.
job.Stdout.Write([]byte(" outer2"))
return StatusOK
}
innerHandler = func(job *Job) Status {
job.Stdout.Write([]byte(" inner"))
return StatusOK
}
eng := New()
eng.Register("outerJob", outerHandler)
eng.Register("innerJob", innerHandler)
// wrapOutput starts *false* so the expected
// output of running the outer job will be:
//
// "outer1 inner"
//
outBuf := new(bytes.Buffer)
outerJob := eng.Job("outerJob")
outerJob.Stdout.Add(outBuf)
if err := outerJob.Run(); err != nil {
t.Fatal(err)
}
expectedOutput := "outer1 inner"
if outBuf.String() != expectedOutput {
t.Fatalf("expected job output to be %q, got %q", expectedOutput, outBuf.String())
}
// Set wrapOutput to true so that the expected
// output of running the outer job will be:
//
// "outer1 inner outer2"
//
wrapOutput = true
outBuf.Reset()
outerJob = eng.Job("outerJob")
outerJob.Stdout.Add(outBuf)
if err := outerJob.Run(); err != nil {
t.Fatal(err)
}
expectedOutput = "outer1 inner outer2"
if outBuf.String() != expectedOutput {
t.Fatalf("expected job output to be %q, got %q", expectedOutput, outBuf.String())
}
}
+22
View File
@@ -223,6 +223,28 @@ func (graph *Graph) Mktemp(id string) (string, error) {
return dir, nil return dir, nil
} }
func (graph *Graph) newTempFile() (*os.File, error) {
tmp, err := graph.Mktemp("")
if err != nil {
return nil, err
}
return ioutil.TempFile(tmp, "")
}
func bufferToFile(f *os.File, src io.Reader) (int64, error) {
n, err := io.Copy(f, src)
if err != nil {
return n, err
}
if err = f.Sync(); err != nil {
return n, err
}
if _, err := f.Seek(0, 0); err != nil {
return n, err
}
return n, nil
}
// setupInitLayer populates a directory with mountpoints suitable // setupInitLayer populates a directory with mountpoints suitable
// for bind-mounting dockerinit into the container. The mountpoint is simply an // for bind-mounting dockerinit into the container. The mountpoint is simply an
// empty file at /.dockerinit // empty file at /.dockerinit
+38 -52
View File
@@ -3,11 +3,9 @@ package graph
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"path"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/docker/docker/engine" "github.com/docker/docker/engine"
@@ -17,35 +15,6 @@ import (
"github.com/docker/libtrust" "github.com/docker/libtrust"
) )
func (s *TagStore) CmdManifest(job *engine.Job) engine.Status {
if len(job.Args) != 1 {
return job.Errorf("usage: %s NAME", job.Name)
}
name := job.Args[0]
tag := job.Getenv("tag")
if tag == "" {
tag = "latest"
}
// Resolve the Repository name from fqn to endpoint + name
repoInfo, err := registry.ParseRepositoryInfo(name)
if err != nil {
return job.Error(err)
}
manifestBytes, err := s.newManifest(name, repoInfo.RemoteName, tag)
if err != nil {
return job.Error(err)
}
_, err = job.Stdout.Write(manifestBytes)
if err != nil {
return job.Error(err)
}
return engine.StatusOK
}
func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error) { func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error) {
manifest := &registry.ManifestData{ manifest := &registry.ManifestData{
Name: remoteName, Name: remoteName,
@@ -71,14 +40,13 @@ func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error
if err != nil { if err != nil {
return nil, err return nil, err
} }
if layer.Config == nil {
return nil, errors.New("Missing layer configuration")
}
manifest.Architecture = layer.Architecture manifest.Architecture = layer.Architecture
manifest.FSLayers = make([]*registry.FSLayer, 0, 4) manifest.FSLayers = make([]*registry.FSLayer, 0, 4)
manifest.History = make([]*registry.ManifestHistory, 0, 4) manifest.History = make([]*registry.ManifestHistory, 0, 4)
var metadata runconfig.Config var metadata runconfig.Config
metadata = *layer.Config if layer.Config != nil {
metadata = *layer.Config
}
for ; layer != nil; layer, err = layer.GetParent() { for ; layer != nil; layer, err = layer.GetParent() {
if err != nil { if err != nil {
@@ -95,28 +63,41 @@ func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error
} }
} }
archive, err := layer.TarLayer() checksum, err := layer.GetCheckSum(s.graph.ImageRoot(layer.ID))
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("Error getting image checksum: %s", err)
}
if tarsum.VersionLabelForChecksum(checksum) != tarsum.Version1.String() {
archive, err := layer.TarLayer()
if err != nil {
return nil, err
}
tarSum, err := tarsum.NewTarSum(archive, true, tarsum.Version1)
if err != nil {
return nil, err
}
if _, err := io.Copy(ioutil.Discard, tarSum); err != nil {
return nil, err
}
checksum = tarSum.Sum(nil)
// Save checksum value
if err := layer.SaveCheckSum(s.graph.ImageRoot(layer.ID), checksum); err != nil {
return nil, err
}
} }
tarSum, err := tarsum.NewTarSum(archive, true, tarsum.Version1) jsonData, err := layer.RawJson()
if err != nil {
return nil, err
}
if _, err := io.Copy(ioutil.Discard, tarSum); err != nil {
return nil, err
}
tarId := tarSum.Sum(nil)
manifest.FSLayers = append(manifest.FSLayers, &registry.FSLayer{BlobSum: tarId})
layersSeen[layer.ID] = true
jsonData, err := ioutil.ReadFile(path.Join(s.graph.Root, layer.ID, "json"))
if err != nil { if err != nil {
return nil, fmt.Errorf("Cannot retrieve the path for {%s}: %s", layer.ID, err) return nil, fmt.Errorf("Cannot retrieve the path for {%s}: %s", layer.ID, err)
} }
manifest.FSLayers = append(manifest.FSLayers, &registry.FSLayer{BlobSum: checksum})
layersSeen[layer.ID] = true
manifest.History = append(manifest.History, &registry.ManifestHistory{V1Compatibility: string(jsonData)}) manifest.History = append(manifest.History, &registry.ManifestHistory{V1Compatibility: string(jsonData)})
} }
@@ -128,7 +109,12 @@ func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error
return manifestBytes, nil return manifestBytes, nil
} }
func (s *TagStore) verifyManifest(eng *engine.Engine, manifestBytes []byte) (*registry.ManifestData, bool, error) { // loadManifest loads a manifest from a byte array and verifies its content.
// The signature must be verified or an error is returned. If the manifest
// contains no signatures by a trusted key for the name in the manifest, the
// image is not considered verified. The parsed manifest object and a boolean
// for whether the manifest is verified is returned.
func (s *TagStore) loadManifest(eng *engine.Engine, manifestBytes []byte) (*registry.ManifestData, bool, error) {
sig, err := libtrust.ParsePrettySignature(manifestBytes, "signatures") sig, err := libtrust.ParsePrettySignature(manifestBytes, "signatures")
if err != nil { if err != nil {
return nil, false, fmt.Errorf("error parsing payload: %s", err) return nil, false, fmt.Errorf("error parsing payload: %s", err)
+82
View File
@@ -0,0 +1,82 @@
package graph
import (
"encoding/json"
"os"
"testing"
"github.com/docker/docker/image"
"github.com/docker/docker/registry"
"github.com/docker/docker/utils"
)
const (
testManifestImageName = "testapp"
testManifestImageID = "d821b739e8834ec89ac4469266c3d11515da88fdcbcbdddcbcddb636f54fdde9"
testManifestImageIDShort = "d821b739e883"
testManifestTag = "manifesttest"
)
func TestManifestTarsumCache(t *testing.T) {
tmp, err := utils.TestDirectory("")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmp)
store := mkTestTagStore(tmp, t)
defer store.graph.driver.Cleanup()
archive, err := fakeTar()
if err != nil {
t.Fatal(err)
}
img := &image.Image{ID: testManifestImageID}
if err := store.graph.Register(img, archive); err != nil {
t.Fatal(err)
}
if err := store.Set(testManifestImageName, testManifestTag, testManifestImageID, false); err != nil {
t.Fatal(err)
}
if cs, err := img.GetCheckSum(store.graph.ImageRoot(testManifestImageID)); err != nil {
t.Fatal(err)
} else if cs != "" {
t.Fatalf("Non-empty checksum file after register")
}
// Generate manifest
payload, err := store.newManifest(testManifestImageName, testManifestImageName, testManifestTag)
if err != nil {
t.Fatal(err)
}
manifestChecksum, err := img.GetCheckSum(store.graph.ImageRoot(testManifestImageID))
if err != nil {
t.Fatal(err)
}
var manifest registry.ManifestData
if err := json.Unmarshal(payload, &manifest); err != nil {
t.Fatalf("error unmarshalling manifest: %s", err)
}
if len(manifest.FSLayers) != 1 {
t.Fatalf("Unexpected number of layers, expecting 1: %d", len(manifest.FSLayers))
}
if manifest.FSLayers[0].BlobSum != manifestChecksum {
t.Fatalf("Unexpected blob sum, expecting %q, got %q", manifestChecksum, manifest.FSLayers[0].BlobSum)
}
if len(manifest.History) != 1 {
t.Fatalf("Unexpected number of layer history, expecting 1: %d", len(manifest.History))
}
v1compat, err := img.RawJson()
if err != nil {
t.Fatal(err)
}
if manifest.History[0].V1Compatibility != string(v1compat) {
t.Fatalf("Unexpected json value\nExpected:\n%s\nActual:\n%s", v1compat, manifest.History[0].V1Compatibility)
}
}
+5 -3
View File
@@ -72,7 +72,7 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
logName += ":" + tag logName += ":" + tag
} }
if len(repoInfo.Index.Mirrors) == 0 && (repoInfo.Index.Official || endpoint.Version == registry.APIVersion2) { if len(repoInfo.Index.Mirrors) == 0 && ((repoInfo.Official && repoInfo.Index.Official) || endpoint.Version == registry.APIVersion2) {
j := job.Eng.Job("trust_update_base") j := job.Eng.Job("trust_update_base")
if err = j.Run(); err != nil { if err = j.Run(); err != nil {
log.Errorf("error updating trust base graph: %s", err) log.Errorf("error updating trust base graph: %s", err)
@@ -153,7 +153,6 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
for _, image := range repoData.ImgList { for _, image := range repoData.ImgList {
downloadImage := func(img *registry.ImgData) { downloadImage := func(img *registry.ImgData) {
if askedTag != "" && img.Tag != askedTag { if askedTag != "" && img.Tag != askedTag {
log.Debugf("(%s) does not match %s (id: %s), skipping", img.Tag, askedTag, img.ID)
if parallel { if parallel {
errors <- nil errors <- nil
} }
@@ -388,6 +387,9 @@ func (s *TagStore) pullV2Repository(eng *engine.Engine, r *registry.Session, out
if err != nil { if err != nil {
return err return err
} }
if len(tags) == 0 {
return registry.ErrDoesNotExist
}
for _, t := range tags { for _, t := range tags {
if downloaded, err := s.pullV2Tag(eng, r, out, endpoint, repoInfo, t, sf, parallel, auth); err != nil { if downloaded, err := s.pullV2Tag(eng, r, out, endpoint, repoInfo, t, sf, parallel, auth); err != nil {
return err return err
@@ -418,7 +420,7 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
return false, err return false, err
} }
manifest, verified, err := s.verifyManifest(eng, manifestBytes) manifest, verified, err := s.loadManifest(eng, manifestBytes)
if err != nil { if err != nil {
return false, fmt.Errorf("error verifying manifest: %s", err) return false, fmt.Errorf("error verifying manifest: %s", err)
} }
+119 -67
View File
@@ -2,6 +2,7 @@ package graph
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@@ -18,6 +19,8 @@ import (
"github.com/docker/libtrust" "github.com/docker/libtrust"
) )
var ErrV2RegistryUnavailable = errors.New("error v2 registry unavailable")
// Retrieve the all the images to be uploaded in the correct order // Retrieve the all the images to be uploaded in the correct order
func (s *TagStore) getImageList(localRepo map[string]string, requestedTag string) ([]string, map[string][]string, error) { func (s *TagStore) getImageList(localRepo map[string]string, requestedTag string) ([]string, map[string][]string, error) {
var ( var (
@@ -65,6 +68,25 @@ func (s *TagStore) getImageList(localRepo map[string]string, requestedTag string
return imageList, tagsByImage, nil return imageList, tagsByImage, nil
} }
func (s *TagStore) getImageTags(localName, askedTag string) ([]string, error) {
localRepo, err := s.Get(localName)
if err != nil {
return nil, err
}
log.Debugf("Checking %s against %#v", askedTag, localRepo)
if len(askedTag) > 0 {
if _, ok := localRepo[askedTag]; !ok {
return nil, fmt.Errorf("Tag does not exist for %s:%s", localName, askedTag)
}
return []string{askedTag}, nil
}
var tags []string
for tag := range localRepo {
tags = append(tags, tag)
}
return tags, nil
}
// createImageIndex returns an index of an image's layer IDs and tags. // createImageIndex returns an index of an image's layer IDs and tags.
func (s *TagStore) createImageIndex(images []string, tags map[string][]string) []*registry.ImgData { func (s *TagStore) createImageIndex(images []string, tags map[string][]string) []*registry.ImgData {
var imageIndex []*registry.ImgData var imageIndex []*registry.ImgData
@@ -236,10 +258,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
// Send the layer // Send the layer
log.Debugf("rendered layer for %s of [%d] size", imgData.ID, layerData.Size) log.Debugf("rendered layer for %s of [%d] size", imgData.ID, layerData.Size)
prgRd := utils.ProgressReader(layerData, int(layerData.Size), out, sf, false, utils.TruncateID(imgData.ID), "Pushing") checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, utils.ProgressReader(layerData, int(layerData.Size), out, sf, false, utils.TruncateID(imgData.ID), "Pushing"), ep, token, jsonRaw)
defer prgRd.Close()
checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, prgRd, ep, token, jsonRaw)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -254,7 +273,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
return imgData.Checksum, nil return imgData.Checksum, nil
} }
func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out io.Writer, repoInfo *registry.RepositoryInfo, manifestBytes, tag string, sf *utils.StreamFormatter) error { func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out io.Writer, repoInfo *registry.RepositoryInfo, tag string, sf *utils.StreamFormatter) error {
if repoInfo.Official { if repoInfo.Official {
j := eng.Job("trust_update_base") j := eng.Job("trust_update_base")
if err := j.Run(); err != nil { if err := j.Run(); err != nil {
@@ -264,15 +283,28 @@ func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out
endpoint, err := r.V2RegistryEndpoint(repoInfo.Index) endpoint, err := r.V2RegistryEndpoint(repoInfo.Index)
if err != nil { if err != nil {
if repoInfo.Index.Official {
log.Infof("Unable to push to V2 registry, falling back to v1: %s", err)
return ErrV2RegistryUnavailable
}
return fmt.Errorf("error getting registry endpoint: %s", err) return fmt.Errorf("error getting registry endpoint: %s", err)
} }
tags, err := s.getImageTags(repoInfo.LocalName, tag)
if err != nil {
return err
}
if len(tags) == 0 {
return fmt.Errorf("No tags to push for %s", repoInfo.LocalName)
}
auth, err := r.GetV2Authorization(endpoint, repoInfo.RemoteName, false) auth, err := r.GetV2Authorization(endpoint, repoInfo.RemoteName, false)
if err != nil { if err != nil {
return fmt.Errorf("error getting authorization: %s", err) return fmt.Errorf("error getting authorization: %s", err)
} }
// if no manifest is given, generate and sign with the key associated with the local tag store for _, tag := range tags {
if len(manifestBytes) == 0 { log.Debugf("Pushing %s:%s to v2 repository", repoInfo.LocalName, tag)
mBytes, err := s.newManifest(repoInfo.LocalName, repoInfo.RemoteName, tag) mBytes, err := s.newManifest(repoInfo.LocalName, repoInfo.RemoteName, tag)
if err != nil { if err != nil {
return err return err
@@ -290,75 +322,99 @@ func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out
if err != nil { if err != nil {
return err return err
} }
log.Infof("Signed manifest using daemon's key: %s", s.trustKey.KeyID()) log.Infof("Signed manifest for %s:%s using daemon's key: %s", repoInfo.LocalName, tag, s.trustKey.KeyID())
manifestBytes = string(signedBody) manifestBytes := string(signedBody)
}
manifest, verified, err := s.verifyManifest(eng, []byte(manifestBytes)) manifest, verified, err := s.loadManifest(eng, signedBody)
if err != nil {
return fmt.Errorf("error verifying manifest: %s", err)
}
if err := checkValidManifest(manifest); err != nil {
return fmt.Errorf("invalid manifest: %s", err)
}
if !verified {
log.Debugf("Pushing unverified image")
}
for i := len(manifest.FSLayers) - 1; i >= 0; i-- {
var (
sumStr = manifest.FSLayers[i].BlobSum
imgJSON = []byte(manifest.History[i].V1Compatibility)
)
sumParts := strings.SplitN(sumStr, ":", 2)
if len(sumParts) < 2 {
return fmt.Errorf("Invalid checksum: %s", sumStr)
}
manifestSum := sumParts[1]
img, err := image.NewImgJSON(imgJSON)
if err != nil { if err != nil {
return fmt.Errorf("Failed to parse json: %s", err) return fmt.Errorf("error verifying manifest: %s", err)
} }
img, err = s.graph.Get(img.ID) if err := checkValidManifest(manifest); err != nil {
if err != nil { return fmt.Errorf("invalid manifest: %s", err)
return err
} }
arch, err := img.TarLayer() if verified {
if err != nil { log.Infof("Pushing verified image, key %s is registered for %q", s.trustKey.KeyID(), repoInfo.RemoteName)
return fmt.Errorf("Could not get tar layer: %s", err)
} }
// Call mount blob for i := len(manifest.FSLayers) - 1; i >= 0; i-- {
exists, err := r.HeadV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, auth) var (
if err != nil { sumStr = manifest.FSLayers[i].BlobSum
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil)) imgJSON = []byte(manifest.History[i].V1Compatibility)
return err )
}
if !exists { sumParts := strings.SplitN(sumStr, ":", 2)
prgRd := utils.ProgressReader(arch, int(img.Size), out, sf, false, utils.TruncateID(img.ID), "Pushing") if len(sumParts) < 2 {
defer prgRd.Close() return fmt.Errorf("Invalid checksum: %s", sumStr)
}
manifestSum := sumParts[1]
err = r.PutV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, prgRd, auth) img, err := image.NewImgJSON(imgJSON)
if err != nil {
return fmt.Errorf("Failed to parse json: %s", err)
}
// Call mount blob
exists, err := r.HeadV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, auth)
if err != nil { if err != nil {
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil)) out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil))
return err return err
} }
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image successfully pushed", nil))
} else { if !exists {
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image already exists", nil)) if err := s.pushV2Image(r, img, endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, sf, out, auth); err != nil {
return err
}
} else {
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image already exists", nil))
}
}
// push the manifest
if err := r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, bytes.NewReader([]byte(manifestBytes)), auth); err != nil {
return err
} }
} }
return nil
}
// push the manifest // PushV2Image pushes the image content to the v2 registry, first buffering the contents to disk
return r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, bytes.NewReader([]byte(manifestBytes)), auth) func (s *TagStore) pushV2Image(r *registry.Session, img *image.Image, endpoint *registry.Endpoint, imageName, sumType, sumStr string, sf *utils.StreamFormatter, out io.Writer, auth *registry.RequestAuthorization) error {
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Buffering to Disk", nil))
image, err := s.graph.Get(img.ID)
if err != nil {
return err
}
arch, err := image.TarLayer()
if err != nil {
return err
}
tf, err := s.graph.newTempFile()
if err != nil {
return err
}
defer func() {
tf.Close()
os.Remove(tf.Name())
}()
size, err := bufferToFile(tf, arch)
if err != nil {
return err
}
// Send the layer
log.Debugf("rendered layer for %s of [%d] size", img.ID, size)
if err := r.PutV2ImageBlob(endpoint, imageName, sumType, sumStr, utils.ProgressReader(tf, int(size), out, sf, false, utils.TruncateID(img.ID), "Pushing"), auth); err != nil {
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil))
return err
}
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image successfully pushed", nil))
return nil
} }
// FIXME: Allow to interrupt current push when new push of same image is done. // FIXME: Allow to interrupt current push when new push of same image is done.
@@ -380,7 +436,6 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status {
} }
tag := job.Getenv("tag") tag := job.Getenv("tag")
manifestBytes := job.Getenv("manifest")
job.GetenvJson("authConfig", authConfig) job.GetenvJson("authConfig", authConfig)
job.GetenvJson("metaHeaders", &metaHeaders) job.GetenvJson("metaHeaders", &metaHeaders)
@@ -400,18 +455,15 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status {
return job.Error(err2) return job.Error(err2)
} }
if len(tag) == 0 { if endpoint.Version == registry.APIVersion2 {
tag = DEFAULTTAG err := s.pushV2Repository(r, job.Eng, job.Stdout, repoInfo, tag, sf)
}
if repoInfo.Index.Official || endpoint.Version == registry.APIVersion2 {
err := s.pushV2Repository(r, job.Eng, job.Stdout, repoInfo, manifestBytes, tag, sf)
if err == nil { if err == nil {
return engine.StatusOK return engine.StatusOK
} }
// error out, no fallback to V1 if err != ErrV2RegistryUnavailable {
return job.Error(err) return job.Errorf("Error pushing to registry: %s", err)
}
} }
if err != nil { if err != nil {
-2
View File
@@ -25,7 +25,6 @@ func (s *TagStore) Install(eng *engine.Engine) error {
"import": s.CmdImport, "import": s.CmdImport,
"pull": s.CmdPull, "pull": s.CmdPull,
"push": s.CmdPush, "push": s.CmdPush,
"image_manifest": s.CmdManifest,
} { } {
if err := eng.Register(name, handler); err != nil { if err := eng.Register(name, handler); err != nil {
return fmt.Errorf("Could not register %q: %v", name, err) return fmt.Errorf("Could not register %q: %v", name, err)
@@ -151,7 +150,6 @@ func (s *TagStore) CmdLookup(job *engine.Job) engine.Status {
out.Set("Os", image.OS) out.Set("Os", image.OS)
out.SetInt64("Size", image.Size) out.SetInt64("Size", image.Size)
out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size) out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size)
out.Set("Checksum", image.Checksum)
if _, err = out.WriteTo(job.Stdout); err != nil { if _, err = out.WriteTo(job.Stdout); err != nil {
return job.Error(err) return job.Error(err)
} }

Some files were not shown because too many files have changed in this diff Show More