mirror of
https://github.com/clearlinux/docker.git
synced 2026-08-19 20:26:54 +00:00
Compare commits
120 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a8a31eff10 | |||
| 68a8fd5c4e | |||
| 8387c5ab65 | |||
| 69498943c3 | |||
| 1aeb78c2ae | |||
| 331d37f35d | |||
| edf3bf7f33 | |||
| 9ee8dca246 | |||
| aa98bb6c13 | |||
| 2aba3c69f9 | |||
| 71a44c769e | |||
| d8381fad2b | |||
| be379580d0 | |||
| 7ea8513479 | |||
| 3b2fe01c78 | |||
| e8afc22b1f | |||
| 4e407e6b77 | |||
| 23f1c2ea9e | |||
| 788047cafb | |||
| 0c0e7b1b60 | |||
| 09d41529a0 | |||
| cb288fefee | |||
| f7636796c5 | |||
| cb5af83444 | |||
| 96feaf1920 | |||
| 1f03944950 | |||
| 6060eedf9c | |||
| d217da854a | |||
| d74d6d981b | |||
| 0205ac33d2 | |||
| dbb9d47bdc | |||
| ddd1d081d7 | |||
| d6ac36d929 | |||
| 715b94f664 | |||
| 16baca9277 | |||
| 627f8a6cd5 | |||
| a8a7df203a | |||
| 580cbcefd3 | |||
| d9c5ce6e97 | |||
| 0fe9b95415 | |||
| 41d0e4293e | |||
| 26fe640da1 | |||
| 198ca26969 | |||
| d5365f6fc4 | |||
| 5f7e814ee7 | |||
| a84aca0985 | |||
| 68ec22876a | |||
| 0dcc3559e9 | |||
| d4c731ecd6 | |||
| 2dba4e1386 | |||
| 06a7f471e0 | |||
| 4683d01691 | |||
| 6020a06399 | |||
| cc0bfccdf4 | |||
| 0c18ec62f3 | |||
| a9825c9bd8 | |||
| 908be50c44 | |||
| 2a82dba34d | |||
| 13fd2a908c | |||
| 464891aaf8 | |||
| 9974663ed7 | |||
| 76269e5c9d | |||
| 1121d7c4fd | |||
| 7e197575a2 | |||
| 3dc3059d94 | |||
| 7b6de74c9a | |||
| cad8adacb8 | |||
| 6226deeaf4 | |||
| 3ec19f56cf | |||
| 48c71787ed | |||
| 604731a930 | |||
| e8650e01f8 | |||
| 817d04d992 | |||
| cdff91a01c | |||
| 6f26bd0e16 | |||
| 3c090db4e9 | |||
| b7c3fdfd0d | |||
| aa682a845b | |||
| 218d0dcc9d | |||
| 510d8f8634 | |||
| b65600f6b6 | |||
| 79dcea718c | |||
| 072b09c45d | |||
| c2d9837745 | |||
| fa5dfbb18b | |||
| 6532a075f3 | |||
| 3b4a4bf809 | |||
| 4602909566 | |||
| 588f350b61 | |||
| 6e5ff509b2 | |||
| 61d341c2ca | |||
| b996d379a1 | |||
| b0935ea730 | |||
| 96fe13b49b | |||
| 12ccde442a | |||
| 4262cfe41f | |||
| ddc2e25546 | |||
| 6646cff646 | |||
| ac8fd856c0 | |||
| 48754d673c | |||
| 723684525a | |||
| 32aceadbe6 | |||
| c67d3e159c | |||
| a080e2add7 | |||
| 24d81b0ddb | |||
| 08f2fad40b | |||
| f91fbe39ce | |||
| 018ab080bb | |||
| fe94ecb2c1 | |||
| 7b2e67036f | |||
| e130faea1b | |||
| 38f09de334 | |||
| f9ba68ddfb | |||
| 16913455bd | |||
| 32f189cd08 | |||
| 526ca42282 | |||
| b98b42d843 | |||
| 7bf03dd132 | |||
| 034aa3b2c4 | |||
| 6da1e01e6c |
+1
-1
@@ -10,5 +10,5 @@ script:
|
||||
- rm integration-cli/docker_cli_daemon_test.go
|
||||
- rm integration-cli/docker_cli_exec_test.go
|
||||
# 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
|
||||
|
||||
@@ -6,6 +6,24 @@
|
||||
#
|
||||
# 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>
|
||||
<daniel.mizyrycki@dotcloud.com> <daniel@dotcloud.com>
|
||||
<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> <crosby.michael@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>
|
||||
<dano@spotify.com> <daniel.norberg@gmail.com>
|
||||
<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@users.noreply.github.com>
|
||||
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>
|
||||
Alexandr Morozov <lk4d4math@gmail.com>
|
||||
<git.nivoc@neverbox.com> <kuehnle@online.de>
|
||||
|
||||
@@ -12,41 +12,46 @@ Adam Singer <financeCoding@gmail.com>
|
||||
Aditya <aditya@netroy.in>
|
||||
Adrian Mouat <adrian.mouat@gmail.com>
|
||||
Adrien Folie <folie.adrien@gmail.com>
|
||||
Ahmed Kamal <email.ahmedkamal@googlemail.com>
|
||||
Ahmet Alp Balkan <ahmetb@microsoft.com>
|
||||
Aidan Hobson Sayers <aidanhs@cantab.net>
|
||||
AJ Bowen <aj@gandi.net>
|
||||
Al Tobey <al@ooyala.com>
|
||||
alambike <alambike@gmail.com>
|
||||
Alan Thompson <cloojure@gmail.com>
|
||||
Albert Callarisa <shark234@gmail.com>
|
||||
Albert Zhang <zhgwenming@gmail.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 Morozov <lk4d4@docker.com>
|
||||
Alexander Shopov <ash@kambanaria.org>
|
||||
Alexandr Morozov <lk4d4@docker.com>
|
||||
Alexey Kotlyarov <alexey@infoxchange.net.au>
|
||||
Alexey Shamrin <shamrin@gmail.com>
|
||||
Alex Gaynor <alex.gaynor@gmail.com>
|
||||
Alexis THOMAS <fr.alexisthomas@gmail.com>
|
||||
Alex Warhawk <ax.warhawk@gmail.com>
|
||||
almoehi <almoehi@users.noreply.github.com>
|
||||
Al Tobey <al@ooyala.com>
|
||||
Álvaro Lázaro <alvaro.lazaro.g@gmail.com>
|
||||
amangoel <amangoel@gmail.com>
|
||||
Amit Bakshi <ambakshi@gmail.com>
|
||||
AnandkumarPatel <anandkumarpatel@gmail.com>
|
||||
Anand Patil <anand.prabhakar.patil@gmail.com>
|
||||
AnandkumarPatel <anandkumarpatel@gmail.com>
|
||||
Andre Dublin <81dublin@gmail.com>
|
||||
Andrea Luzzardi <aluzzardi@gmail.com>
|
||||
Andrea Turli <andrea.turli@gmail.com>
|
||||
Andreas Köhler <andi5.py@gmx.net>
|
||||
Andreas Savvides <andreas@editd.com>
|
||||
Andreas Tiefenthaler <at@an-ti.eu>
|
||||
Andrea Turli <andrea.turli@gmail.com>
|
||||
Andre Dublin <81dublin@gmail.com>
|
||||
Andrew C. Bodine <acbodine@us.ibm.com>
|
||||
Andrew Duckworth <grillopress@gmail.com>
|
||||
Andrew France <andrew@avito.co.uk>
|
||||
Andrew Macgregor <andrew.macgregor@agworld.com.au>
|
||||
Andrew Munsell <andrew@wizardapps.net>
|
||||
Andrews Medina <andrewsmedina@gmail.com>
|
||||
Andrew Weiss <andrew.weiss@outlook.com>
|
||||
Andrew Williams <williams.andrew@gmail.com>
|
||||
Andrews Medina <andrewsmedina@gmail.com>
|
||||
Andrey Petrov <andrey.petrov@shazow.net>
|
||||
Andrey Stolbovsky <andrey.stolbovsky@gmail.com>
|
||||
Andy Chambers <anchambers@paypal.com>
|
||||
@@ -56,6 +61,8 @@ Andy Kipp <andy@rstudio.com>
|
||||
Andy Rothfusz <github@developersupport.net>
|
||||
Andy Smith <github@anarkystic.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>
|
||||
Anton Löfgren <anton.lofgren@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>
|
||||
bdevloed <boris.de.vloed@gmail.com>
|
||||
Ben Firshman <ben@firshman.co.uk>
|
||||
Benjamin Atkin <ben@benatkin.com>
|
||||
Benoit Chesneau <bchesneau@gmail.com>
|
||||
Ben Sargent <ben@brokendigits.com>
|
||||
Ben Toews <mastahyeti@gmail.com>
|
||||
Ben Wiklund <ben@daisyowl.com>
|
||||
Benjamin Atkin <ben@benatkin.com>
|
||||
Benoit Chesneau <bchesneau@gmail.com>
|
||||
Bernerd Schaefer <bj.schaefer@gmail.com>
|
||||
Bert Goethals <bert@bertg.be>
|
||||
Bhiraj Butala <abhiraj.butala@gmail.com>
|
||||
@@ -113,18 +120,22 @@ Charles Hooper <charles.hooper@dotcloud.com>
|
||||
Charles Lindsay <chaz@chazomatic.us>
|
||||
Charles Merriam <charles.merriam@gmail.com>
|
||||
Charlie Lewis <charliel@lab41.org>
|
||||
Chen Chao <cc272309126@gmail.com>
|
||||
Chewey <prosto-chewey@users.noreply.github.com>
|
||||
Chia-liang Kao <clkao@clkao.org>
|
||||
Chris Alfonso <calfonso@redhat.com>
|
||||
Chris Armstrong <chris@opdemand.com>
|
||||
chrismckinnel <chris.mckinnel@tangentlabs.co.uk>
|
||||
Chris Snow <chsnow123@gmail.com>
|
||||
Chris St. Pierre <chris.a.st.pierre@gmail.com>
|
||||
chrismckinnel <chris.mckinnel@tangentlabs.co.uk>
|
||||
Christian Berendt <berendt@b1-systems.de>
|
||||
Christian Stefanescu <st.chris@gmail.com>
|
||||
ChristoperBiscardi <biscarch@sketcht.com>
|
||||
Christopher Currie <codemonkey+github@gmail.com>
|
||||
Christopher Rigor <crigor@gmail.com>
|
||||
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>
|
||||
Clayton Coleman <ccoleman@redhat.com>
|
||||
Colin Dunklau <colin.dunklau@gmail.com>
|
||||
@@ -132,15 +143,20 @@ Colin Rice <colin@daedrum.net>
|
||||
Colin Walters <walters@verbum.org>
|
||||
Cory Forsyth <cory.forsyth@gmail.com>
|
||||
cressie176 <github@stephen-cresswell.net>
|
||||
Cristian Staretu <cristian.staretu@gmail.com>
|
||||
Cruceru Calin-Cristian <crucerucalincristian@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>
|
||||
Dan Buch <d.buch@modcloth.com>
|
||||
Dan Cotora <dan@bluevision.ro>
|
||||
Dan Griffin <dgriffin@peer1.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 Farrell <dfarrell@redhat.com>
|
||||
Daniel Garcia <daniel@danielgarcia.info>
|
||||
@@ -152,29 +168,27 @@ Daniel Nordberg <dnordberg@gmail.com>
|
||||
Daniel Robinson <gottagetmac@gmail.com>
|
||||
Daniel Von Fange <daniel@leancoder.com>
|
||||
Daniel YC Lin <dlin.tw@gmail.com>
|
||||
Dan Keder <dan.keder@gmail.com>
|
||||
Dan McPherson <dmcphers@redhat.com>
|
||||
Daniel, Dao Quang Minh <dqminh89@gmail.com>
|
||||
Danny Berger <dpb587@gmail.com>
|
||||
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 Shepherd <darren.s.shepherd@gmail.com>
|
||||
David Anderson <dave@natulte.net>
|
||||
David Calavera <david.calavera@gmail.com>
|
||||
David Corking <dmc-source@dcorking.com>
|
||||
Davide Ceretti <davide.ceretti@hogarthww.com>
|
||||
David Gageot <david@gageot.net>
|
||||
David Gebler <davidgebler@gmail.com>
|
||||
David Mat <david@davidmat.com>
|
||||
David Mcanulty <github@hellspark.com>
|
||||
David Pelaez <pelaez89@gmail.com>
|
||||
David Röthlisberger <david@rothlis.net>
|
||||
David Sissitka <me@dsissitka.com>
|
||||
Davide Ceretti <davide.ceretti@hogarthww.com>
|
||||
Dawn Chen <dawnchen@google.com>
|
||||
decadent <decadent@users.noreply.github.com>
|
||||
Deni Bertovic <deni@kset.org>
|
||||
Derek <crq@kernel.org>
|
||||
Derek <crquan@gmail.com>
|
||||
Derek McGowan <derek@mcgstyle.net>
|
||||
Deric Crago <deric.crago@gmail.com>
|
||||
Deshi Xiao <dxiao@redhat.com>
|
||||
@@ -182,14 +196,16 @@ Dinesh Subhraveti <dineshs@altiscale.com>
|
||||
Djibril Koné <kone.djibril@gmail.com>
|
||||
dkumor <daniel@dkumor.com>
|
||||
Dmitry Demeshchuk <demeshchuk@gmail.com>
|
||||
Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
|
||||
Dolph Mathews <dolph.mathews@gmail.com>
|
||||
Dominik Honnef <dominik@honnef.co>
|
||||
Don Kjer <don.kjer@gmail.com>
|
||||
Don Spaulding <donspauldingii@gmail.com>
|
||||
Doug Davis <dug@us.ibm.com>
|
||||
doug tangren <d.tangren@gmail.com>
|
||||
Dr Nic Williams <drnicwilliams@gmail.com>
|
||||
dragon788 <dragon788@users.noreply.github.com>
|
||||
Dražen Lučanin <kermit666@gmail.com>
|
||||
Dr Nic Williams <drnicwilliams@gmail.com>
|
||||
Dustin Sallings <dustin@spy.net>
|
||||
Edmund Wagner <edmund-wagner@web.de>
|
||||
Eiichi Tsukata <devel@etsukata.com>
|
||||
@@ -197,19 +213,22 @@ Eike Herzbach <eike@herzbach.net>
|
||||
Eivind Uggedal <eivind@uggedal.com>
|
||||
Elias Probst <mail@eliasprobst.eu>
|
||||
Emil Hernvall <emil@quench.at>
|
||||
Emily Maier <emily@emilymaier.net>
|
||||
Emily Rose <emily@contactvibe.com>
|
||||
Eric Hanchrow <ehanchrow@ine.com>
|
||||
Eric Lee <thenorthsecedes@gmail.com>
|
||||
Eric Myhre <hash@exultant.us>
|
||||
Eric Paris <eparis@redhat.com>
|
||||
Eric Windisch <ewindisch@docker.com>
|
||||
Erik Dubbelboer <erik@dubbelboer.com>
|
||||
Erik Hollensbe <github@hollensbe.org>
|
||||
Erik Inge Bolsø <knan@redpill-linpro.com>
|
||||
Erik Kristensen <erik@erikkristensen.com>
|
||||
Erno Hopearuoho <erno.hopearuoho@gmail.com>
|
||||
Erwin van der Koogh <info@erronis.nl>
|
||||
Eugene Yakubovich <eugene.yakubovich@coreos.com>
|
||||
eugenkrizo <eugen.krizo@gmail.com>
|
||||
evanderkoogh <info@erronis.nl>
|
||||
Evan Carmi <carmi@users.noreply.github.com>
|
||||
Evan Hazlett <ejhazlett@gmail.com>
|
||||
Evan Krall <krall@yelp.com>
|
||||
Evan Phoenix <evan@fallingsnow.net>
|
||||
@@ -230,9 +249,9 @@ Francisco Carriedo <fcarriedo@gmail.com>
|
||||
Francisco Souza <f@souza.cc>
|
||||
Frank Macreery <frank@macreery.com>
|
||||
Frank Rosquin <frank.rosquin+github@gmail.com>
|
||||
Fred Lifton <fred.lifton@docker.com>
|
||||
Frederick F. Kautz IV <fkautz@alumni.cmu.edu>
|
||||
Frederik Loeffert <frederik@zitrusmedia.de>
|
||||
Fred Lifton <fred.lifton@docker.com>
|
||||
Freek Kalter <freek@kalteronline.org>
|
||||
Gabe Rosenhouse <gabe@missionst.com>
|
||||
Gabor Nagy <mail@aigeruth.hu>
|
||||
@@ -266,13 +285,15 @@ Hector Castro <hectcastro@gmail.com>
|
||||
Henning Sprang <henning.sprang@gmail.com>
|
||||
Hobofan <goisser94@gmail.com>
|
||||
Hollie Teal <hollie@docker.com>
|
||||
Hu Keping <hukeping@huawei.com>
|
||||
Hu Tao <hutao@cn.fujitsu.com>
|
||||
Huayi Zhang <irachex@gmail.com>
|
||||
Hugo Duncan <hugo@hugoduncan.org>
|
||||
Hunter Blanks <hunter@twilio.com>
|
||||
Hu Tao <hutao@cn.fujitsu.com>
|
||||
Huu Nguyen <huu@prismskylabs.com>
|
||||
hyeongkyu.lee <hyeongkyu.lee@navercorp.com>
|
||||
Ian Babrou <ibobrik@gmail.com>
|
||||
Ian Bishop <ianbishop@pace7.com>
|
||||
Ian Bull <irbull@gmail.com>
|
||||
Ian Main <imain@redhat.com>
|
||||
Ian Truslove <ian.truslove@gmail.com>
|
||||
@@ -284,8 +305,10 @@ Isabel Jimenez <contact.isabeljimenez@gmail.com>
|
||||
Isao Jonas <isao.jonas@gmail.com>
|
||||
Ivan Fraixedes <ifcdev@gmail.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>
|
||||
jakedt <jake@devtable.com>
|
||||
James Allen <jamesallen0108@gmail.com>
|
||||
James Carr <james.r.carr@gmail.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 Dalido <jeanbaptiste@appgratis.com>
|
||||
Jean-Paul Calderone <exarkun@twistedmatrix.com>
|
||||
Jean-Tiare Le Bigot <jt@yadutaf.fr>
|
||||
Jeff Anderson <jeff@docker.com>
|
||||
Jeff Lindsay <progrium@gmail.com>
|
||||
Jeffrey Bolle <jeffreybolle@gmail.com>
|
||||
Jeff Welch <whatthejeff@gmail.com>
|
||||
Jeffrey Bolle <jeffreybolle@gmail.com>
|
||||
Jeremy Grosser <jeremy@synack.me>
|
||||
Jérôme Petazzoni <jerome.petazzoni@dotcloud.com>
|
||||
Jesse Dubay <jesse@thefortytwo.net>
|
||||
Jessica Frazelle <jess@docker.com>
|
||||
Jezeniel Zapanta <jpzapanta22@gmail.com>
|
||||
Jilles Oldenbeuving <ojilles@gmail.com>
|
||||
Jim Alateras <jima@comware.com.au>
|
||||
Jimmy Cuadra <jimmy@jimmycuadra.com>
|
||||
Jim Perrin <jperrin@centos.org>
|
||||
Jimmy Cuadra <jimmy@jimmycuadra.com>
|
||||
Jiří Župka <jzupka@redhat.com>
|
||||
Joe Beda <joe.github@bedafamily.com>
|
||||
Joe Ferguson <joe@infosiftr.com>
|
||||
Joel Handwell <joelhandwell@gmail.com>
|
||||
Joe Shaw <joe@joeshaw.org>
|
||||
Joe Van Dyk <joe@tanga.com>
|
||||
Joel Friedly <joelfriedly@gmail.com>
|
||||
Joel Handwell <joelhandwell@gmail.com>
|
||||
Joffrey F <joffrey@docker.com>
|
||||
Johan Euphrosine <proppy@google.com>
|
||||
Johannes 'fish' Ziemke <github@freigeist.org>
|
||||
Johan Rydberg <johan.rydberg@gmail.com>
|
||||
Johannes 'fish' Ziemke <github@freigeist.org>
|
||||
John Costa <john.costa@gmail.com>
|
||||
John Feminella <jxf@jxf.me>
|
||||
John Gardiner Myers <jgmyers@proofpoint.com>
|
||||
John Gossman <johngos@microsoft.com>
|
||||
John OBrien III <jobrieniii@yahoo.com>
|
||||
John Warwick <jwarwick@gmail.com>
|
||||
Jon Wedaman <jweede@gmail.com>
|
||||
Jonas Pfenniger <jonas@pfenniger.name>
|
||||
Jonathan A. Sternberg <jonathansternberg@gmail.com>
|
||||
Jonathan Boulle <jonathanboulle@gmail.com>
|
||||
Jonathan Camp <jonathan@irondojo.com>
|
||||
Jonathan McCrohan <jmccrohan@gmail.com>
|
||||
Jonathan Mueller <j.mueller@apoveda.ch>
|
||||
Jonathan Pares <jonathanpa@users.noreply.github.com>
|
||||
Jonathan Rudenberg <jonathan@titanous.com>
|
||||
Jon Wedaman <jweede@gmail.com>
|
||||
Joost Cassee <joost@cassee.net>
|
||||
Jordan Arentsen <blissdev@gmail.com>
|
||||
Jordan Sissel <jls@semicomplete.com>
|
||||
Joseph Anthony Pasquale Holsten <joseph@josephholsten.com>
|
||||
Joseph Hager <ajhager@gmail.com>
|
||||
Josh Hawn <josh.hawn@docker.com>
|
||||
Josh <jokajak@gmail.com>
|
||||
Josh Hawn <josh.hawn@docker.com>
|
||||
Josh Poimboeuf <jpoimboe@redhat.com>
|
||||
Josiah Kiehl <jkiehl@riotgames.com>
|
||||
JP <jpellerin@leapfrogonline.com>
|
||||
@@ -360,6 +386,9 @@ Justin Force <justin.force@gmail.com>
|
||||
Justin Plock <jplock@users.noreply.github.com>
|
||||
Justin Simonelis <justin.p.simonelis@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>
|
||||
Karl Grzeszczak <karlgrz@gmail.com>
|
||||
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
|
||||
@@ -367,14 +396,13 @@ Kawsar Saiyeed <kawsar.saiyeed@projiris.com>
|
||||
Keli Hu <dev@keli.hu>
|
||||
Ken Cochrane <kencochrane@gmail.com>
|
||||
Ken ICHIKAWA <ichikawa.ken@jp.fujitsu.com>
|
||||
Kevin "qwazerty" Houdebert <kevin.houdebert@gmail.com>
|
||||
Kevin Clark <kevin.clark@gmail.com>
|
||||
Kevin J. Lynagh <kevin@keminglabs.com>
|
||||
Kevin Menard <kevin@nirvdrum.com>
|
||||
Kevin "qwazerty" Houdebert <kevin.houdebert@gmail.com>
|
||||
Kevin Wallace <kevin@pentabarf.net>
|
||||
Keyvan Fatehi <keyvanfatehi@gmail.com>
|
||||
kies <lleelm@gmail.com>
|
||||
kim0 <email.ahmedkamal@googlemail.com>
|
||||
Kim BKC Carlbacker <kim.carlbacker@gmail.com>
|
||||
Kimbro Staken <kstaken@kstaken.com>
|
||||
Kiran Gangadharan <kiran.daredevil@gmail.com>
|
||||
@@ -382,6 +410,7 @@ knappe <tyler.knappe@gmail.com>
|
||||
Kohei Tsuruta <coheyxyz@gmail.com>
|
||||
Konrad Kleine <konrad.wilhelm.kleine@gmail.com>
|
||||
Konstantin Pelykh <kpelykh@zettaset.com>
|
||||
Krasimir Georgiev <support@vip-consult.co.uk>
|
||||
krrg <krrgithub@gmail.com>
|
||||
Kyle Conroy <kyle.j.conroy@gmail.com>
|
||||
kyu <leehk1227@gmail.com>
|
||||
@@ -397,13 +426,16 @@ Lei Jitang <leijitang@huawei.com>
|
||||
Len Weincier <len@cloudafrica.net>
|
||||
Leszek Kowalski <github@leszekkowalski.pl>
|
||||
Levi Gross <levi@levigross.com>
|
||||
Lewis Marshall <lewis@lmars.net>
|
||||
Lewis Peckover <lew+github@lew.io>
|
||||
Liang-Chi Hsieh <viirya@gmail.com>
|
||||
limsy <seongyeol37@gmail.com>
|
||||
Lokesh Mandvekar <lsm5@fedoraproject.org>
|
||||
Lorenz Leutgeb <lorenz.leutgeb@gmail.com>
|
||||
Louis Opter <kalessin@kalessin.fr>
|
||||
lukaspustina <lukas.pustina@centerdevice.com>
|
||||
lukemarsden <luke@digital-crocus.com>
|
||||
Lénaïc Huard <lhuard@amadeus.com>
|
||||
Madhu Venugopal <madhu@socketplane.io>
|
||||
Mahesh Tiyyagura <tmahesh@gmail.com>
|
||||
Malte Janduda <mail@janduda.net>
|
||||
@@ -412,12 +444,13 @@ Manuel Meurer <manuel@krautcomputing.com>
|
||||
Manuel Woelker <github@manuel.woelker.org>
|
||||
Marc Abramowitz <marc@marc-abramowitz.com>
|
||||
Marc Kuo <kuomarc2@gmail.com>
|
||||
Marco Hennings <marco.hennings@freiheit.com>
|
||||
Marc Tamsky <mtamsky@gmail.com>
|
||||
Marco Hennings <marco.hennings@freiheit.com>
|
||||
Marcus Farkas <toothlessgear@finitebox.com>
|
||||
marcuslinke <marcus.linke@gmx.de>
|
||||
Marcus Linke <marcus.linke@gmx.de>
|
||||
Marcus Ramberg <marcus@nordaaker.com>
|
||||
Marek Goldmann <marek.goldmann@gmail.com>
|
||||
Marianna <mtesselh@gmail.com>
|
||||
Marius Voila <marius.voila@gmail.com>
|
||||
Mark Allen <mrallen1@yahoo.com>
|
||||
Mark McGranaghan <mmcgrana@gmail.com>
|
||||
@@ -425,7 +458,9 @@ Marko Mikulicic <mmikulicic@gmail.com>
|
||||
Marko Tibold <marko@tibold.nl>
|
||||
Markus Fix <lispmeister@gmail.com>
|
||||
Martijn van Oosterhout <kleptog@svana.org>
|
||||
Martin Honermeyer <maze@strahlungsfrei.de>
|
||||
Martin Redmond <martin@tinychat.com>
|
||||
Mary Anthony <moxieandmore@gmail.com>
|
||||
Mason Malone <mason.malone@gmail.com>
|
||||
Mateusz Sulima <sulima.mateusz@gmail.com>
|
||||
Mathias Monnerville <mathias@monnerville.com>
|
||||
@@ -435,14 +470,14 @@ Matt Bachmann <bachmann.matt@gmail.com>
|
||||
Matt Haggard <haggardii@gmail.com>
|
||||
Matthew Heon <mheon@redhat.com>
|
||||
Matthew Mueller <mattmuelle@gmail.com>
|
||||
Matthew Riley <mattdr@google.com>
|
||||
Matthias Klumpp <matthias@tenstral.net>
|
||||
Matthias Kühnle <git.nivoc@neverbox.com>
|
||||
mattymo <raytrac3r@gmail.com>
|
||||
mattyw <mattyw@me.com>
|
||||
Maxime Petazzoni <max@signalfuse.com>
|
||||
Maxim Treskin <zerthurd@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>
|
||||
Mengdi Gao <usrgdd@gmail.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 Hudson-Doyle <michael.hudson@linaro.org>
|
||||
Michael Neale <michael.neale@gmail.com>
|
||||
Michaël Pailloncy <mpapo.dev@gmail.com>
|
||||
Michael Prokop <github@michael-prokop.at>
|
||||
Michael Scharf <github@scharf.gr>
|
||||
Michael Stapelberg <michael+gh@stapelberg.de>
|
||||
Michael Steinert <mike.steinert@gmail.com>
|
||||
Michael Thies <michaelthies78@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>
|
||||
Miguel Angel Fernández <elmendalerenda@gmail.com>
|
||||
Mike Chelen <michael.chelen@gmail.com>
|
||||
@@ -471,12 +508,15 @@ Morten Siebuhr <sbhr@sbhr.dk>
|
||||
Mrunal Patel <mrunalp@gmail.com>
|
||||
mschurenko <matt.schurenko@gmail.com>
|
||||
Mustafa Akın <mustafa91@gmail.com>
|
||||
Médi-Rémi Hashim <medimatrix@users.noreply.github.com>
|
||||
Nan Monnand Deng <monnand@gmail.com>
|
||||
Naoki Orii <norii@cs.cmu.edu>
|
||||
Nate Eagleson <nate@nateeag.com>
|
||||
Nate Jones <nate@endot.org>
|
||||
Nathan Hsieh <hsieh.nathan@gmail.com>
|
||||
Nathan Kleyn <nathan@nathankleyn.com>
|
||||
Nathan LeClaire <nathan.leclaire@docker.com>
|
||||
Neal McBurnett <neal@mcburnett.org>
|
||||
Nelson Chen <crazysim@gmail.com>
|
||||
Niall O'Higgins <niallo@unworkable.org>
|
||||
Nicholas E. Rabenau <nerab@gmx.at>
|
||||
@@ -491,18 +531,21 @@ NikolaMandic <mn080202@gmail.com>
|
||||
noducks <onemannoducks@gmail.com>
|
||||
Nolan Darilek <nolan@thewordnerd.info>
|
||||
nzwsch <hi@nzwsch.com>
|
||||
O.S. Tezer <ostezer@gmail.com>
|
||||
OddBloke <daniel@daniel-watkins.co.uk>
|
||||
odk- <github@odkurzacz.org>
|
||||
Oguz Bilgic <fisyonet@gmail.com>
|
||||
Oh Jinkyun <tintypemolly@gmail.com>
|
||||
Ole Reifschneider <mail@ole-reifschneider.de>
|
||||
Olivier Gambier <dmp42@users.noreply.github.com>
|
||||
O.S. Tezer <ostezer@gmail.com>
|
||||
pandrew <letters@paulnotcom.se>
|
||||
panticz <mail@konczalski.de>
|
||||
Pascal Borreli <pascal@borreli.com>
|
||||
Pascal Hartig <phartig@rdrei.net>
|
||||
Patrick Hemmer <patrick.hemmer@gmail.com>
|
||||
Patrick Stapleton <github@gdi2290.com>
|
||||
pattichen <craftsbear@gmail.com>
|
||||
Paul <paul9869@gmail.com>
|
||||
Paul Annesley <paul@annesley.cc>
|
||||
Paul Bowsher <pbowsher@globalpersonals.co.uk>
|
||||
Paul Hammond <paul@paulhammond.org>
|
||||
@@ -510,7 +553,6 @@ Paul Jimenez <pj@place.org>
|
||||
Paul Lietar <paul@lietar.net>
|
||||
Paul Morie <pmorie@gmail.com>
|
||||
Paul Nasrat <pnasrat@gmail.com>
|
||||
Paul <paul9869@gmail.com>
|
||||
Paul Weaver <pauweave@cisco.com>
|
||||
Pavlos Ratis <dastergon@gentoo.org>
|
||||
Peter Bourgon <peter@bourgon.org>
|
||||
@@ -518,16 +560,18 @@ Peter Braden <peterbraden@peterbraden.co.uk>
|
||||
Peter Ericson <pdericson@gmail.com>
|
||||
Peter Salvatore <peter@psftw.com>
|
||||
Peter Waller <p@pwaller.net>
|
||||
Phil <underscorephil@gmail.com>
|
||||
Phil Estes <estesp@linux.vnet.ibm.com>
|
||||
Phil Spitler <pspitler@gmail.com>
|
||||
Philipp Weissensteiner <mail@philippweissensteiner.com>
|
||||
Phillip Alexander <git@phillipalexander.io>
|
||||
Phil Spitler <pspitler@gmail.com>
|
||||
Phil <underscorephil@gmail.com>
|
||||
Piergiuliano Bossi <pgbossi@gmail.com>
|
||||
Pierre-Alain RIVIERE <pariviere@ippon.fr>
|
||||
Pierre <py@poujade.org>
|
||||
Pierre Wacrenier <pierre.wacrenier@gmail.com>
|
||||
Pierre-Alain RIVIERE <pariviere@ippon.fr>
|
||||
Piotr Bogdan <ppbogdan@gmail.com>
|
||||
pixelistik <pixelistik@users.noreply.github.com>
|
||||
Porjo <porjo38@yahoo.com.au>
|
||||
Prasanna Gautam <prasannagautam@gmail.com>
|
||||
Przemek Hejman <przemyslaw.hejman@gmail.com>
|
||||
pysqz <randomq@126.com>
|
||||
@@ -547,6 +591,7 @@ Renato Riccieri Santos Zannon <renato.riccieri@gmail.com>
|
||||
rgstephens <greg@udon.org>
|
||||
Rhys Hiltner <rhys@twitch.tv>
|
||||
Richard Harvey <richard@squarecows.com>
|
||||
Richard Metzler <richard@paadee.com>
|
||||
Richo Healey <richo@psych0tik.net>
|
||||
Rick Bradley <rick@users.noreply.github.com>
|
||||
Rick van de Loo <rickvandeloo@gmail.com>
|
||||
@@ -572,25 +617,26 @@ Ryan Fowler <rwfowler@gmail.com>
|
||||
Ryan O'Donnell <odonnellryanc@gmail.com>
|
||||
Ryan Seto <ryanseto@yak.net>
|
||||
Ryan Thomas <rthomas@atlassian.com>
|
||||
Rémy Greinhofer <remy.greinhofer@livelovely.com>
|
||||
Sam Alba <sam.alba@gmail.com>
|
||||
Sam Bailey <cyprix@cyprix.com.au>
|
||||
Sam J Sharpe <sam.sharpe@digital.cabinet-office.gov.uk>
|
||||
Sam Reis <sreis@atlassian.com>
|
||||
Sam Rijs <srijs@airpost.net>
|
||||
Sami Wagiaalla <swagiaal@redhat.com>
|
||||
Samuel Andaya <samuel@andaya.net>
|
||||
Samuel PHAN <samuel-phan@users.noreply.github.com>
|
||||
Satnam Singh <satnam@raintown.org>
|
||||
satoru <satorulogic@gmail.com>
|
||||
Satoshi Amemiya <satoshi_amemiya@voyagegroup.com>
|
||||
Scott Bessler <scottbessler@gmail.com>
|
||||
Scott Collier <emailscottcollier@gmail.com>
|
||||
Scott Johnston <scott@docker.com>
|
||||
Scott Stamp <scottstamp851@gmail.com>
|
||||
Scott Walls <sawalls@umich.edu>
|
||||
Sean Cronin <seancron@gmail.com>
|
||||
Sean P. Kane <skane@newrelic.com>
|
||||
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>
|
||||
SeongJae Park <sj38.park@gmail.com>
|
||||
Shane Canon <scanon@lbl.gov>
|
||||
@@ -598,12 +644,12 @@ shaunol <shaunol@gmail.com>
|
||||
Shawn Landden <shawn@churchofgit.com>
|
||||
Shawn Siefkas <shawn.siefkas@meredith.com>
|
||||
Shih-Yuan Lee <fourdollars@gmail.com>
|
||||
Shishir Mahajan <shishir.mahajan@redhat.com>
|
||||
shuai-z <zs.broccoli@gmail.com>
|
||||
Silas Sewell <silas@sewell.org>
|
||||
Simon Taranto <simon.taranto@gmail.com>
|
||||
Sindhu S <sindhus@live.in>
|
||||
Sjoerd Langkemper <sjoerd-github@linuxonly.nl>
|
||||
s-ko <aleks@s-ko.net>
|
||||
Solomon Hykes <solomon@docker.com>
|
||||
Song Gao <song@gao.io>
|
||||
Soulou <leo@unbekandt.eu>
|
||||
@@ -611,18 +657,23 @@ soulshake <amy@gandi.net>
|
||||
Sridatta Thatipamala <sthatipamala@gmail.com>
|
||||
Sridhar Ratnakumar <sridharr@activestate.com>
|
||||
Srini Brahmaroutu <sbrahma@us.ibm.com>
|
||||
Srini Brahmaroutu <srbrahma@us.ibm.com>
|
||||
Steeve Morin <steeve.morin@gmail.com>
|
||||
Stefan Praszalowicz <stefan@greplin.com>
|
||||
Stephen Crosby <stevecrozz@gmail.com>
|
||||
Steven Burgess <steven.a.burgess@hotmail.com>
|
||||
Steven Merrill <steven.merrill@gmail.com>
|
||||
sudosurootdev <sudosurootdev@gmail.com>
|
||||
Sven Dowideit <SvenDowideit@home.org.au>
|
||||
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>
|
||||
Tatsuki Sugiura <sugi@nemui.org>
|
||||
Tatsushi Inagaki <e29253@jp.ibm.com>
|
||||
Ted M. Young <tedyoung@gmail.com>
|
||||
Tehmasp Chaudhri <tehmasp@gmail.com>
|
||||
Tejesh Mehta <tejesh.mehta@gmail.com>
|
||||
Thatcher Peskens <thatcher@docker.com>
|
||||
Thermionix <bond711@gmail.com>
|
||||
Thijs Terlouw <thijsterlouw@gmail.com>
|
||||
@@ -636,11 +687,10 @@ Tianon Gravi <admwiggin@gmail.com>
|
||||
Tibor Vass <teabee89@gmail.com>
|
||||
Tim Bosse <taim@bosboot.org>
|
||||
Tim Hockin <thockin@google.com>
|
||||
Timothy Hobbs <timothyhobbs@seznam.cz>
|
||||
Tim Ruffles <oi@truffles.me.uk>
|
||||
Tim Smith <timbot@google.com>
|
||||
Tim Terhorst <mynamewastaken+git@gmail.com>
|
||||
tjmehta <tj@init.me>
|
||||
Timothy Hobbs <timothyhobbs@seznam.cz>
|
||||
tjwebb123 <tjwebb123@users.noreply.github.com>
|
||||
tobe <tobegit3hub@gmail.com>
|
||||
Tobias Bieniek <Tobias.Bieniek@gmx.de>
|
||||
@@ -648,10 +698,12 @@ Tobias Gesellchen <tobias@gesellix.de>
|
||||
Tobias Schmidt <ts@soundcloud.com>
|
||||
Tobias Schwab <tobias.schwab@dynport.de>
|
||||
Todd Lunter <tlunter@gmail.com>
|
||||
Tomasz Lipinski <tlipinski@users.noreply.github.com>
|
||||
Tom Fotherby <tom+github@peopleperhour.com>
|
||||
Tom Hulihan <hulihan.tom159@gmail.com>
|
||||
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>
|
||||
Tonis Tiigi <tonistiigi@gmail.com>
|
||||
Tony Daws <tony@daws.ca>
|
||||
@@ -662,7 +714,8 @@ Trent Ogren <tedwardo2@gmail.com>
|
||||
Tyler Brock <tyler.brock@gmail.com>
|
||||
Tzu-Jung Lee <roylee17@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>
|
||||
Victor Coisne <victor.coisne@dotcloud.com>
|
||||
Victor Lyuboslavsky <victor@victoreda.com>
|
||||
@@ -691,15 +744,15 @@ Walter Leibbrandt <github@wrl.co.za>
|
||||
Walter Stanish <walter@pratyeka.org>
|
||||
Ward Vandewege <ward@jhvc.com>
|
||||
WarheadsSE <max@warheads.net>
|
||||
Wayne Chang <wayne@neverfear.org>
|
||||
Wes Morgan <cap10morgan@gmail.com>
|
||||
Will Dietz <w@wdtz.org>
|
||||
Will Rouesnel <w.rouesnel@gmail.com>
|
||||
Will Weaver <monkey@buildingbananas.com>
|
||||
William Delanoue <william.delanoue@gmail.com>
|
||||
William Henry <whenry@redhat.com>
|
||||
William Riancho <wr.wllm@gmail.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>
|
||||
xuzhaokui <cynicholas@gmail.com>
|
||||
Yang Bai <hamo.by@gmail.com>
|
||||
@@ -715,4 +768,6 @@ Zilin Du <zilin.du@gmail.com>
|
||||
zimbatm <zimbatm@zimbatm.com>
|
||||
Zoltan Tombol <zoltan.tombol@gmail.com>
|
||||
zqh <zqhxuyuan@gmail.com>
|
||||
Álex González <agonzalezro@gmail.com>
|
||||
Álvaro Lázaro <alvaro.lazaro.g@gmail.com>
|
||||
尹吉峰 <jifeng.yin@gmail.com>
|
||||
|
||||
@@ -1,5 +1,44 @@
|
||||
# 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 container’s root filesystem mounted as readonly, which can be used in combination with volumes to force a container’s 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)
|
||||
|
||||
#### Runtime
|
||||
|
||||
+1
-1
@@ -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
|
||||
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
|
||||
|
||||
|
||||
+9
-3
@@ -84,8 +84,10 @@ RUN cd /usr/local/go/src && ./make.bash --no-clean 2>&1
|
||||
ENV DOCKER_CROSSPLATFORMS \
|
||||
linux/386 linux/arm \
|
||||
darwin/amd64 darwin/386 \
|
||||
freebsd/amd64 freebsd/386 freebsd/arm \
|
||||
windows/amd64 windows/386
|
||||
freebsd/amd64 freebsd/386 freebsd/arm
|
||||
|
||||
# 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)
|
||||
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/ because go-md2man needs golang.org/x/net)
|
||||
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 \
|
||||
&& 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
|
||||
ENTRYPOINT ["hack/dind"]
|
||||
|
||||
|
||||
+590
-9
@@ -1,9 +1,590 @@
|
||||
Solomon Hykes <solomon@docker.com> (@shykes)
|
||||
Victor Vieux <vieux@docker.com> (@vieux)
|
||||
Michael Crosby <michael@crosbymichael.com> (@crosbymichael)
|
||||
.mailmap: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
.travis.yml: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
AUTHORS: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
Dockerfile: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
Makefile: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
.dockerignore: Tianon Gravi <admwiggin@gmail.com> (@tianon)
|
||||
# Docker maintainers file
|
||||
#
|
||||
# This file describes who runs the Docker project and how.
|
||||
# This is a living document - if you see something out of date or missing,
|
||||
# speak up!
|
||||
#
|
||||
# It is structured to be consumable by both humans and programs.
|
||||
# To extract its contents programmatically, use any TOML-compliant
|
||||
# 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"
|
||||
|
||||
@@ -74,7 +74,7 @@ test-docker-py: build
|
||||
$(DOCKER_RUN_DOCKER) hack/make.sh binary test-docker-py
|
||||
|
||||
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
|
||||
$(DOCKER_RUN_DOCKER) bash
|
||||
|
||||
@@ -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
|
||||
[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
|
||||
|
||||
*Brought to you courtesy of our legal counsel. For more context,
|
||||
|
||||
+3
-4
@@ -17,7 +17,6 @@ import (
|
||||
flag "github.com/docker/docker/pkg/mflag"
|
||||
"github.com/docker/docker/pkg/term"
|
||||
"github.com/docker/docker/registry"
|
||||
"github.com/docker/libtrust"
|
||||
)
|
||||
|
||||
type DockerCli struct {
|
||||
@@ -27,7 +26,7 @@ type DockerCli struct {
|
||||
in io.ReadCloser
|
||||
out io.Writer
|
||||
err io.Writer
|
||||
key libtrust.PrivateKey
|
||||
keyFile string
|
||||
tlsConfig *tls.Config
|
||||
scheme string
|
||||
// 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
|
||||
}
|
||||
|
||||
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 (
|
||||
inFd uintptr
|
||||
outFd uintptr
|
||||
@@ -177,7 +176,7 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, key libtrust.PrivateKey,
|
||||
in: in,
|
||||
out: out,
|
||||
err: err,
|
||||
key: key,
|
||||
keyFile: keyFile,
|
||||
inFd: inFd,
|
||||
outFd: outFd,
|
||||
isTerminalIn: isTerminalIn,
|
||||
|
||||
+60
-58
@@ -39,6 +39,7 @@ import (
|
||||
"github.com/docker/docker/pkg/parsers/filters"
|
||||
"github.com/docker/docker/pkg/promise"
|
||||
"github.com/docker/docker/pkg/signal"
|
||||
"github.com/docker/docker/pkg/symlink"
|
||||
"github.com/docker/docker/pkg/term"
|
||||
"github.com/docker/docker/pkg/timeutils"
|
||||
"github.com/docker/docker/pkg/units"
|
||||
@@ -46,7 +47,6 @@ import (
|
||||
"github.com/docker/docker/registry"
|
||||
"github.com/docker/docker/runconfig"
|
||||
"github.com/docker/docker/utils"
|
||||
"github.com/docker/libtrust"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -148,36 +148,36 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
var filename string // path to Dockerfile
|
||||
var origDockerfile string // used for error msg
|
||||
filename := *dockerfileName // path to Dockerfile
|
||||
|
||||
if *dockerfileName == "" {
|
||||
// No -f/--file was specified so use the default
|
||||
origDockerfile = api.DefaultDockerfileName
|
||||
*dockerfileName = origDockerfile
|
||||
*dockerfileName = api.DefaultDockerfileName
|
||||
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) {
|
||||
return fmt.Errorf("Can not locate Dockerfile: %s", origDockerfile)
|
||||
origDockerfile := *dockerfileName // used for error msg
|
||||
|
||||
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"))
|
||||
if err != nil {
|
||||
@@ -1216,25 +1216,6 @@ func (cli *DockerCli) CmdPush(args ...string) error {
|
||||
v := url.Values{}
|
||||
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 {
|
||||
buf, err := json.Marshal(authConfig)
|
||||
if err != nil {
|
||||
@@ -1244,7 +1225,7 @@ func (cli *DockerCli) CmdPush(args ...string) error {
|
||||
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,
|
||||
})
|
||||
}
|
||||
@@ -2634,7 +2615,12 @@ type containerStats struct {
|
||||
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()
|
||||
var (
|
||||
previousCpu uint64
|
||||
@@ -2714,28 +2700,44 @@ func (cli *DockerCli) CmdStats(args ...string) error {
|
||||
|
||||
names := cmd.Args()
|
||||
sort.Strings(names)
|
||||
var cStats []*containerStats
|
||||
for _, n := range names {
|
||||
s := &containerStats{Name: n}
|
||||
cStats = append(cStats, s)
|
||||
stream, _, err := cli.call("GET", "/containers/"+n+"/stats", nil, false)
|
||||
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) {
|
||||
var (
|
||||
cStats []*containerStats
|
||||
w = tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
|
||||
)
|
||||
printHeader := func() {
|
||||
fmt.Fprint(cli.out, "\033[2J")
|
||||
fmt.Fprint(cli.out, "\033[H")
|
||||
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{}
|
||||
for i, s := range cStats {
|
||||
if err := s.Display(w); err != nil {
|
||||
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:]...)
|
||||
}
|
||||
if len(cStats) == 0 {
|
||||
|
||||
@@ -72,6 +72,15 @@ func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Con
|
||||
if err != nil {
|
||||
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, ":")
|
||||
if colonPos == -1 {
|
||||
@@ -140,6 +149,15 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
|
||||
req.Host = cli.addr
|
||||
|
||||
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 strings.Contains(err.Error(), "connection refused") {
|
||||
return fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker -d' running on this host?")
|
||||
|
||||
+3
-3
@@ -4,7 +4,7 @@ import (
|
||||
"fmt"
|
||||
"mime"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
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,
|
||||
// otherwise generates a new one
|
||||
func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) {
|
||||
err := os.MkdirAll(path.Dir(trustKeyPath), 0700)
|
||||
err := os.MkdirAll(filepath.Dir(trustKeyPath), 0700)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -69,7 +69,7 @@ func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) {
|
||||
return nil, fmt.Errorf("Error saving key file: %s", err)
|
||||
}
|
||||
} 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
|
||||
}
|
||||
|
||||
@@ -621,18 +621,6 @@ func getImagesSearch(eng *engine.Engine, version version.Version, w http.Respons
|
||||
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 {
|
||||
if vars == nil {
|
||||
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.SetenvJson("metaHeaders", metaHeaders)
|
||||
job.SetenvJson("authConfig", authConfig)
|
||||
job.Setenv("manifest", string(manifest))
|
||||
job.Setenv("tag", r.Form.Get("tag"))
|
||||
if version.GreaterThan("1.0") {
|
||||
job.SetenvBool("json", true)
|
||||
@@ -1325,7 +1307,6 @@ func createRouter(eng *engine.Engine, logging, enableCors bool, dockerVersion st
|
||||
"/images/viz": getImagesViz,
|
||||
"/images/search": getImagesSearch,
|
||||
"/images/get": getImagesGet,
|
||||
"/images/{name:.*}/manifest": getImageManifest,
|
||||
"/images/{name:.*}/get": getImagesGet,
|
||||
"/images/{name:.*}/history": getImagesHistory,
|
||||
"/images/{name:.*}/json": getImagesByName,
|
||||
|
||||
+21
-21
@@ -6,21 +6,21 @@ import "time"
|
||||
|
||||
type ThrottlingData struct {
|
||||
// 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.
|
||||
ThrottledPeriods uint64 `json:"throttled_periods,omitempty"`
|
||||
ThrottledPeriods uint64 `json:"throttled_periods"`
|
||||
// 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.
|
||||
type CpuUsage struct {
|
||||
// Total CPU time consumed.
|
||||
// Units: nanoseconds.
|
||||
TotalUsage uint64 `json:"total_usage,omitempty"`
|
||||
TotalUsage uint64 `json:"total_usage"`
|
||||
// Total CPU time consumed per core.
|
||||
// Units: nanoseconds.
|
||||
PercpuUsage []uint64 `json:"percpu_usage,omitempty"`
|
||||
PercpuUsage []uint64 `json:"percpu_usage"`
|
||||
// Time spent by tasks of the cgroup in kernel mode.
|
||||
// Units: nanoseconds.
|
||||
UsageInKernelmode uint64 `json:"usage_in_kernelmode"`
|
||||
@@ -30,41 +30,41 @@ type CpuUsage struct {
|
||||
}
|
||||
|
||||
type CpuStats struct {
|
||||
CpuUsage CpuUsage `json:"cpu_usage,omitempty"`
|
||||
CpuUsage CpuUsage `json:"cpu_usage"`
|
||||
SystemUsage uint64 `json:"system_cpu_usage"`
|
||||
ThrottlingData ThrottlingData `json:"throttling_data,omitempty"`
|
||||
}
|
||||
|
||||
type MemoryStats struct {
|
||||
// current res_counter usage for memory
|
||||
Usage uint64 `json:"usage,omitempty"`
|
||||
Usage uint64 `json:"usage"`
|
||||
// maximum usage ever recorded.
|
||||
MaxUsage uint64 `json:"max_usage,omitempty"`
|
||||
MaxUsage uint64 `json:"max_usage"`
|
||||
// TODO(vishh): Export these as stronger types.
|
||||
// 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.
|
||||
Failcnt uint64 `json:"failcnt"`
|
||||
Limit uint64 `json:"limit"`
|
||||
}
|
||||
|
||||
type BlkioStatEntry struct {
|
||||
Major uint64 `json:"major,omitempty"`
|
||||
Minor uint64 `json:"minor,omitempty"`
|
||||
Op string `json:"op,omitempty"`
|
||||
Value uint64 `json:"value,omitempty"`
|
||||
Major uint64 `json:"major"`
|
||||
Minor uint64 `json:"minor"`
|
||||
Op string `json:"op"`
|
||||
Value uint64 `json:"value"`
|
||||
}
|
||||
|
||||
type BlkioStats struct {
|
||||
// number of bytes tranferred to and from the block device
|
||||
IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive,omitempty"`
|
||||
IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive,omitempty"`
|
||||
IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive,omitempty"`
|
||||
IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive,omitempty"`
|
||||
IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive,omitempty"`
|
||||
IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive,omitempty"`
|
||||
IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive,omitempty"`
|
||||
SectorsRecursive []BlkioStatEntry `json:"sectors_recursive,omitempty"`
|
||||
IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"`
|
||||
IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"`
|
||||
IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"`
|
||||
IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"`
|
||||
IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"`
|
||||
IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"`
|
||||
IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"`
|
||||
SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"`
|
||||
}
|
||||
|
||||
type Network struct {
|
||||
|
||||
+12
-8
@@ -24,7 +24,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
@@ -32,6 +32,7 @@ import (
|
||||
"github.com/docker/docker/daemon"
|
||||
"github.com/docker/docker/engine"
|
||||
"github.com/docker/docker/pkg/fileutils"
|
||||
"github.com/docker/docker/pkg/symlink"
|
||||
"github.com/docker/docker/pkg/tarsum"
|
||||
"github.com/docker/docker/registry"
|
||||
"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
|
||||
// 'filename' is a relative path from the root of the context
|
||||
func (b *Builder) readDockerfile(filename string) error {
|
||||
filename = path.Join(b.contextPath, filename)
|
||||
func (b *Builder) readDockerfile(origFile string) error {
|
||||
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) {
|
||||
return fmt.Errorf("Cannot build a directory without a Dockerfile")
|
||||
return fmt.Errorf("Cannot locate specified Dockerfile: %s", origFile)
|
||||
}
|
||||
if fi.Size() == 0 {
|
||||
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
|
||||
// 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 {
|
||||
os.Remove(path.Join(b.contextPath, ".dockerignore"))
|
||||
os.Remove(filepath.Join(b.contextPath, ".dockerignore"))
|
||||
b.context.(tarsum.BuilderContext).Remove(".dockerignore")
|
||||
}
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
imagepkg "github.com/docker/docker/image"
|
||||
"github.com/docker/docker/pkg/archive"
|
||||
"github.com/docker/docker/pkg/chrootarchive"
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
"github.com/docker/docker/pkg/parsers"
|
||||
"github.com/docker/docker/pkg/symlink"
|
||||
"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("parallel", true)
|
||||
job.SetenvJson("authConfig", pullRegistryAuth)
|
||||
job.Stdout.Add(b.OutOld)
|
||||
job.Stdout.Add(ioutils.NopWriteCloser(b.OutOld))
|
||||
if err := job.Run(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -104,6 +104,22 @@ __docker_pos_first_nonflag() {
|
||||
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() {
|
||||
command -v host >/dev/null 2>&1 || return
|
||||
COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
|
||||
@@ -154,15 +170,47 @@ __docker_capabilities() {
|
||||
}
|
||||
|
||||
_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
|
||||
-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
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$cur" in
|
||||
-*)
|
||||
COMPREPLY=( $( compgen -W "-H" -- "$cur" ) )
|
||||
COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
|
||||
@@ -561,6 +609,8 @@ _docker_run() {
|
||||
--sig-proxy
|
||||
"
|
||||
|
||||
local options_with_args_glob=$(__docker_to_extglob "$options_with_args")
|
||||
|
||||
case "$prev" in
|
||||
--add-host)
|
||||
case "$cur" in
|
||||
@@ -677,7 +727,7 @@ _docker_run() {
|
||||
__docker_containers_all
|
||||
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
|
||||
;;
|
||||
esac
|
||||
@@ -687,7 +737,7 @@ _docker_run() {
|
||||
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
|
||||
__docker_image_repos_and_tags_and_ids
|
||||
@@ -739,6 +789,10 @@ _docker_start() {
|
||||
esac
|
||||
}
|
||||
|
||||
_docker_stats() {
|
||||
__docker_containers_running
|
||||
}
|
||||
|
||||
_docker_stop() {
|
||||
case "$prev" in
|
||||
--time|-t)
|
||||
@@ -801,6 +855,9 @@ _docker_wait() {
|
||||
}
|
||||
|
||||
_docker() {
|
||||
local previous_extglob_setting=$(shopt -p extglob)
|
||||
shopt -s extglob
|
||||
|
||||
local commands=(
|
||||
attach
|
||||
build
|
||||
@@ -833,6 +890,7 @@ _docker() {
|
||||
save
|
||||
search
|
||||
start
|
||||
stats
|
||||
stop
|
||||
tag
|
||||
top
|
||||
@@ -841,6 +899,33 @@ _docker() {
|
||||
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=()
|
||||
local cur prev words cword
|
||||
_get_comp_words_by_ref -n : cur prev words cword
|
||||
@@ -849,7 +934,7 @@ _docker() {
|
||||
local counter=1
|
||||
while [ $counter -lt $cword ]; do
|
||||
case "${words[$counter]}" in
|
||||
-H)
|
||||
$main_options_with_args_glob )
|
||||
(( counter++ ))
|
||||
;;
|
||||
-*)
|
||||
@@ -867,6 +952,7 @@ _docker() {
|
||||
local completions_func=_docker_${command}
|
||||
declare -F $completions_func >/dev/null && $completions_func
|
||||
|
||||
eval "$previous_extglob_setting"
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
@@ -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-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' -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 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' -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 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 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' -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' -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 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 tlscert -d 'Path to TLS certificate 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
|
||||
# attach
|
||||
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 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"
|
||||
|
||||
# build
|
||||
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 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 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' -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'
|
||||
@@ -92,12 +101,14 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from build' -s t -l tag -d '
|
||||
# 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 -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 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"
|
||||
|
||||
# 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 -A -f -n '__fish_seen_subcommand_from cp' -l help -d 'Print usage'
|
||||
|
||||
# create
|
||||
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 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 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-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' -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 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' -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' -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' -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 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 -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 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 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'
|
||||
@@ -136,26 +153,32 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from create' -a '(__fish_pri
|
||||
|
||||
# diff
|
||||
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"
|
||||
|
||||
# events
|
||||
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 until -d 'Stream events until this timestamp'
|
||||
|
||||
# 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' -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 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"
|
||||
|
||||
# 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 -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"
|
||||
|
||||
# history
|
||||
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' -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"
|
||||
@@ -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 -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' -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' -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"
|
||||
|
||||
# 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 -A -f -n '__fish_seen_subcommand_from import' -l help -d 'Print usage'
|
||||
|
||||
# info
|
||||
complete -c docker -f -n '__fish_docker_no_subcommand' -a info -d 'Display system-wide information'
|
||||
|
||||
# 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' -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_containers all)' -d "Container"
|
||||
|
||||
# kill
|
||||
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' -a '(__fish_print_docker_containers running)' -d "Container"
|
||||
|
||||
# load
|
||||
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'
|
||||
|
||||
# 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 -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 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
|
||||
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' -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' -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"
|
||||
|
||||
# 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"
|
||||
|
||||
# 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' -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' -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 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' -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.'
|
||||
|
||||
# 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 -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_repositories)' -d "Repository"
|
||||
|
||||
# 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 -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_repositories)' -d "Repository"
|
||||
|
||||
# rename
|
||||
complete -c docker -f -n '__fish_docker_no_subcommand' -a rename -d 'Rename an existing container'
|
||||
|
||||
# restart
|
||||
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' -a '(__fish_print_docker_containers running)' -d "Container"
|
||||
|
||||
# rm
|
||||
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' -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 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"
|
||||
@@ -251,6 +290,7 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from rm' -a '(__fish_print_d
|
||||
# rmi
|
||||
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' -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' -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 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' -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-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' -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 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' -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' -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' -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 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 -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 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 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 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 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)'
|
||||
@@ -294,32 +340,43 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from run' -a '(__fish_print_
|
||||
|
||||
# save
|
||||
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"
|
||||
|
||||
# search
|
||||
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 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' -s s -l stars -d 'Only displays with at least x stars'
|
||||
|
||||
# start
|
||||
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' -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' -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
|
||||
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' -a '(__fish_print_docker_containers running)' -d "Container"
|
||||
|
||||
# tag
|
||||
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' -l help -d 'Print usage'
|
||||
|
||||
# top
|
||||
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"
|
||||
|
||||
# unpause
|
||||
@@ -331,6 +388,7 @@ complete -c docker -f -n '__fish_docker_no_subcommand' -a version -d 'Show the D
|
||||
|
||||
# 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 -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"
|
||||
|
||||
|
||||
|
||||
+2
-6
@@ -820,7 +820,7 @@ func NewDaemonFromDirectory(config *Config, eng *engine.Engine) (*Daemon, error)
|
||||
if os.Geteuid() != 0 {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1205,11 +1205,7 @@ func (daemon *Daemon) ImageGetCached(imgID string, config *runconfig.Config) (*i
|
||||
return match, nil
|
||||
}
|
||||
|
||||
func checkKernelAndArch() 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)
|
||||
}
|
||||
func checkKernel() error {
|
||||
// Check for unsupported kernel versions
|
||||
// FIXME: it would be cleaner to not test for specific versions, but rather
|
||||
// test for specific functionalities.
|
||||
|
||||
@@ -75,8 +75,8 @@ lxc.aa_profile = unconfined
|
||||
# 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
|
||||
lxc.mount.auto = proc sys
|
||||
{{if .AppArmor}}
|
||||
lxc.aa_profile = .AppArmorProfile
|
||||
{{if .AppArmorProfile}}
|
||||
lxc.aa_profile = {{.AppArmorProfile}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
|
||||
@@ -248,7 +248,8 @@ func TestCustomLxcConfigMisc(t *testing.T) {
|
||||
}
|
||||
defer os.RemoveAll(root)
|
||||
os.MkdirAll(path.Join(root, "containers", "1"), 0777)
|
||||
driver, err := NewDriver(root, "", false)
|
||||
driver, err := NewDriver(root, "", true)
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -271,9 +272,10 @@ func TestCustomLxcConfigMisc(t *testing.T) {
|
||||
Bridge: "docker0",
|
||||
},
|
||||
},
|
||||
ProcessConfig: processConfig,
|
||||
CapAdd: []string{"net_admin", "syslog"},
|
||||
CapDrop: []string{"kill", "mknod"},
|
||||
ProcessConfig: processConfig,
|
||||
CapAdd: []string{"net_admin", "syslog"},
|
||||
CapDrop: []string{"kill", "mknod"},
|
||||
AppArmorProfile: "lxc-container-default-with-nesting",
|
||||
}
|
||||
|
||||
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.gateway = 10.10.10.1")
|
||||
grepFile(t, p, "lxc.network.flags = up")
|
||||
|
||||
grepFile(t, p, "lxc.aa_profile = lxc-container-default-with-nesting")
|
||||
// hostname
|
||||
grepFile(t, p, "lxc.utsname = testhost")
|
||||
grepFile(t, p, "lxc.cgroup.cpuset.cpus = 0,1")
|
||||
|
||||
@@ -201,7 +201,7 @@ Here is the list of supported options:
|
||||
|
||||
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 res-parsify the loopback file
|
||||
loopback devices and is required to resparsify the loopback file
|
||||
on image/container removal.
|
||||
|
||||
Disabling this on loopback can lead to *much* faster container
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -173,7 +188,6 @@ func InitDriver(job *engine.Job) engine.Status {
|
||||
|
||||
networkv4 = addrv4.(*net.IPNet)
|
||||
|
||||
log.Infof("enableIPv6 = %t", enableIPv6)
|
||||
if enableIPv6 {
|
||||
if len(addrsv6) == 0 {
|
||||
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
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
if enableIPv6 {
|
||||
// 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: %s\n", err)
|
||||
}
|
||||
|
||||
ipAddr6, ipNet6, err := net.ParseCIDR(bridgeIPv6)
|
||||
if err != nil {
|
||||
log.Errorf("BridgeIPv6 parsing failed")
|
||||
if err := setupIPv6Bridge(bridgeIPv6); err != nil {
|
||||
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 {
|
||||
@@ -424,6 +426,30 @@ func configureBridge(bridgeIP string, bridgeIPv6 string, enableIPv6 bool) error
|
||||
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 {
|
||||
kv, err := kernel.GetKernelVersion()
|
||||
// only set the bridge's mac address if the kernel version is > 3.3
|
||||
|
||||
@@ -74,7 +74,7 @@ func NetworkRange(network *net.IPNet) (net.IP, net.IP) {
|
||||
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) {
|
||||
iface, err := net.InterfaceByName(name)
|
||||
if err != nil {
|
||||
|
||||
+2
-7
@@ -79,11 +79,6 @@ func main() {
|
||||
}
|
||||
protoAddrParts := strings.SplitN(flHosts[0], "://", 2)
|
||||
|
||||
trustKey, err := api.LoadOrCreateTrustKey(*flTrustKey)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
var (
|
||||
cli *client.DockerCli
|
||||
tlsConfig tls.Config
|
||||
@@ -125,9 +120,9 @@ func main() {
|
||||
}
|
||||
|
||||
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 {
|
||||
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 {
|
||||
|
||||
+1
-1
@@ -97,7 +97,7 @@ func init() {
|
||||
{"images", "List images"},
|
||||
{"import", "Create a new filesystem image from the contents of a tarball"},
|
||||
{"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"},
|
||||
{"load", "Load an image from a tar archive"},
|
||||
{"login", "Register or log in to a Docker registry server"},
|
||||
|
||||
+12
-12
@@ -64,23 +64,23 @@ CMD ["mkdocs", "serve"]
|
||||
# Sven plans to move each Dockerfile into the respective repository
|
||||
|
||||
# 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/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/api/README.md /docs/sources/swarm/API.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/userguide.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/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/strategy/README.md /docs/sources/swarm/scheduler/strategy.md
|
||||
|
||||
# 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
|
||||
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/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/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/cli.md /docs/sources/compose/cli.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
|
||||
RUN cd /docs && ./build.sh
|
||||
# RUN cd /docs && ./build.sh
|
||||
|
||||
# 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
@@ -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.
|
||||
|
||||
[profile dowideit-docs] aws_access_key_id = IHOIUAHSIDH234rwf....
|
||||
aws_secret_access_key = OIUYSADJHLKUHQWIUHE...... region = ap-southeast-2
|
||||
[profile dowideit-docs]
|
||||
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
|
||||
to - which you call from the `docker` directory:
|
||||
|
||||
@@ -138,7 +138,7 @@ or
|
||||
whitespace.
|
||||
The ADD instruction copies new files, directories
|
||||
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
|
||||
(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.
|
||||
@@ -195,7 +195,7 @@ or
|
||||
|
||||
**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:
|
||||
**WORKDIR /a WORKDIR b WORKDIR c RUN pwd**
|
||||
In the above example, the output of the **pwd** command is **a/b/c**.
|
||||
|
||||
@@ -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
|
||||
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
|
||||
|
||||
The recommended approach for generating the man pages is via a Docker
|
||||
|
||||
@@ -12,17 +12,19 @@ docker-attach - Attach to a running container
|
||||
CONTAINER
|
||||
|
||||
# DESCRIPTION
|
||||
If you **docker run** a container in detached mode (**-d**), you can reattach to
|
||||
the detached container with **docker attach** using the container's ID or name.
|
||||
The **docker attach** command allows you to attach to a running container using
|
||||
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
|
||||
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 a container the exit code will be returned to
|
||||
the client.
|
||||
You can detach from the container (and leave it running) with `CTRL-p CTRL-q`
|
||||
(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.
|
||||
|
||||
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`).
|
||||
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`).
|
||||
|
||||
# OPTIONS
|
||||
**--help**
|
||||
|
||||
@@ -59,7 +59,7 @@ as context.
|
||||
|
||||
# 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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
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 .
|
||||
|
||||
|
||||
+13
-13
@@ -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):
|
||||
|
||||
# docker events
|
||||
[2014-04-12 18:23:04 -0400 EDT] 786d69800457: (from whenry/testimage:latest) start
|
||||
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) die
|
||||
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) stop
|
||||
2015-01-28T20:21:31.000000000-08:00 59211849bc10: (from whenry/testimage:latest) start
|
||||
2015-01-28T20:21:31.000000000-08:00 59211849bc10: (from whenry/testimage:latest) die
|
||||
2015-01-28T20:21:32.000000000-08:00 59211849bc10: (from whenry/testimage:latest) stop
|
||||
|
||||
## Listening for events since a given date
|
||||
Again the output container IDs have been shortened for the purposes of this document:
|
||||
|
||||
# docker events --since '2014-04-12'
|
||||
[2014-04-12 18:11:28 -0400 EDT] c655dbf640dc: (from whenry/testimage:latest) create
|
||||
[2014-04-12 18:11:28 -0400 EDT] c655dbf640dc: (from whenry/testimage:latest) start
|
||||
[2014-04-12 18:14:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) create
|
||||
[2014-04-12 18:14:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) start
|
||||
[2014-04-12 18:22:44 -0400 EDT] 786d69800457: (from whenry/testimage:latest) die
|
||||
[2014-04-12 18:22:44 -0400 EDT] 786d69800457: (from whenry/testimage:latest) stop
|
||||
[2014-04-12 18:23:04 -0400 EDT] 786d69800457: (from whenry/testimage:latest) start
|
||||
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) die
|
||||
[2014-04-12 18:23:13 -0400 EDT] 786d69800457: (from whenry/testimage:latest) stop
|
||||
# docker events --since '2015-01-28'
|
||||
2015-01-28T20:25:38.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) create
|
||||
2015-01-28T20:25:38.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start
|
||||
2015-01-28T20:25:39.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) create
|
||||
2015-01-28T20:25:39.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start
|
||||
2015-01-28T20:25:40.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) die
|
||||
2015-01-28T20:25:42.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) stop
|
||||
2015-01-28T20:25:45.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) start
|
||||
2015-01-28T20:25:45.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) die
|
||||
2015-01-28T20:25:46.000000000-08:00 c21f6c22ba27: (from whenry/testimage:latest) stop
|
||||
|
||||
# HISTORY
|
||||
April 2014, Originally compiled by William Henry (whenry at redhat dot com)
|
||||
|
||||
@@ -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
|
||||
|
||||
Note: this functionality currently only works when using the *libcontainer* exec-driver.
|
||||
|
||||
# OPTIONS
|
||||
**--help**
|
||||
Print usage statement
|
||||
|
||||
@@ -144,7 +144,7 @@ unix://[/path/to/socket] to use.
|
||||
Display system-wide information
|
||||
|
||||
**docker-inspect(1)**
|
||||
Return low-level information on a container
|
||||
Return low-level information on a container or image
|
||||
|
||||
**docker-kill(1)**
|
||||
Kill a running container (which includes the wrapper process and everything
|
||||
@@ -277,7 +277,7 @@ is 64K.
|
||||
#### dm.blkdiscard
|
||||
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
|
||||
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,
|
||||
but will prevent the space used in `/var/lib/docker` directory from being returned to
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
- ['swarm/README.md', 'User Guide', 'Docker Swarm' ]
|
||||
- ['swarm/discovery.md', 'Reference', 'Swarm discovery']
|
||||
- ['swarm/API.md', 'Reference', 'Swarm API']
|
||||
- ['swarm/filters.md', 'Reference', 'Swarm filters']
|
||||
- ['swarm/scheduler/filter.md', 'Reference', 'Swarm filters']
|
||||
|
||||
+11
-5
@@ -69,6 +69,11 @@ pages:
|
||||
- ['docker-hub/builds.md', 'Docker Hub', 'Automated Builds']
|
||||
- ['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/index.md', '**HIDDEN**']
|
||||
- ['examples/nodejs_web_app.md', 'Examples', 'Dockerizing a Node.js web application']
|
||||
@@ -86,6 +91,7 @@ pages:
|
||||
- ['articles/networking.md', 'Articles', 'Advanced networking']
|
||||
- ['articles/security.md', 'Articles', 'Security']
|
||||
- ['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/baseimages.md', 'Articles', 'Creating a base image']
|
||||
- ['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_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.15.md', 'Reference', 'Docker Remote API v1.15']
|
||||
- ['reference/api/docker_remote_api_v1.14.md', 'Reference', 'Docker Remote API v1.14']
|
||||
- ['reference/api/docker_remote_api_v1.13.md', 'Reference', 'Docker Remote API v1.13']
|
||||
- ['reference/api/docker_remote_api_v1.12.md', 'Reference', 'Docker Remote API v1.12']
|
||||
- ['reference/api/docker_remote_api_v1.11.md', 'Reference', 'Docker Remote API v1.11']
|
||||
- ['reference/api/docker_remote_api_v1.15.md', '**HIDDEN**']
|
||||
- ['reference/api/docker_remote_api_v1.14.md', '**HIDDEN**']
|
||||
- ['reference/api/docker_remote_api_v1.13.md', '**HIDDEN**']
|
||||
- ['reference/api/docker_remote_api_v1.12.md', '**HIDDEN**']
|
||||
- ['reference/api/docker_remote_api_v1.11.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.8.md', '**HIDDEN**']
|
||||
|
||||
+6
-2
@@ -72,6 +72,9 @@ setup_s3() {
|
||||
|
||||
build_current_documentation() {
|
||||
mkdocs build
|
||||
cd site/
|
||||
gzip -9k -f search_content.json
|
||||
cd ..
|
||||
}
|
||||
|
||||
upload_current_documentation() {
|
||||
@@ -87,8 +90,6 @@ upload_current_documentation() {
|
||||
echo "Uploading $src"
|
||||
echo " to $dst"
|
||||
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
|
||||
# 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
|
||||
|
||||
# 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() {
|
||||
|
||||
@@ -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/)
|
||||
@@ -45,7 +45,7 @@ Our example is set up like this:
|
||||
## Creating the client certificates
|
||||
|
||||
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 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 it’s critical, you should assign an explicit UID/GID.
|
||||
|
||||
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
|
||||
daemon as root but running it as non-root), you may be able to use
|
||||
[“gosu”](https://github.com/tianon/gosu).
|
||||
|
||||
@@ -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
|
||||
|
||||
> **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.
|
||||
|
||||
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:
|
||||
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
|
||||
Enter pass phrase for ca-key.pem:
|
||||
You are about to be asked to enter information that will be incorporated
|
||||
into your certificate request.
|
||||
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
|
||||
For some fields there will be a default value,
|
||||
If you enter '.', the field will be left blank.
|
||||
-----
|
||||
Country Name (2 letter code) [AU]:
|
||||
State or Province Name (full name) [Some-State]:Queensland
|
||||
Locality Name (eg, city) []:Brisbane
|
||||
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc
|
||||
Organizational Unit Name (eg, section) []:Boot2Docker
|
||||
Common Name (e.g. server FQDN or YOUR name) []:$HOST
|
||||
Email Address []:Sven@home.org.au
|
||||
You are about to be asked to enter information that will be incorporated
|
||||
into your certificate request.
|
||||
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
|
||||
For some fields there will be a default value,
|
||||
If you enter '.', the field will be left blank.
|
||||
-----
|
||||
Country Name (2 letter code) [AU]:
|
||||
State or Province Name (full name) [Some-State]:Queensland
|
||||
Locality Name (eg, city) []:Brisbane
|
||||
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc
|
||||
Organizational Unit Name (eg, section) []:Boot2Docker
|
||||
Common Name (e.g. server FQDN or YOUR name) []:$HOST
|
||||
Email Address []:Sven@home.org.au
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
$ 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)
|
||||
$ 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 \
|
||||
-CAcreateserial -out server-cert.pem
|
||||
@@ -93,7 +93,7 @@ config file:
|
||||
|
||||
$ 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 \
|
||||
-CAcreateserial -out cert.pem -extfile extfile.cnf
|
||||
@@ -102,6 +102,24 @@ Now sign the key:
|
||||
Getting CA Private Key
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
$ 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
|
||||
|
||||
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
|
||||
`-H=tcp://:2376` and `--tlsverify` on every call).
|
||||
`-H=tcp://$HOST:2376` and `--tlsverify` on every call).
|
||||
|
||||
$ mkdir -p ~/.docker
|
||||
$ cp ca.pem ~/.docker/ca.pem
|
||||
$ cp cert.pem ~/.docker/cert.pem
|
||||
$ cp key.pem ~/.docker/key.pem
|
||||
$ export DOCKER_HOST=tcp://:2376
|
||||
$ export DOCKER_TLS_VERIFY=1
|
||||
$ mkdir -pv ~/.docker
|
||||
$ cp -v {ca,cert,key}.pem ~/.docker
|
||||
$ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
location using the environment variable `DOCKER_CERT_PATH`.
|
||||
|
||||
$ export DOCKER_CERT_PATH=${HOME}/.docker/zone1/
|
||||
$ export DOCKER_CERT_PATH=~/.docker/zone1/
|
||||
$ docker --tlsverify ps
|
||||
|
||||
### Connecting to the Secure Docker port using `curl`
|
||||
|
||||
@@ -13,11 +13,12 @@ cert: build
|
||||
certs: cert
|
||||
|
||||
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:
|
||||
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 --tls --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$(HOST):6666 version
|
||||
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:
|
||||
rm ca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server-key.pem server.csr
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
#!/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'
|
||||
|
||||
@@ -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
|
||||
`--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
|
||||
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
|
||||
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/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.
|
||||
|
||||
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 ip link set dev docker0 down
|
||||
$ sudo brctl delbr docker0
|
||||
$ sudo iptables -t nat -F POSTROUTING
|
||||
|
||||
Then, before starting the Docker service, create your own bridge and
|
||||
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
|
||||
$ 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
|
||||
now prepared to bind containers to the new bridge. After pausing to
|
||||
verify the bridge's configuration, try creating a container — you will
|
||||
|
||||
@@ -38,7 +38,7 @@ For example, if your mirror is serving on `http://10.0.0.2:5000`, you would run:
|
||||
**NOTE:**
|
||||
Depending on your local host setup, you may be able to add the
|
||||
`--registry-mirror` options to the `DOCKER_OPTS` variable in
|
||||
`/etc/defaults/docker`.
|
||||
`/etc/default/docker`.
|
||||
|
||||
### Step 2: Run the local registry mirror
|
||||
|
||||
|
||||
@@ -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
|
||||
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
|
||||
`HTTP_PROXY` environment variables described below.
|
||||
|
||||
@@ -39,7 +39,7 @@ our container.
|
||||
|
||||
Here we're installing the `openssh-server`,
|
||||
`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.
|
||||
|
||||
## Adding Supervisor's configuration file
|
||||
|
||||
@@ -10,6 +10,12 @@ used for all tests, builds and releases. The standard development
|
||||
environment defines all build dependencies: system libraries and
|
||||
binaries, go environment, go dependencies, etc.
|
||||
|
||||
**Things you need:**
|
||||
|
||||
* Docker
|
||||
* git
|
||||
* make
|
||||
|
||||
## Install Docker
|
||||
|
||||
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
|
||||
`Dockerfile` in the current directory. Essentially, it installs all
|
||||
the build and runtime dependencies necessary to build and test Docker.
|
||||
Your first build will take some time to complete. On Linux systems:
|
||||
|
||||
$ sudo make build
|
||||
|
||||
On Mac OS X, from within the `boot2docker` shell:
|
||||
Your first build will take some time to complete. On Linux systems and on Mac
|
||||
OS X from within the `boot2docker` shell:
|
||||
|
||||
$ make build
|
||||
|
||||
|
||||
> **Note**:
|
||||
> 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
|
||||
> 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
|
||||
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:
|
||||
|
||||
$ sudo make binary
|
||||
$ make binary
|
||||
|
||||
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`
|
||||
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`
|
||||
or `make BINDDIR=. cross`.
|
||||
@@ -91,7 +97,7 @@ on ubuntu:
|
||||
|
||||
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
|
||||
something like this
|
||||
@@ -138,7 +144,7 @@ is recommended.
|
||||
|
||||
You can run an interactive session in the newly built container:
|
||||
|
||||
$ sudo make shell
|
||||
$ make shell
|
||||
|
||||
# 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
|
||||
by:
|
||||
|
||||
$ sudo make docs
|
||||
$ make docs
|
||||
|
||||
# when its done, you can point your browser to http://yourdockerhost:8000
|
||||
# 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.
|
||||
|
||||
|
||||
@@ -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
|
||||
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
|
||||
described by the `Dockerfile` using the repository as the context. The
|
||||
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
|
||||
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
|
||||
|
||||
@@ -159,7 +159,7 @@ public or private Bitbucket repositories with a `Dockerfile`.
|
||||
### Adding a Hook
|
||||
|
||||
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:
|
||||
|
||||
<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`.
|
||||
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)
|
||||
to see on the repository page.
|
||||
community (for public repositories) or approved team members/orgs (for private
|
||||
repositories) to see on the repository page.
|
||||
|
||||
### 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.
|
||||
|
||||
Build triggers are available under the Settings menu of each Automated Build
|
||||
repo on the Docker Hub.
|
||||
repository on the Docker Hub.
|
||||
|
||||

|
||||
|
||||
@@ -249,7 +249,11 @@ payload:
|
||||
{
|
||||
"callback_url": "https://registry.hub.docker.com/u/svendowideit/testhook/hook/2141b5bi5i5b02bec211i4eeih0242eg11000a/",
|
||||
"push_data": {
|
||||
"images": [],
|
||||
"images": [
|
||||
"27d47432a69bca5f2700e4dff7de0388ed65f9d3fb1ec645e2bc24c223dc1cc3",
|
||||
"51a9c7c1f8bb2fa19bcd09789a34e63f35abb80044bc10196e304f6634cc582c",
|
||||
...
|
||||
],
|
||||
"pushed_at": 1.417566161e+09,
|
||||
"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
|
||||
> 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 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
|
||||
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
|
||||
right. Then, enter the name of the repository that you want have linked.
|
||||
|
||||
|
||||
@@ -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
|
||||
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:*
|
||||
|
||||
```
|
||||
{
|
||||
"callback_url": "https://registry.hub.docker.com/u/svendowideit/busybox/hook/2141bc0cdec4hebec411i4c1g40242eg110020/",
|
||||
"push_data": {
|
||||
"images": [],
|
||||
"images": [
|
||||
"27d47432a69bca5f2700e4dff7de0388ed65f9d3fb1ec645e2bc24c223dc1cc3",
|
||||
"51a9c7c1f8bb2fa19bcd09789a34e63f35abb80044bc10196e304f6634cc582c",
|
||||
...
|
||||
],
|
||||
"pushed_at": 1.417566822e+09,
|
||||
"pusher": "svendowideit"
|
||||
},
|
||||
@@ -138,9 +139,16 @@ similar to the example shown below.
|
||||
|
||||
Webhooks allow you to notify people, services and other applications of
|
||||
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.
|
||||
|
||||
> **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 allow you to chain calls to multiple services. For example,
|
||||
|
||||
@@ -32,18 +32,52 @@ runtime:
|
||||
Docker in daemon mode has specific kernel requirements. For details,
|
||||
check your distribution in [*Installation*](../#installation-list).
|
||||
|
||||
In general, a 3.8 Linux kernel is the minimum requirement for Docker, as
|
||||
some of the prior versions have known issues that are triggered by Docker.
|
||||
Linux kernel versions older than 3.8 are known to cause kernel panics and
|
||||
to break Docker.
|
||||
A 3.10 Linux kernel is the minimum requirement for Docker.
|
||||
Kernels older than 3.10 lack some of the features required to run Docker
|
||||
containers. These older versions are known to have bugs which cause data loss
|
||||
and frequently panic under certain conditions.
|
||||
|
||||
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
|
||||
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
|
||||
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:
|
||||
|
||||
$ wget https://get.docker.com/builds/Linux/x86_64/docker-latest -O docker
|
||||
|
||||
@@ -4,48 +4,34 @@ page_keywords: Docker, Docker documentation, requirements, linux, centos, epel,
|
||||
|
||||
# CentOS
|
||||
|
||||
While the Docker package is provided by default as part of CentOS-7,
|
||||
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.
|
||||
Docker is supported on the following versions of CentOS:
|
||||
|
||||
These instructions work for CentOS 6 and later. They will likely work for
|
||||
other binary compatible EL6 distributions such as Scientific Linux, but
|
||||
they haven't been tested.
|
||||
- [*CentOS 7 (64-bit)*](#installing-docker---centos-7)
|
||||
- [*CentOS 6.5 (64-bit)*](#installing-docker---centos-6.5) or later
|
||||
|
||||
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
|
||||
run only on the **64 bit** architecture.
|
||||
|
||||
To run Docker, you will need [CentOS6](http://www.centos.org) or higher,
|
||||
with a kernel version 2.6.32-431 or higher as this has specific kernel
|
||||
fixes to allow Docker to run.
|
||||
## Kernel support
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
## Kernel support
|
||||
|
||||
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`.
|
||||
Please continue with the [Starting the Docker daemon](#starting-the-docker-daemon).
|
||||
|
||||
### FirewallD
|
||||
|
||||
@@ -55,32 +41,49 @@ conflict with Docker.
|
||||
When `firewalld` is started or restarted it will remove the `DOCKER` chain
|
||||
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.
|
||||
|
||||
## Installing Docker - CentOS-6
|
||||
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
|
||||
to create and maintain additional packages for the RHEL distribution.
|
||||
## Installing Docker - CentOS-6.5
|
||||
|
||||
For Centos-6.5, the Docker package is part of [Extra Packages
|
||||
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
|
||||
follow the [EPEL installation instructions](
|
||||
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
|
||||
installed, it will conflict with `docker-io`.
|
||||
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.
|
||||
To proceed with `docker-io` installation on CentOS-6, you may need to remove the
|
||||
`docker` package first.
|
||||
|
||||
Next, let's install the `docker-io` package which
|
||||
will install Docker on our host.
|
||||
$ sudo yum -y remove docker
|
||||
|
||||
Next, let's install the `docker-io` package which will install Docker on our host.
|
||||
|
||||
$ 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.
|
||||
|
||||
@@ -115,13 +118,13 @@ If everything is working properly, you'll get a simple bash prompt. Type
|
||||
## Custom daemon options
|
||||
|
||||
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
|
||||
learn how to [customize your systemd Docker daemon options](/articles/systemd/).
|
||||
Docker runtime files, or make other customizations, read our Systemd article to
|
||||
learn how to [customize your Systemd Docker daemon options](/articles/systemd/).
|
||||
|
||||
## Dockerfiles
|
||||
The CentOS Project provides a number of sample Dockerfiles which you may use
|
||||
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)
|
||||
|
||||
**Done!** You can either continue with the [Docker User
|
||||
|
||||
@@ -1,41 +1,49 @@
|
||||
page_title: Installation on Fedora
|
||||
page_description: Installation instructions for Docker on Fedora.
|
||||
page_keywords: Docker, Docker documentation, Fedora, requirements, virtualbox, vagrant, git, ssh, putty, cygwin, linux
|
||||
page_description: Instructions for installing Docker on Fedora.
|
||||
page_keywords: Docker, Docker documentation, Fedora, requirements, linux
|
||||
|
||||
# Fedora
|
||||
|
||||
Docker is available in **Fedora 19 and later**. Please note that due to
|
||||
the current Docker limitations Docker is able to run only on the **64
|
||||
bit** architecture.
|
||||
Docker is supported on the following versions of Fedora:
|
||||
|
||||
## 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
|
||||
conflict with `docker-io`. There's a [bug
|
||||
report](https://bugzilla.redhat.com/show_bug.cgi?id=1043676) filed for
|
||||
it. To proceed with `docker-io` installation on Fedora 19, please remove
|
||||
`docker` first.
|
||||
## Fedora 21 and later installation
|
||||
|
||||
Install the `docker` package which will install Docker on our host.
|
||||
|
||||
$ 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
|
||||
|
||||
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
|
||||
|
||||
To update the `docker-io` package:
|
||||
To update the `docker` package:
|
||||
|
||||
$ 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.
|
||||
|
||||
$ sudo systemctl start docker
|
||||
@@ -54,24 +62,21 @@ Now let's verify that Docker is working.
|
||||
|
||||
## 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
|
||||
socket file `/var/run/docker.sock` owned by group `docker`. One must be
|
||||
member of that group in order to contact the `docker -d` process.
|
||||
socket file `/var/run/docker.sock` owned by `root:root`. Though it's
|
||||
[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
|
||||
|
||||
Adding users to the `docker` group is *not* necessary for Docker versions 1.0
|
||||
and above.
|
||||
$ sudo groupadd docker
|
||||
$ sudo chown root:docker /var/run/docker.sock
|
||||
$ sudo usermod -a -G docker $USERNAME
|
||||
|
||||
## Custom daemon options
|
||||
|
||||
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
|
||||
learn how to [customize your systemd Docker daemon options](/articles/systemd/).
|
||||
Docker runtime files, or make other customizations, read our Systemd article to
|
||||
learn how to [customize your Systemd Docker daemon options](/articles/systemd/).
|
||||
|
||||
## What next?
|
||||
|
||||
|
||||
@@ -1,10 +1,24 @@
|
||||
page_title: Installation on Red Hat Enterprise Linux
|
||||
page_description: Installation instructions for Docker on Red Hat Enterprise Linux.
|
||||
page_keywords: Docker, Docker documentation, requirements, linux, rhel, centos
|
||||
page_description: Instructions for installing Docker on Red Hat Enterprise Linux.
|
||||
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).
|
||||
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).
|
||||
@@ -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
|
||||
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
|
||||
(EPEL)](https://fedoraproject.org/wiki/EPEL), a community effort to
|
||||
create and maintain additional packages for the RHEL distribution.
|
||||
|
||||
Also note that due to the current Docker limitations, Docker is able to
|
||||
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
|
||||
### Kernel support
|
||||
|
||||
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
|
||||
changes which will cause issues if one decides to step outside that box and run
|
||||
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
|
||||
|
||||
Firstly, you need to install the EPEL repository. Please follow the
|
||||
[EPEL installation
|
||||
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
|
||||
installed, it will conflict with `docker-io`.
|
||||
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.
|
||||
To proceed with `docker-io` installation, you may need to remove the
|
||||
`docker` package first.
|
||||
|
||||
Next, let's install the `docker-io` package which
|
||||
will install Docker on our host.
|
||||
$ sudo yum -y remove docker
|
||||
|
||||
$ 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
|
||||
|
||||
$ 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.
|
||||
|
||||
$ sudo service docker start
|
||||
@@ -93,8 +115,8 @@ Continue with the [User Guide](/userguide/).
|
||||
## Custom daemon options
|
||||
|
||||
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
|
||||
learn how to [customize your systemd Docker daemon options](/articles/systemd/).
|
||||
Docker runtime files, or make other customizations, read our Systemd article to
|
||||
learn how to [customize your Systemd Docker daemon options](/articles/systemd/).
|
||||
|
||||
|
||||
## Issues?
|
||||
|
||||
@@ -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.
|
||||
|
||||
Type `exit` to exit
|
||||
|
||||
**Done!**, continue with the [User Guide](/userguide/).
|
||||
|
||||
|
||||
## Ubuntu Precise 12.04 (LTS) (64-bit)
|
||||
|
||||
This installation path should work at all times.
|
||||
|
||||
### 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
|
||||
with a 3.2 kernel, so we need to upgrade it. The kernel you'll install
|
||||
when following these steps comes with AUFS built in. We also include the
|
||||
generic headers to enable packages that depend on them, like ZFS and the
|
||||
VirtualBox guest additions. If you didn't install the headers for your
|
||||
"precise" kernel, then you can skip these headers for the "raring"
|
||||
kernel. But it is safer to include them if you're not sure.
|
||||
For Ubuntu Precise, the currently recommended kernel version is 3.13.
|
||||
Ubuntu Precise installations with older kernels must be upgraded. The
|
||||
kernel you'll install when following these steps has AUFS built in.
|
||||
We also include the generic headers to enable packages that depend on them,
|
||||
like ZFS and the VirtualBox guest additions. If you didn't install the
|
||||
headers for your "precise" kernel, then you can skip these headers for the
|
||||
"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
|
||||
Ubuntu.org to understand why you also need to install the Xorg packages
|
||||
@@ -104,10 +116,10 @@ each version.
|
||||
|
||||
# install the backported kernel
|
||||
$ 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
|
||||
$ 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
|
||||
$ sudo reboot
|
||||
|
||||
@@ -73,6 +73,8 @@ root filesystem as read only.
|
||||
**New!**
|
||||
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
|
||||
|
||||
|
||||
@@ -385,6 +385,41 @@ Status Codes:
|
||||
- **404** – no such container
|
||||
- **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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
|
||||
@@ -385,6 +385,41 @@ Status Codes:
|
||||
- **404** – no such container
|
||||
- **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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
|
||||
@@ -35,7 +35,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -45,7 +45,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -55,7 +55,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -65,7 +65,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -119,7 +119,7 @@ Create a container
|
||||
"Cmd":[
|
||||
"date"
|
||||
],
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":{
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -194,7 +194,7 @@ Return low-level information on the container `id`
|
||||
"Cmd": [
|
||||
"date"
|
||||
],
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"WorkingDir":""
|
||||
|
||||
@@ -539,6 +539,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -667,7 +702,7 @@ Create an image, either by pull it from the registry or by importing
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -739,7 +774,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -766,7 +801,7 @@ Return low-level information on the image `name`
|
||||
"StdinOnce":false,
|
||||
"Env":null,
|
||||
"Cmd": ["/bin/bash"]
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":null,
|
||||
"WorkingDir":""
|
||||
},
|
||||
@@ -787,7 +822,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1004,6 +1039,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** - remove intermediate containers after a successful build
|
||||
@@ -1194,10 +1230,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -45,7 +45,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -55,7 +55,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -65,7 +65,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -119,7 +119,7 @@ Create a container
|
||||
"Cmd":[
|
||||
"date"
|
||||
],
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":{
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -195,7 +195,7 @@ Return low-level information on the container `id`
|
||||
"date"
|
||||
],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -574,6 +574,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -701,7 +736,7 @@ Create an image, either by pull it from the registry or by importing i
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -742,7 +777,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -770,7 +805,7 @@ Return low-level information on the image `name`
|
||||
"Env":null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns":null,
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":null,
|
||||
"VolumesFrom":"",
|
||||
"WorkingDir":""
|
||||
@@ -792,7 +827,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1010,6 +1045,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** - remove intermediate containers after a successful build
|
||||
@@ -1224,10 +1260,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -46,7 +46,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -56,7 +56,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -66,7 +66,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -127,7 +127,7 @@ Create a container
|
||||
"Cmd":[
|
||||
"date"
|
||||
],
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":{
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -204,7 +204,7 @@ Return low-level information on the container `id`
|
||||
"date"
|
||||
],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -622,6 +622,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -760,7 +795,7 @@ Create an image, either by pull it from the registry or by importing i
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -803,7 +838,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -829,7 +864,7 @@ Return low-level information on the image `name`
|
||||
"Env": null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": null,
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -853,7 +888,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1071,6 +1106,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** - remove intermediate containers after a successful build (default behavior)
|
||||
@@ -1290,10 +1326,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -46,7 +46,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -56,7 +56,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -66,7 +66,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -121,7 +121,7 @@ Create a container
|
||||
"Cmd":[
|
||||
"date"
|
||||
],
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":{
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -198,7 +198,7 @@ Return low-level information on the container `id`
|
||||
"date"
|
||||
],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -615,6 +615,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -749,7 +784,7 @@ Create an image, either by pulling it from the registry or by importing it
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -792,7 +827,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -818,7 +853,7 @@ Return low-level information on the image `name`
|
||||
"Env": null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": null,
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -842,7 +877,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1060,6 +1095,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** - remove intermediate containers after a successful build (default behavior)
|
||||
@@ -1279,10 +1315,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -46,7 +46,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -56,7 +56,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -66,7 +66,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -124,7 +124,7 @@ Create a container
|
||||
"Cmd":[
|
||||
"date"
|
||||
],
|
||||
"Image":"base",
|
||||
"Image":"ubuntu",
|
||||
"Volumes":{
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -207,7 +207,7 @@ Return low-level information on the container `id`
|
||||
"date"
|
||||
],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -625,6 +625,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -759,7 +794,7 @@ Create an image, either by pulling it from the registry or by importing it
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -802,7 +837,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -828,7 +863,7 @@ Return low-level information on the image `name`
|
||||
"Env": null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": null,
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -852,7 +887,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1070,6 +1105,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** - remove intermediate containers after a successful build (default behavior)
|
||||
@@ -1289,10 +1325,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -46,7 +46,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -56,7 +56,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -66,7 +66,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -128,7 +128,7 @@ Create a container
|
||||
"date"
|
||||
],
|
||||
"Entrypoint": "",
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -148,6 +148,7 @@ Create a container
|
||||
"Privileged": false,
|
||||
"Dns": ["8.8.8.8"],
|
||||
"DnsSearch": [""],
|
||||
"ExtraHosts": null,
|
||||
"VolumesFrom": ["parent", "other:ro"],
|
||||
"CapAdd": ["NET_ADMIN"],
|
||||
"CapDrop": ["MKNOD"],
|
||||
@@ -220,6 +221,8 @@ Json Parameters:
|
||||
a boolean value.
|
||||
- **Dns** - A list of dns servers for the container to use.
|
||||
- **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.
|
||||
Specified in the form `<container name>[:<ro|rw>]`
|
||||
- **CapAdd** - A list of kernel capabilties to add to the container.
|
||||
@@ -288,7 +291,7 @@ Return low-level information on the container `id`
|
||||
"date"
|
||||
],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -767,6 +770,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -901,7 +939,7 @@ Create an image, either by pulling it from the registry or by importing it
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -945,7 +983,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -971,7 +1009,7 @@ Return low-level information on the image `name`
|
||||
"Env": null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": null,
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -995,7 +1033,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1214,6 +1252,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** - remove intermediate containers after a successful build (default behavior)
|
||||
@@ -1433,10 +1472,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -46,7 +46,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -56,7 +56,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -66,7 +66,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -128,7 +128,7 @@ Create a container
|
||||
"date"
|
||||
],
|
||||
"Entrypoint": "",
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -148,6 +148,7 @@ Create a container
|
||||
"Privileged": false,
|
||||
"Dns": ["8.8.8.8"],
|
||||
"DnsSearch": [""],
|
||||
"ExtraHosts": null,
|
||||
"VolumesFrom": ["parent", "other:ro"],
|
||||
"CapAdd": ["NET_ADMIN"],
|
||||
"CapDrop": ["MKNOD"],
|
||||
@@ -220,6 +221,8 @@ Json Parameters:
|
||||
a boolean value.
|
||||
- **Dns** - A list of dns servers for the container to use.
|
||||
- **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.
|
||||
Specified in the form `<container name>[:<ro|rw>]`
|
||||
- **CapAdd** - A list of kernel capabilties to add to the container.
|
||||
@@ -288,7 +291,7 @@ Return low-level information on the container `id`
|
||||
"date"
|
||||
],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {},
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -713,6 +716,41 @@ Status Codes:
|
||||
4. Read the extracted size and output it on the correct output
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -847,7 +885,7 @@ Create an image, either by pulling it from the registry or by importing it
|
||||
|
||||
**Example request**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -891,7 +929,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -917,7 +955,7 @@ Return low-level information on the image `name`
|
||||
"Env": null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": null,
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -941,7 +979,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1160,6 +1198,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **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
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ List containers
|
||||
[
|
||||
{
|
||||
"Id": "8dfafdbc3a40",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 1",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -46,7 +46,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "9cd87474be90",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 222222",
|
||||
"Created": 1367854155,
|
||||
"Status": "Exit 0",
|
||||
@@ -56,7 +56,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "3176a2479c92",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 3333333333333333",
|
||||
"Created": 1367854154,
|
||||
"Status": "Exit 0",
|
||||
@@ -66,7 +66,7 @@ List containers
|
||||
},
|
||||
{
|
||||
"Id": "4cb07b47f9fb",
|
||||
"Image": "base:latest",
|
||||
"Image": "ubuntu:latest",
|
||||
"Command": "echo 444444444444444444444444444444444",
|
||||
"Created": 1367854152,
|
||||
"Status": "Exit 0",
|
||||
@@ -128,7 +128,7 @@ Create a container
|
||||
"date"
|
||||
],
|
||||
"Entrypoint": "",
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": {
|
||||
"/tmp": {}
|
||||
},
|
||||
@@ -149,6 +149,7 @@ Create a container
|
||||
"ReadonlyRootfs": false,
|
||||
"Dns": ["8.8.8.8"],
|
||||
"DnsSearch": [""],
|
||||
"ExtraHosts": null,
|
||||
"VolumesFrom": ["parent", "other:ro"],
|
||||
"CapAdd": ["NET_ADMIN"],
|
||||
"CapDrop": ["MKNOD"],
|
||||
@@ -223,6 +224,8 @@ Json Parameters:
|
||||
Specified as a boolean value.
|
||||
- **Dns** - A list of dns servers for the container to use.
|
||||
- **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.
|
||||
Specified in the form `<container name>[:<ro|rw>]`
|
||||
- **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.
|
||||
|
||||
> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
|
||||
|
||||
**Example request**:
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -1034,6 +1074,7 @@ Query Parameters:
|
||||
- **dockerfile** - path within the build context to the Dockerfile
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – git or HTTP/HTTPS URI build source
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **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**:
|
||||
|
||||
POST /images/create?fromImage=base HTTP/1.1
|
||||
POST /images/create?fromImage=ubuntu HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1102,7 +1143,7 @@ Return low-level information on the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/json HTTP/1.1
|
||||
GET /images/ubuntu/json HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1128,7 +1169,7 @@ Return low-level information on the image `name`
|
||||
"Env": null,
|
||||
"Cmd": ["/bin/bash"],
|
||||
"Dns": null,
|
||||
"Image": "base",
|
||||
"Image": "ubuntu",
|
||||
"Volumes": null,
|
||||
"VolumesFrom": "",
|
||||
"WorkingDir": ""
|
||||
@@ -1152,7 +1193,7 @@ Return the history of the image `name`
|
||||
|
||||
**Example request**:
|
||||
|
||||
GET /images/base/history HTTP/1.1
|
||||
GET /images/ubuntu/history HTTP/1.1
|
||||
|
||||
**Example response**:
|
||||
|
||||
@@ -1551,10 +1592,10 @@ and Docker images will report:
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "base:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "base:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "base:latest", "time":1374067970}
|
||||
{"status": "create", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "start", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067924}
|
||||
{"status": "stop", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067966}
|
||||
{"status": "destroy", "id": "dfdf82bd3881","from": "ubuntu:latest", "time":1374067970}
|
||||
|
||||
Query Parameters:
|
||||
|
||||
|
||||
@@ -397,6 +397,41 @@ Status Codes:
|
||||
- **404** – no such container
|
||||
- **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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
|
||||
@@ -445,6 +445,41 @@ Status Codes:
|
||||
- **404** – no such container
|
||||
- **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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -863,6 +898,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
|
||||
Status Codes:
|
||||
|
||||
@@ -460,6 +460,41 @@ Status Codes:
|
||||
- **404** – no such container
|
||||
- **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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -905,6 +940,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
|
||||
|
||||
@@ -458,6 +458,41 @@ Status Codes:
|
||||
- **404** – no such container
|
||||
- **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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -916,6 +951,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **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
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -1014,6 +1049,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
- **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
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -956,6 +991,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
- **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
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -1006,6 +1041,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
- **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
|
||||
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
|
||||
|
||||
`POST /containers/(id)/wait`
|
||||
@@ -1009,6 +1044,7 @@ Query Parameters:
|
||||
|
||||
- **t** – repository name (and optionally a tag) to be applied to
|
||||
the resulting image in case of success
|
||||
- **remote** – build source URI (git or HTTPS/HTTP)
|
||||
- **q** – suppress verbose build output
|
||||
- **nocache** – do not use the cache when building the image
|
||||
- **rm** – Remove intermediate containers after a successful build
|
||||
|
||||
@@ -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
|
||||
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
|
||||
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> ...
|
||||
|
||||
The `ENV` instruction sets the environment variable `<key>` to the value
|
||||
`<value>`. This value will be passed to all future
|
||||
`RUN`, `ENTRYPOINT`, and `CMD` instructions. This is
|
||||
functionally equivalent to prefixing the command with `<key>=<value>`
|
||||
`<value>`. This value will be in the environment of all "descendent" `Dockerfile`
|
||||
commands and can be [replaced inline](#environment-replacement) in many as well.
|
||||
|
||||
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
|
||||
@@ -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>`.
|
||||
|
||||
> **Note**:
|
||||
> One example where this can cause unexpected consequences, is setting
|
||||
> `ENV DEBIAN_FRONTEND noninteractive`. Which will persist when the container
|
||||
> is run interactively; for example: `docker run -t -i image bash`
|
||||
> Environment persistence can cause unexpected effects. For example,
|
||||
> setting `ENV DEBIAN_FRONTEND noninteractive` may confuse apt-get
|
||||
> users on a Debian-based image. To set a value for a single command, use
|
||||
> `RUN <key>=<value> <command>`.
|
||||
|
||||
## ADD
|
||||
|
||||
@@ -801,8 +801,8 @@ and for any `RUN`, `CMD` and `ENTRYPOINT` instructions that follow it in the
|
||||
|
||||
WORKDIR /path/to/workdir
|
||||
|
||||
The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD` and
|
||||
`ENTRYPOINT` instructions that follow it in the `Dockerfile`.
|
||||
The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD`,
|
||||
`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
|
||||
is provided, it will be relative to the path of the previous `WORKDIR`
|
||||
|
||||
@@ -32,19 +32,24 @@ To list the help on any command just execute the command, followed by the `--hel
|
||||
|
||||
## 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`,
|
||||
you can write `docker run -ti --name test busybox sh`.
|
||||
|
||||
### Boolean
|
||||
|
||||
Boolean options look like `-d=false`. The value you
|
||||
see is the default value which gets set if you do **not** use the
|
||||
boolean flag. If you do call `run -d`, that sets the
|
||||
opposite boolean value, so in this case, `true`, and
|
||||
so `docker run -d` **will** run in "detached" mode,
|
||||
in the background. Other boolean options are similar – specifying them
|
||||
will set the value to the opposite of the default value.
|
||||
Boolean options take the form `-d=false`. The value you see in the help text is the
|
||||
default value which is set if you do **not** specify that flag. If you specify
|
||||
a Boolean flag without a value, this will set the flag to `true`, irrespective
|
||||
of the default value.
|
||||
|
||||
For example, running `docker run -d` will set the value to `true`, so
|
||||
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
|
||||
|
||||
@@ -139,7 +144,7 @@ for un-encrypted, and port `2376` for encrypted communication with the daemon.
|
||||
> for security reasons.
|
||||
|
||||
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
|
||||
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
|
||||
@@ -329,7 +334,7 @@ Currently supported options are:
|
||||
|
||||
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 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
|
||||
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
|
||||
--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
|
||||
primary process (`pid 1`).
|
||||
The `docker attach` command allows you to attach to a running container using
|
||||
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
|
||||
sharing style, or quickly view the progress of your daemonized process.
|
||||
You can detach from the container (and leave it running) with `CTRL-p CTRL-q`
|
||||
(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.
|
||||
> See: [`docker exec`](#exec).
|
||||
|
||||
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`.
|
||||
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`).
|
||||
|
||||
#### Examples
|
||||
|
||||
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
|
||||
$ sudo docker attach $ID
|
||||
$ sudo docker run -d --name topdemo ubuntu /usr/bin/top -b)
|
||||
$ sudo docker attach topdemo
|
||||
top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05
|
||||
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
|
||||
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
|
||||
@@ -481,7 +481,23 @@ To kill the container, use `docker kill`.
|
||||
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
|
||||
1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top
|
||||
^C$
|
||||
$ sudo docker stop $ID
|
||||
$ 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
|
||||
|
||||
@@ -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-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-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
|
||||
@@ -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
|
||||
--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
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
4c01db0b339c 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
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
f7ee772232194fcc088c6bdec6ea09f7b3f6c54d53934658164b8602d7cd4744 ubuntu:12.04 bash 17 seconds ago Up 16 seconds webapp
|
||||
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 -a`
|
||||
@@ -1659,6 +1675,19 @@ and linking containers.
|
||||
|
||||
#### 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"
|
||||
|
||||
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
|
||||
|
||||
> **Note**: this functionality currently only works when using the *libcontainer* exec-driver.
|
||||
|
||||
Running `docker stats` on multiple containers
|
||||
|
||||
$ sudo docker stats redis1 redis2
|
||||
|
||||
@@ -2,78 +2,44 @@ page_title: Docker 1.x Series Release Notes
|
||||
page_description: Release Notes for Docker 1.x.
|
||||
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
|
||||
desired version from the drop-down list at the top right of this page.
|
||||
|
||||
##Version 1.4.1
|
||||
(2014-12-17)
|
||||
|
||||
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.5.0
|
||||
(2015-02-03)
|
||||
|
||||
##Version 1.4.0
|
||||
(2014-12-11)
|
||||
|
||||
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/10286).
|
||||
|
||||
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*
|
||||
|
||||
* You can now add labels to the Docker daemon using key=value pairs defined with
|
||||
the new `--label` flag. The labels are displayed by running `docker info`. In
|
||||
addition, `docker info` also now returns an ID and hostname field. For more
|
||||
information, see the
|
||||
[command line reference](http://docs.docker.com/reference/commandline/cli/#daemon).
|
||||
* The `ENV` instruction in the `Dockerfile` now supports arguments in the form
|
||||
of `ENV name=value name2=value2..`. For more information, see the
|
||||
[command line reference](http://docs.docker.com/reference/builder/#env)
|
||||
* Introducing a new, still
|
||||
[experimental, overlayfs storage driver](https://github.com/docker/docker/pull/7619/).
|
||||
* You can now add filters to `docker events` to filter events by event name,
|
||||
container, or image. For more information, see the
|
||||
[command line reference](http://docs.docker.com/reference/commandline/cli/#events).
|
||||
* The `docker cp` command now supports copying files from the filesystem of a
|
||||
container's volumes. For more information, see the
|
||||
[remote API reference](http://docs.docker.com/reference/api/docker_remote_api/).
|
||||
* The `docker tag` command has been fixed so that it correctly honors `--force`
|
||||
when overriding a tag for existing image. For more information, see
|
||||
the [command line reference](http://docs.docker.com/reference/commandline/cli/#tag).
|
||||
|
||||
* Container volumes are now initialized during `docker create`. For more information, see
|
||||
the [command line reference](http://docs.docker.com/reference/commandline/cli/#create).
|
||||
|
||||
*Security Fixes*
|
||||
|
||||
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.
|
||||
* The Docker daemon has now supports for IPv6 networking between containers
|
||||
and on the `docker0` bridge. For more information see the
|
||||
[IPv6 networking reference](/articles/networking/#ipv6).
|
||||
* Docker container filesystems can now be set to`--read-only`, restricting your
|
||||
container to writing to volumes [PR# 10093](https://github.com/docker/docker/pull/10093).
|
||||
* A new `docker stats CONTAINERID` command has been added to allow users to view a
|
||||
continuously updating stream of container resource usage statistics. See the
|
||||
[`stats` command line reference](/reference/commandline/cli/#stats) and the
|
||||
[container `stats` API reference](/reference/api/docker_remote_api_v1.17/#get-container-stats-based-on-resource-usage).
|
||||
**Note**: this feature is only enabled for the `libcontainer` exec-driver at this point.
|
||||
* Users can now specify the file to use as the `Dockerfile` by running
|
||||
`docker build -f alternate.dockerfile .`. This will allow the definition of multiple
|
||||
`Dockerfile`s for a single project. See the [`docker build` command reference](
|
||||
/reference/commandline/cli/#build) for more information.
|
||||
* The v1 Open Image specification has been created to document the current Docker image
|
||||
format and metadata. Please see [the Open Image specification document](
|
||||
https://github.com/docker/docker/blob/master/image/spec/v1.md) for more details.
|
||||
* This release also includes a number of significant performance improvements in
|
||||
build and image management ([PR #9720](https://github.com/docker/docker/pull/9720),
|
||||
[PR #8827](https://github.com/docker/docker/pull/8827))
|
||||
* The `docker inspect` command now lists ExecIDs generated for each `docker exec` process.
|
||||
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
|
||||
is a restart policy ([PR #9621](https://github.com/docker/docker/pull/9621))
|
||||
* This version of Docker is built using Go 1.4
|
||||
|
||||
> **Note:**
|
||||
> 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
|
||||
between upper and lower layers. This can cause issues with accessing private
|
||||
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).
|
||||
|
||||
@@ -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.
|
||||
|
||||
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
|
||||
updating our APT cache, installing Ruby and RubyGems and then installing the
|
||||
Sinatra gem.
|
||||
|
||||
@@ -233,7 +233,7 @@ command to list the specified container's environment variables.
|
||||
> will scrub them when spawning shells for connection.
|
||||
|
||||
> **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
|
||||
> if the source container is restarted. We recommend using the host entries in
|
||||
> `/etc/hosts` to resolve the IP address of linked containers.
|
||||
|
||||
@@ -64,7 +64,7 @@ This will mount the host directory, `/src/webapp`, into the container at
|
||||
`/opt/webapp`.
|
||||
|
||||
> **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
|
||||
> consistent with the expected behavior of `mount`
|
||||
|
||||
@@ -115,7 +115,7 @@ it.
|
||||
|
||||
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`
|
||||
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
|
||||
|
||||
|
||||
@@ -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
|
||||
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
|
||||
Python applications: both bound to port 5000 inside your container.
|
||||
Without Docker's port mapping you could only access one at a time.
|
||||
Python applications: both bound to port 5000 inside their own containers.
|
||||
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
|
||||
see the application.
|
||||
|
||||
Vendored
+34
-23
@@ -22,22 +22,39 @@
|
||||
|
||||
#leftnav {
|
||||
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;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#leftnav li.active {
|
||||
margin-bottom: 10px;
|
||||
#leftnav .nav ul {
|
||||
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 {
|
||||
@@ -60,6 +77,7 @@ pre {
|
||||
/* Main Navigation */
|
||||
#nav_menu > #docsnav {
|
||||
max-width: 940px;
|
||||
width: 940px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#nav_menu > #docsnav > #nav_search {
|
||||
@@ -112,7 +130,7 @@ pre {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#nav_menu #docsnav #main-nav > li {
|
||||
font-size: 14px;
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
color: #253237;
|
||||
line-height: 2em;
|
||||
@@ -177,13 +195,13 @@ pre {
|
||||
display: block;
|
||||
}
|
||||
.dd_menu li a {
|
||||
font-size: 14px;
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
color: #005976;
|
||||
}
|
||||
.dd_menu li a:hover {
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
color: #24b8eb;
|
||||
}
|
||||
@@ -321,13 +339,6 @@ pre {
|
||||
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 */
|
||||
.topmostnav_loggedin {
|
||||
display: none;
|
||||
|
||||
Vendored
+3
-7
@@ -801,10 +801,6 @@ div + .form-inline {
|
||||
transition: box-shadow linear 0.2s, background linear 0.3s, width linear 0.3s;
|
||||
width: 140px;
|
||||
}
|
||||
#topmostnav .navbar-index-search .search-query:focus,
|
||||
#topmostnav .navbar-index-search .search-query.focused {
|
||||
width: 200px;
|
||||
}
|
||||
#topmostnav.public {
|
||||
border-bottom: none;
|
||||
height: 80px;
|
||||
@@ -995,7 +991,7 @@ div + .form-inline {
|
||||
#leftnav .nav.nav-tabs.nav-stacked > li > a {
|
||||
border: 0;
|
||||
}
|
||||
#leftnav .nav.nav-tabs li.active a {
|
||||
Killwithfire #leftnav .nav.nav-tabs li.active a {
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #394d54;
|
||||
@@ -1005,14 +1001,14 @@ div + .form-inline {
|
||||
border-left: 10px solid #ade5f9;
|
||||
padding-left: 9px;
|
||||
}
|
||||
#leftnav .nav.nav-tabs li.active a:hover {
|
||||
Killwithfire #leftnav .nav.nav-tabs li.active a:hover {
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #24b8eb;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
#leftnav .nav.nav-tabs li.active a:focus {
|
||||
Killwithfire #leftnav .nav.nav-tabs li.active a:focus {
|
||||
outline: none;
|
||||
}
|
||||
#leftnav .nav.nav-tabs > li > a {
|
||||
|
||||
Vendored
+10
-8
@@ -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">
|
||||
<a href="http://www.docker.com/" title="Homepage">
|
||||
<div class="brand logo"><img src="/img/nav/docker-logo-loggedout.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="nav_search" class="navbar-index-search 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>
|
||||
<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/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="active"><a href="https://docs.docker.com" title="Install & Docs">Install & Docs</a></li>
|
||||
<li><a href="https://registry.hub.docker.com" title="Browse">Browse</a></li>
|
||||
</ul>
|
||||
<div id="usernav" class="pull-right">
|
||||
@@ -18,9 +19,10 @@
|
||||
</div>
|
||||
<div id="topmostnav" class="topmostnav_loggedin navbar navbar-static-top">
|
||||
<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>
|
||||
<form id="search_box_header" class="navbar-index-search pull-right" action="https://registry.hub.docker.com/search">
|
||||
<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">
|
||||
<a href="/" title="Docker Docs Home"><div class="brand logo"><img src="/img/nav/docker-logo-loggedin.png"> </div></a>
|
||||
<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 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">
|
||||
<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 |
Vendored
+13
-7
@@ -1,12 +1,6 @@
|
||||
$(document).ready(function ()
|
||||
{
|
||||
|
||||
// Tipue Search activation
|
||||
$('#tipue_search_input').tipuesearch({
|
||||
'mode': 'json',
|
||||
'contentLocation': '/search_content.json'
|
||||
});
|
||||
|
||||
prettyPrint();
|
||||
|
||||
// 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 ()
|
||||
@@ -92,4 +98,4 @@ function getCookie(cname) {
|
||||
if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
-4
@@ -18,9 +18,5 @@
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</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>
|
||||
</nav>
|
||||
|
||||
Vendored
+5
-2
@@ -1,8 +1,11 @@
|
||||
{% for toc_item in toc %}
|
||||
{% 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 %}
|
||||
<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 %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
@@ -4,6 +4,8 @@ import (
|
||||
"bytes"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
)
|
||||
|
||||
func TestRegister(t *testing.T) {
|
||||
@@ -150,3 +152,85 @@ func TestCatchallEmptyName(t *testing.T) {
|
||||
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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,6 +223,28 @@ func (graph *Graph) Mktemp(id string) (string, error) {
|
||||
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
|
||||
// for bind-mounting dockerinit into the container. The mountpoint is simply an
|
||||
// empty file at /.dockerinit
|
||||
|
||||
+38
-52
@@ -3,11 +3,9 @@ package graph
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"path"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/docker/docker/engine"
|
||||
@@ -17,35 +15,6 @@ import (
|
||||
"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) {
|
||||
manifest := ®istry.ManifestData{
|
||||
Name: remoteName,
|
||||
@@ -71,14 +40,13 @@ func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if layer.Config == nil {
|
||||
return nil, errors.New("Missing layer configuration")
|
||||
}
|
||||
manifest.Architecture = layer.Architecture
|
||||
manifest.FSLayers = make([]*registry.FSLayer, 0, 4)
|
||||
manifest.History = make([]*registry.ManifestHistory, 0, 4)
|
||||
var metadata runconfig.Config
|
||||
metadata = *layer.Config
|
||||
if layer.Config != nil {
|
||||
metadata = *layer.Config
|
||||
}
|
||||
|
||||
for ; layer != nil; layer, err = layer.GetParent() {
|
||||
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 {
|
||||
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)
|
||||
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, ®istry.FSLayer{BlobSum: tarId})
|
||||
|
||||
layersSeen[layer.ID] = true
|
||||
jsonData, err := ioutil.ReadFile(path.Join(s.graph.Root, layer.ID, "json"))
|
||||
jsonData, err := layer.RawJson()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Cannot retrieve the path for {%s}: %s", layer.ID, err)
|
||||
}
|
||||
|
||||
manifest.FSLayers = append(manifest.FSLayers, ®istry.FSLayer{BlobSum: checksum})
|
||||
|
||||
layersSeen[layer.ID] = true
|
||||
|
||||
manifest.History = append(manifest.History, ®istry.ManifestHistory{V1Compatibility: string(jsonData)})
|
||||
}
|
||||
|
||||
@@ -128,7 +109,12 @@ func (s *TagStore) newManifest(localName, remoteName, tag string) ([]byte, error
|
||||
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")
|
||||
if err != nil {
|
||||
return nil, false, fmt.Errorf("error parsing payload: %s", err)
|
||||
|
||||
@@ -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
@@ -72,7 +72,7 @@ func (s *TagStore) CmdPull(job *engine.Job) engine.Status {
|
||||
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")
|
||||
if err = j.Run(); err != nil {
|
||||
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 {
|
||||
downloadImage := func(img *registry.ImgData) {
|
||||
if askedTag != "" && img.Tag != askedTag {
|
||||
log.Debugf("(%s) does not match %s (id: %s), skipping", img.Tag, askedTag, img.ID)
|
||||
if parallel {
|
||||
errors <- nil
|
||||
}
|
||||
@@ -388,6 +387,9 @@ func (s *TagStore) pullV2Repository(eng *engine.Engine, r *registry.Session, out
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(tags) == 0 {
|
||||
return registry.ErrDoesNotExist
|
||||
}
|
||||
for _, t := range tags {
|
||||
if downloaded, err := s.pullV2Tag(eng, r, out, endpoint, repoInfo, t, sf, parallel, auth); err != nil {
|
||||
return err
|
||||
@@ -418,7 +420,7 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
|
||||
return false, err
|
||||
}
|
||||
|
||||
manifest, verified, err := s.verifyManifest(eng, manifestBytes)
|
||||
manifest, verified, err := s.loadManifest(eng, manifestBytes)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("error verifying manifest: %s", err)
|
||||
}
|
||||
|
||||
+119
-67
@@ -2,6 +2,7 @@ package graph
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@@ -18,6 +19,8 @@ import (
|
||||
"github.com/docker/libtrust"
|
||||
)
|
||||
|
||||
var ErrV2RegistryUnavailable = errors.New("error v2 registry unavailable")
|
||||
|
||||
// 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) {
|
||||
var (
|
||||
@@ -65,6 +68,25 @@ func (s *TagStore) getImageList(localRepo map[string]string, requestedTag string
|
||||
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.
|
||||
func (s *TagStore) createImageIndex(images []string, tags map[string][]string) []*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
|
||||
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")
|
||||
defer prgRd.Close()
|
||||
|
||||
checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, prgRd, ep, token, jsonRaw)
|
||||
checksum, checksumPayload, err := r.PushImageLayerRegistry(imgData.ID, utils.ProgressReader(layerData, int(layerData.Size), out, sf, false, utils.TruncateID(imgData.ID), "Pushing"), ep, token, jsonRaw)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@@ -254,7 +273,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
|
||||
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 {
|
||||
j := eng.Job("trust_update_base")
|
||||
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)
|
||||
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)
|
||||
}
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
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
|
||||
if len(manifestBytes) == 0 {
|
||||
for _, tag := range tags {
|
||||
log.Debugf("Pushing %s:%s to v2 repository", repoInfo.LocalName, tag)
|
||||
mBytes, err := s.newManifest(repoInfo.LocalName, repoInfo.RemoteName, tag)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -290,75 +322,99 @@ func (s *TagStore) pushV2Repository(r *registry.Session, eng *engine.Engine, out
|
||||
if err != nil {
|
||||
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))
|
||||
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)
|
||||
manifest, verified, err := s.loadManifest(eng, signedBody)
|
||||
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 != nil {
|
||||
return err
|
||||
if err := checkValidManifest(manifest); err != nil {
|
||||
return fmt.Errorf("invalid manifest: %s", err)
|
||||
}
|
||||
|
||||
arch, err := img.TarLayer()
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not get tar layer: %s", err)
|
||||
if verified {
|
||||
log.Infof("Pushing verified image, key %s is registered for %q", s.trustKey.KeyID(), repoInfo.RemoteName)
|
||||
}
|
||||
|
||||
// Call mount blob
|
||||
exists, err := r.HeadV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], manifestSum, auth)
|
||||
if err != nil {
|
||||
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image push failed", nil))
|
||||
return err
|
||||
}
|
||||
for i := len(manifest.FSLayers) - 1; i >= 0; i-- {
|
||||
var (
|
||||
sumStr = manifest.FSLayers[i].BlobSum
|
||||
imgJSON = []byte(manifest.History[i].V1Compatibility)
|
||||
)
|
||||
|
||||
if !exists {
|
||||
prgRd := utils.ProgressReader(arch, int(img.Size), out, sf, false, utils.TruncateID(img.ID), "Pushing")
|
||||
defer prgRd.Close()
|
||||
sumParts := strings.SplitN(sumStr, ":", 2)
|
||||
if len(sumParts) < 2 {
|
||||
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 {
|
||||
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))
|
||||
} else {
|
||||
out.Write(sf.FormatProgress(utils.TruncateID(img.ID), "Image already exists", nil))
|
||||
|
||||
if !exists {
|
||||
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
|
||||
return r.PutV2ImageManifest(endpoint, repoInfo.RemoteName, tag, bytes.NewReader([]byte(manifestBytes)), auth)
|
||||
// PushV2Image pushes the image content to the v2 registry, first buffering the contents to disk
|
||||
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.
|
||||
@@ -380,7 +436,6 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status {
|
||||
}
|
||||
|
||||
tag := job.Getenv("tag")
|
||||
manifestBytes := job.Getenv("manifest")
|
||||
job.GetenvJson("authConfig", authConfig)
|
||||
job.GetenvJson("metaHeaders", &metaHeaders)
|
||||
|
||||
@@ -400,18 +455,15 @@ func (s *TagStore) CmdPush(job *engine.Job) engine.Status {
|
||||
return job.Error(err2)
|
||||
}
|
||||
|
||||
if len(tag) == 0 {
|
||||
tag = DEFAULTTAG
|
||||
}
|
||||
|
||||
if repoInfo.Index.Official || endpoint.Version == registry.APIVersion2 {
|
||||
err := s.pushV2Repository(r, job.Eng, job.Stdout, repoInfo, manifestBytes, tag, sf)
|
||||
if endpoint.Version == registry.APIVersion2 {
|
||||
err := s.pushV2Repository(r, job.Eng, job.Stdout, repoInfo, tag, sf)
|
||||
if err == nil {
|
||||
return engine.StatusOK
|
||||
}
|
||||
|
||||
// error out, no fallback to V1
|
||||
return job.Error(err)
|
||||
if err != ErrV2RegistryUnavailable {
|
||||
return job.Errorf("Error pushing to registry: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
||||
@@ -25,7 +25,6 @@ func (s *TagStore) Install(eng *engine.Engine) error {
|
||||
"import": s.CmdImport,
|
||||
"pull": s.CmdPull,
|
||||
"push": s.CmdPush,
|
||||
"image_manifest": s.CmdManifest,
|
||||
} {
|
||||
if err := eng.Register(name, handler); err != nil {
|
||||
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.SetInt64("Size", image.Size)
|
||||
out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size)
|
||||
out.Set("Checksum", image.Checksum)
|
||||
if _, err = out.WriteTo(job.Stdout); err != nil {
|
||||
return job.Error(err)
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user