From c238be123ff976b0485af94778ac61981b6ef622 Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Fri, 19 Jul 2024 12:33:13 +0000 Subject: [PATCH] Deployed db2bd7c with MkDocs version: 1.4.2 --- .nojekyll | 0 404.html | 888 +++ assets/_mkdocstrings.css | 119 + assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.b4d07000.min.js | 29 + assets/javascripts/bundle.b4d07000.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.208ed371.min.js | 42 + .../workers/search.208ed371.min.js.map | 8 + assets/stylesheets/main.85bb2934.min.css | 1 + assets/stylesheets/main.85bb2934.min.css.map | 1 + assets/stylesheets/palette.a6bdf11c.min.css | 1 + .../stylesheets/palette.a6bdf11c.min.css.map | 1 + docker_client/index.html | 1598 ++++ img/docker_clients.png | Bin 0 -> 685125 bytes img/full.png | Bin 0 -> 106224 bytes index.html | 1237 +++ objects.inv | Bin 0 -> 2355 bytes objects/builders/index.html | 1083 +++ objects/configs/index.html | 1096 +++ objects/containers/index.html | 1836 +++++ objects/images/index.html | 1252 +++ objects/networks/index.html | 1136 +++ objects/nodes/index.html | 1187 +++ objects/plugins/index.html | 1186 +++ objects/pods/index.html | 1278 ++++ objects/secrets/index.html | 1022 +++ objects/services/index.html | 1237 +++ objects/stacks/index.html | 955 +++ objects/tasks/index.html | 989 +++ objects/volumes/index.html | 1144 +++ search/search_index.json | 1 + sitemap.xml | 193 + sitemap.xml.gz | Bin 0 -> 219 bytes sub-commands/buildx/index.html | 2892 +++++++ sub-commands/compose/index.html | 4201 +++++++++++ sub-commands/config/index.html | 1361 ++++ sub-commands/container/index.html | 5599 ++++++++++++++ sub-commands/context/index.html | 1477 ++++ sub-commands/image/index.html | 2463 ++++++ sub-commands/manifest/index.html | 1414 ++++ sub-commands/network/index.html | 1386 ++++ sub-commands/node/index.html | 1572 ++++ sub-commands/plugin/index.html | 1870 +++++ sub-commands/pod/index.html | 3299 ++++++++ sub-commands/secret/index.html | 1203 +++ sub-commands/service/index.html | 2073 +++++ sub-commands/stack/index.html | 1524 ++++ sub-commands/swarm/index.html | 1917 +++++ sub-commands/system/index.html | 1365 ++++ sub-commands/task/index.html | 1115 +++ sub-commands/trust/index.html | 1086 +++ sub-commands/volume/index.html | 1652 ++++ user_guide/docker_run/index.html | 1086 +++ user_guide/exceptions/index.html | 1009 +++ user_guide/generic_resources/index.html | 1165 +++ .../index.html | 1076 +++ 88 files changed, 70532 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.b4d07000.min.js create mode 100644 assets/javascripts/bundle.b4d07000.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.208ed371.min.js create mode 100644 assets/javascripts/workers/search.208ed371.min.js.map create mode 100644 assets/stylesheets/main.85bb2934.min.css create mode 100644 assets/stylesheets/main.85bb2934.min.css.map create mode 100644 assets/stylesheets/palette.a6bdf11c.min.css create mode 100644 assets/stylesheets/palette.a6bdf11c.min.css.map create mode 100644 docker_client/index.html create mode 100644 img/docker_clients.png create mode 100644 img/full.png create mode 100644 index.html create mode 100644 objects.inv create mode 100644 objects/builders/index.html create mode 100644 objects/configs/index.html create mode 100644 objects/containers/index.html create mode 100644 objects/images/index.html create mode 100644 objects/networks/index.html create mode 100644 objects/nodes/index.html create mode 100644 objects/plugins/index.html create mode 100644 objects/pods/index.html create mode 100644 objects/secrets/index.html create mode 100644 objects/services/index.html create mode 100644 objects/stacks/index.html create mode 100644 objects/tasks/index.html create mode 100644 objects/volumes/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 sub-commands/buildx/index.html create mode 100644 sub-commands/compose/index.html create mode 100644 sub-commands/config/index.html create mode 100644 sub-commands/container/index.html create mode 100644 sub-commands/context/index.html create mode 100644 sub-commands/image/index.html create mode 100644 sub-commands/manifest/index.html create mode 100644 sub-commands/network/index.html create mode 100644 sub-commands/node/index.html create mode 100644 sub-commands/plugin/index.html create mode 100644 sub-commands/pod/index.html create mode 100644 sub-commands/secret/index.html create mode 100644 sub-commands/service/index.html create mode 100644 sub-commands/stack/index.html create mode 100644 sub-commands/swarm/index.html create mode 100644 sub-commands/system/index.html create mode 100644 sub-commands/task/index.html create mode 100644 sub-commands/trust/index.html create mode 100644 sub-commands/volume/index.html create mode 100644 user_guide/docker_run/index.html create mode 100644 user_guide/exceptions/index.html create mode 100644 user_guide/generic_resources/index.html create mode 100644 user_guide/running_python_on_whales_inside_a_container/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..2b9bc64c --- /dev/null +++ b/404.html @@ -0,0 +1,888 @@ + + + + + + + + + + + + + + + + + + + + Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 00000000..85449ec7 --- /dev/null +++ b/assets/_mkdocstrings.css @@ -0,0 +1,119 @@ + +/* Avoid breaking parameter names, etc. in table cells. */ +.doc-contents td code { + word-break: normal !important; +} + +/* No line break before first paragraph of descriptions. */ +.doc-md-description, +.doc-md-description>p:first-child { + display: inline; +} + +/* Max width for docstring sections tables. */ +.doc .md-typeset__table, +.doc .md-typeset__table table { + display: table !important; + width: 100%; +} + +.doc .md-typeset__table tr { + display: table-row; +} + +/* Defaults in Spacy table style. */ +.doc-param-default { + float: right; +} + +/* Backward-compatibility: docstring section titles in bold. */ +.doc-section-title { + font-weight: bold; +} + +/* Symbols in Navigation and ToC. */ +:root, +[data-md-color-scheme="default"] { + --doc-symbol-attribute-fg-color: #953800; + --doc-symbol-function-fg-color: #8250df; + --doc-symbol-method-fg-color: #8250df; + --doc-symbol-class-fg-color: #0550ae; + --doc-symbol-module-fg-color: #5cad0f; + + --doc-symbol-attribute-bg-color: #9538001a; + --doc-symbol-function-bg-color: #8250df1a; + --doc-symbol-method-bg-color: #8250df1a; + --doc-symbol-class-bg-color: #0550ae1a; + --doc-symbol-module-bg-color: #5cad0f1a; +} + +[data-md-color-scheme="slate"] { + --doc-symbol-attribute-fg-color: #ffa657; + --doc-symbol-function-fg-color: #d2a8ff; + --doc-symbol-method-fg-color: #d2a8ff; + --doc-symbol-class-fg-color: #79c0ff; + --doc-symbol-module-fg-color: #baff79; + + --doc-symbol-attribute-bg-color: #ffa6571a; + --doc-symbol-function-bg-color: #d2a8ff1a; + --doc-symbol-method-bg-color: #d2a8ff1a; + --doc-symbol-class-bg-color: #79c0ff1a; + --doc-symbol-module-bg-color: #baff791a; +} + +code.doc-symbol { + border-radius: .1rem; + font-size: .85em; + padding: 0 .3em; + font-weight: bold; +} + +code.doc-symbol-attribute { + color: var(--doc-symbol-attribute-fg-color); + background-color: var(--doc-symbol-attribute-bg-color); +} + +code.doc-symbol-attribute::after { + content: "attr"; +} + +code.doc-symbol-function { + color: var(--doc-symbol-function-fg-color); + background-color: var(--doc-symbol-function-bg-color); +} + +code.doc-symbol-function::after { + content: "func"; +} + +code.doc-symbol-method { + color: var(--doc-symbol-method-fg-color); + background-color: var(--doc-symbol-method-bg-color); +} + +code.doc-symbol-method::after { + content: "meth"; +} + +code.doc-symbol-class { + color: var(--doc-symbol-class-fg-color); + background-color: var(--doc-symbol-class-bg-color); +} + +code.doc-symbol-class::after { + content: "class"; +} + +code.doc-symbol-module { + color: var(--doc-symbol-module-fg-color); + background-color: var(--doc-symbol-module-bg-color); +} + +code.doc-symbol-module::after { + content: "mod"; +} + +.doc-signature .autorefs { + color: inherit; + border-bottom: 1px dotted currentcolor; +} diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.b4d07000.min.js b/assets/javascripts/bundle.b4d07000.min.js new file mode 100644 index 00000000..3c0bdad9 --- /dev/null +++ b/assets/javascripts/bundle.b4d07000.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var _=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():_))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

The Docker client object

+ + +
+ + + +

+ DockerClient + + +

+ + +
+ + +

Creates a Docker client

+

Note that

+
from python_on_whales import docker
+print(docker.run("hello-world"))
+
+

is equivalent to

+
from python_on_whales import DockerClient
+docker = DockerClient()
+print(docker.run("hello-world")
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
config +
+

Location of client config files (default "~/.docker")

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
context +
+

Name of the context to use to connect to the +daemon (overrides DOCKER_HOST env var +and default context set with "docker context use")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
debug +
+

Enable debug mode

+
+

+ + TYPE: + Optional[bool] + + + DEFAULT: + None + +

+
host +
+

Daemon socket(s) to connect to

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
log_level +
+

Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") +(default "info")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
tls +
+

Use TLS; implied by tlsverify

+
+

+ + TYPE: + Optional[bool] + + + DEFAULT: + None + +

+
tlscacert +
+

Trust certs signed only by this CA (default "~/.docker/ca.pem")

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
compose_files +
+

Docker compose yaml file

+
+

+ + TYPE: + List[ValidPath] + + + DEFAULT: + [] + +

+
compose_profiles +
+

List of compose profiles to use. Take a look at +the documentation for profiles.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
compose_env_file +
+

.env file containing the environments variables to inject +into the compose project. By default, it uses ./.env.

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
compose_project_name +
+

The name of the compose project. It will be prefixed to +networks, volumes and containers created by compose.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
compose_project_directory +
+

Use an alternate working directory. By default, it +uses the path of the compose file.

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
compose_compatibility +
+

Use docker compose in compatibility mode.

+
+

+ + TYPE: + Optional[bool] + + + DEFAULT: + None + +

+
client_call +
+

Client binary to use and how to call it. Default is ["docker"]. You can try with +for example ["podman"] or ["nerdctl"]. The client must have the same commands and +outputs as Docker to work. Some best effort support is done in case of divergences, +meaning you can report issues occuring on some other binary than Docker, but +we don't guarantee that it will be fixed. +This option is a list because you can provide a list of command line arguments to be placed after "docker". +For exemple host="ssh://my_user@host.com" is equivalent +to client_call=["docker", "--host=ssh://my_user@host.com"]. +This will allow you to use some exotic options that are not explicitly supported by Python-on-whales. +Let's say you want to use estargz to run a container immediately, without waiting for the "pull" +to finish (yes it's possible!), you can +do nerdctl = DockerClient(client_call=["nerdctl", "--snapshotter=stargz"]) +and then nerdctl.run("ghcr.io/stargz-containers/python:3.7-org", ["-c", "print('hi')"]). +You can also use this system to call Docker with sudo with client_call=["sudo", "docker"] +(note that it won't ask for your password, so sudo should be passwordless during the python +program execution).

+
+

+ + TYPE: + List[str] + + + DEFAULT: + ['docker'] + +

+
client_binary +
+

Deprecated, use client_call. If you used before client_binary="podman", now use +client_call=["podman"].

+
+

+ + TYPE: + str + + + DEFAULT: + 'docker' + +

+
client_type +
+

The kind of client that is called by the Python process. It allows Python-on-whales to +adapt to the client's behavior if two client have a different behavior. The client_call is not +enough for Python-on-whales to know what kind of client you're using. For example, if you use +a symlink to call Docker, Python-on-whales will not know that you're using Docker. +Default is "unknown". If at some point, Python-on-whales has to choose +a behavior and client_type is "unknown", it will raise an exception and ask you to specify +what kind of client you're working with. Valid values are "docker", "podman", "nerdctl" and "unknown".

+
+

+ + TYPE: + Literal['docker', 'podman', 'nerdctl', 'unknown'] + + + DEFAULT: + 'unknown' + +

+
+ + + + +
+ + + + + + + + + +
+ + +

+ login + + +

+
login(server=None, username=None, password=None)
+
+ +
+ +

Log in to a Docker registry.

+

If no server is specified, the default is defined by the daemon.

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
server +
+

The server to log into. For example, with a self-hosted registry +it might be something like server="192.168.0.10:5000"

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
username +
+

The username

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
password +
+

The password

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ login_ecr + + +

+
login_ecr(
+    aws_access_key_id=None,
+    aws_secret_access_key=None,
+    region_name=None,
+    registry=None,
+)
+
+ +
+ +

Login to the aws ECR registry. Credentials are taken from the +environment variables as defined in +the aws docs.

+

If you don't have a profile or your environment variables configured, you can also +use the function arguments aws_access_key_id, aws_secret_access_key, region_name.

+

Behind the scenes, those arguments are passed directly to

+
botocore.session.get_session().create_client(...)
+
+

You need botocore to run this function. Use pip install botocore to install it.

+

The registry parameter can be used to override the registry that is guessed from the authorization token +request's response. +In other words: If the registry is None (the default) then it will be assumed that it's the ECR registry linked to the credentials provided. +It is especially useful if the aws account you use can access several repositories and you +need to explicitly define the one you want to use

+ +
+ +
+ +
+ + +

+ logout + + +

+
logout(server=None)
+
+ +
+ +

Logout from a Docker registry

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
server +
+

The server to logout from. For example, with a self-hosted registry +it might be something like server="192.168.0.10:5000"

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ version + + +

+
version()
+
+ +
+ +

Get version information about the container client and server.

+

Returns

+
A `python_on_whales.Version` object
+
+

As an example:

+
from python_on_whales import docker
+
+version_info = docker.version()
+print(version_info.client.version)
+# 3.4.2
+print(version_info.server.kernel_version)
+# 5.15.133.1-microsoft-standard-WSL2
+...
+
+ +
+ +
+ + + +
+ +
+ +

Sub-commands

+ +

Other commands

+

They're actually aliases

+ +

About multithreading and multiprocessing

+

Behind the scenes, Python on whales calls the Docker command line interface with +subprocess. The Python on whales client does not store any intermediate state so it's safe +to use with multithreading.

+

The Docker objects store some intermediate states (the attributes +that you would normally get with docker ... inspectbut no logic in +the codebase depends on those attributes. They're just here so that users can look at them. +So you can share them between process/threads and pickle containers, images, networks...

+

The Docker daemon works with its own objects internally and handles concurrent and conflicting requests. +For example, if you create two containers with the same name from different threads, only one will +succeed. If you pull the same docker image from multiple processes/threads, the Docker daemon will +only pull the image and layers once.

+

Just be careful with some scenario similar to this one

+
Thread 1: my_container = docker.run(..., detach=True)
+...
+# my_container finishes
+...
+Thread 2: docker.container.prune()
+...
+Thread 1: docker.logs(my_container)  # will fail because the container was removed by thread 2
+
+

In the end, unless you use this type of logic in your code, +Python-on-whales is safe to use with multithreading and multiprocessing.

+

The Docker CLI

+

Python-on-whales needs the Docker CLI to work (unlike docker-py). +Most of the time, users already have the CLI installed on their machines. It's possible to +verify that the CLI is there by doing docker --help in the command line.

+

Sometimes, the CLI might not be available on the system, it can happen if you want to control +Docker from within a container with -v /var/run/docker.sock:/var/run/docker.sock, or if you +want to connect to a remote daemon with the host argument.

+

In this case, when using python-on-whales, the CLI will be downloaded automatically +(it's a single binary), and will be put in

+
pathlib.Path.home() / ".cache/python-on-whales/docker"
+
+

Since it's not in the PATH and was not downloaded with the package manager, it's only seen and +used by python-on-whales.

+

If you want to trigger the download manually (to avoid downloading the CLI at runtime), +you can run from your shell:

+
python-on-whales download-cli
+
+

Handling an unavailable client

+

Trying to use Python-on-whales when it cannot find or download a Docker client binary +will trigger a python_on_whales.ClientNotFoundError. You can use a try-except around +a first docker.ps() call to handle the case when Python-on-whales won't work.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/img/docker_clients.png b/img/docker_clients.png new file mode 100644 index 0000000000000000000000000000000000000000..3440debe864ea9f7952470febbf0da831181dea9 GIT binary patch literal 685125 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�F5{ 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 z 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 `bpxB|EUsJXol!*I$sT_s4Tm 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%0AGdI%b3uZHIO3_ti#bFKB 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 z

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%0Ax9ESNeS{AYc<*hR=BZg!k`|zm3j$ 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

+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Home

+ +

logo

+
+

Run tests +Code style: black +Imports: isort +License +Downloads

+
+

A Docker client for Python, designed to be fun and intuitive!

+

Works on Linux, macOS and Windows, for Python 3.8 and above.

+ +
+

How to install?

+
pip install python-on-whales
+
+

Some cool examples

+

Start by doing

+
from python_on_whales import docker
+
+

and then:

+ +

You get the idea 🙂 it's the same as the CLI we all know and love.

+
>>> from python_on_whales import docker
+
+>>> output = docker.run("hello-world")
+>>> print(output)
+
+Hello from Docker!
+This message shows that your installation appears to be working correctly.
+
+...
+
+
>>> from python_on_whales import docker
+>>> print(docker.run("nvidia/cuda:11.0-base", ["nvidia-smi"], gpus="all"))
++-----------------------------------------------------------------------------+
+| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
+|-------------------------------+----------------------+----------------------+
+| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
+| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+|                               |                      |               MIG M. |
+|===============================+======================+======================|
+|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
+| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
+|                               |                      |                  N/A |
++-------------------------------+----------------------+----------------------+
+
++-----------------------------------------------------------------------------+
+| Processes:                                                                  |
+|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
+|        ID   ID                                                   Usage      |
+|=============================================================================|
+|  No running processes found                                                 |
++-----------------------------------------------------------------------------+
+
+
>>> from python_on_whales import docker
+>>> my_docker_image = docker.pull("ubuntu:20.04")
+20.04: Pulling from library/ubuntu
+e6ca3592b144: Downloading [=============>                                     ]  7.965MB/28.56MB
+534a5505201d: Download complete
+990916bd23bb: Download complete
+
+>>> print(my_docker_image.repo_tags)
+['ubuntu:20.04']
+
+>>> docker.image.list()
+[python_on_whales.Image(id='sha256:1a437e363abfa', tags=['ubuntu:20.04'])]
+
+>>> my_docker_image.remove()
+
+
>>> from python_on_whales import docker
+>>> my_image = docker.build(".", tags="some_name")  # uses Buildx/buildkit by default
+[+] Building 1.6s (17/17) FINISHED
+ => [internal] load build definition from Dockerfile                                                            0.0s
+ => => transferring dockerfile: 32B                                                                             0.0s
+ => [internal] load .dockerignore                                                                               0.0s
+ => => transferring context: 2B                                                                                 0.0s
+ => [internal] load metadata for docker.io/library/python:3.6                                                   1.4s
+ => [python_dependencies 1/5] FROM docker.io/library/python:3.6@sha256:29328c59adb9ee6acc7bea8eb86d0cb14033c85  0.0s
+ => [internal] load build context                                                                               0.1s
+ => => transferring context: 72.86kB                                                                            0.0s
+ => CACHED [python_dependencies 2/5] RUN pip install typeguard pydantic requests tqdm                           0.0s
+ => CACHED [python_dependencies 3/5] COPY tests/test-requirements.txt /tmp/                                     0.0s
+ => CACHED [python_dependencies 4/5] COPY requirements.txt /tmp/                                                0.0s
+ => CACHED [python_dependencies 5/5] RUN pip install -r /tmp/test-requirements.txt -r /tmp/requirements.txt     0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 1/7] RUN apt-get update &&     apt-get install -y       apt-tr  0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 2/7] RUN curl -fsSL https://download.docker.com/linux/ubuntu/g  0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 3/7] RUN add-apt-repository    "deb [arch=amd64] https://downl  0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 4/7] RUN  apt-get update &&      apt-get install -y docker-ce-  0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 5/7] WORKDIR /python-on-whales                                  0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 6/7] COPY . .                                                   0.0s
+ => CACHED [tests_ubuntu_install_without_buildx 7/7] RUN pip install -e .                                       0.0s
+ => exporting to image                                                                                          0.1s
+ => => exporting layers                                                                                         0.0s
+ => => writing image sha256:e1c2382d515b097ebdac4ed189012ca3b34ab6be65ba0c650421ebcac8b70a4d                    0.0s
+ => => naming to docker.io/library/some_image_name
+
+

Some more docker.run() advanced examples with postgres

+
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
+
+

becomes

+
from python_on_whales import docker
+
+docker.run(
+    "postgres:9.6",
+    name="some-postgres",
+    envs={"POSTGRES_PASSWORD": "mysecretpassword"},
+    detach=True,
+)
+print(docker.ps())
+# [python_on_whales.Container(id='f5fb939c409d', name='some-postgres')]
+
+
+
docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres
+
+

becomes

+
from python_on_whales import docker
+
+# since it's interactive, you'll be dropped into the psql shell. The python code
+# will continue only after you exit the shell.
+docker.run(
+    "postgres:9.6",
+    ["psql", "-h", "some-postgres", "-U", "postgres"],
+    networks=["some-network"],
+    interactive=True,
+    tty=True,
+    remove=True,
+)
+
+
+
docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -e PGDATA=/var/lib/postgresql/data/pgdata -v /custom/mount:/var/lib/postgresql/data -v myvolume:/tmp/myvolume postgres -c shared_buffers=256MB -c max_connections=200
+
+

becomes

+
from python_on_whales import docker
+
+docker.run(
+    "postgres:9.6",
+    ["-c", "shared_buffers=256MB", "-c", "max_connections=200"],
+    name="some-postgres",
+    envs={"POSTGRES_PASSWORD": "mysecretpassword", "PGDATA": "/var/lib/postgresql/data/pgdata"},
+    volumes=[("/custom/mount", "/var/lib/postgresql/data"), ("myvolume", "/tmp/myvolume")],
+    detach=True,
+)
+
+

Any Docker object can be used as a context manager to ensure it's removed even if an exception occurs:

+
from python_on_whales import docker
+
+with docker.volume.create("random_name") as some_volume:
+    docker.run(
+        "postgres:9.6",
+        ["-c", "shared_buffers=256MB", "-c", "max_connections=200"],
+        name="some-postgres",
+        envs={"POSTGRES_PASSWORD": "mysecretpassword", "PGDATA": "/var/lib/postgresql/data/pgdata"},
+        volumes=[(some_volume, "/var/lib/postgresql/data"), ("myvolume", "/tmp/myvolume")],
+        detach=True,
+    )
+    # so some stuff here
+
+# here we are out of the context manager, so the volume has been removed, even if there was an exception.
+
+

Main features

+
    +
  • 1 to 1 mapping between the CLI interface and the Python API. No need to look in the docs +what is the name of the function/argument you need.
  • +
  • Support for the latest Docker features: +Docker buildx/buildkit, +docker run --gpu=all ...
  • +
  • Support for Docker stack, services and Swarm (same API as the command line).
  • +
  • Progress bars and progressive outputs when pulling, pushing, loading, building...
  • +
  • Support for some other CLI commands that are not in Docker-py: +docker cp, docker run --cpus ... and more.
  • +
  • Nice SSH support for remote daemons.
  • +
  • Docker object as Python objects: Container, Images, Volumes, Services... and their +attributes are updated in real-time!
  • +
  • Each Docker object can be used as a context manager. When getting out of the +context, the Docker object is removed automatically, even if an exception occurs.
  • +
  • A fully typed API (Mypy and IDE-friendly) compatible with pathlib and os.path
  • +
  • All Docker objects and the Docker client are safe to use with multithreading and multiprocessing.
  • +
  • Display the commands called and the environment variables used by setting the environment variable PYTHON_ON_WHALES_DEBUG=1.
  • +
+

Why another project? Why not build on Docker-py?

+

In a sense this project is built on top of Docker-py +because the implementation, the organisation and the API is inspired from the project, but the codebases +could not be the same.

+

Two major differences do not permit that:

+

1) The API is quite different. The aim of Python on Whales is to provide a 1-to-1 +mapping between the Docker command line and Python, so that users don't even have +to open the docs to do write code.

+

2) While Docker-py is a complete re-implementation of the Docker client binary +(written in Go), Python on whales sits on top of the Docker client binary, which makes +implementing new features much easier and safer. For example, it's +unlikely that docker-py supports Buildx/buildkit +anytime soon because rewriting a large Go codebase in Python is hard work.

+

+

Should I use Docker-py or Python on Whales?

+

Well, it's written in each project's description!

+
    +
  • Docker-py: A Python library for the Docker Engine API
  • +
  • Python on whales: An awesome Python wrapper for an awesome Docker CLI
  • +
+

If you need to talk to the Docker engine directly, you need to do low level operations, +use docker-py. Some good example would be writing the code to control docker from an IDE, +or if the speed of Docker calls is very important. +If you don't want to depend on the Docker CLI binary (~50MB), use docker-py.

+

If you wanted to call the docker command line from Python, +do high level operations, use Python on Whales. +For example if you want to write your CI logic in Python rather than in bash (a very good choice 😉). +Some commands are only available in Python on whales +too: docker.buildx.build(...), docker.stack.deploy(...)...

+

Use the right tool for the right job 🙂

+

Alternatives to Docker: Podman, nerdctl...

+

Support for Docker-compatible clients like Podman and Nerdctl was introduced in Python-on-whales version 0.44.0.

+

You can use an arbitrary binary to execute Docker commands by using the argument client_call of python_on_whales.DockerCLient. +Here is an example:

+
>>> from python_on_whales import DockerClient
+
+>>> nerdctl = DockerClient(client_call=["nerdctl"])
+
+>>> nerdctl.pull("python:3.9")
+docker.io/library/python:3.9:                                                     resolved       |++++++++++++++++++++++++++++++++++++++|
+index-sha256:a83c0aa6471527636d7331c30704d0f88e0ab3331bbc460d4ae2e53bbae64dca:    done           |++++++++++++++++++++++++++++++++++++++|
+manifest-sha256:8ccef93ff3c9e1bb9562d394526cdc6834033a0498073d41baa8b309f4fac20e: done           |++++++++++++++++++++++++++++++++++++++|
+config-sha256:f033692e2c5abe1e0ee34bcca759a3e4432b10b0031174b08d48bcc90d14d68b:   done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:9952b1051adaff513c99f86765361450af108b12b0073d0ba40255c4e419b481:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:c766e27afb21eddf9ab3e4349700ebe697c32a4c6ada6af4f08282277a291a28:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:1535e3c1181a81ea66d5bacb16564e4da2ba96304506598be39afe9c82b21c5c:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:6de7cb7bdc8f9b4c4d6539233fe87304aa1a6427c3238183265c9f02d831eddb:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:967757d5652770cfa81b6cc7577d65e06d336173da116d1fb5b2d349d5d44127:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:c357e2c68cb3bf1e98dcb3eb6ceb16837253db71535921d6993c594588bffe04:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:26787c68cf0c92a778db814d327e283fe1da4434a7fea1f0232dae8002e38f33:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:6aefca2dc61dcbcd268b8a9861e552f9cdb69e57242faec64ac120d2355a9c1a:    done           |++++++++++++++++++++++++++++++++++++++|
+layer-sha256:32a180f5cf85702e7680719c40c39c07972b1176355df5a621de9eb87ad07ce2:    done           |++++++++++++++++++++++++++++++++++++++|
+elapsed: 35.9s                                                                    total:  333.5  (9.3 MiB/s)
+
+python_on_whales.Image(id='sha256:f033692e2c5ab', tags=['python:3.9'])
+
+

You can do something similar with podman:

+
from python_on_whales import DockerClient
+
+podman = DockerClient(client_call=["podman"])
+
+podman.pull("hello-world")
+podman.run("hello-world")
+print(podman.ps())
+...
+
+

Contributing

+

Any and all PRs are welcome. Please see this documentation.

+

What about the license?

+

It's a MIT license, so quite permissive.

+

The license can be found in the git repository.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..5f82d124bdefbf523f74c51f4e2e71d82a9a40a8 GIT binary patch literal 2355 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 Z8j=T-*6OmhYjri@Rht3P{{d0(&AS{!c+UU; literal 0 HcmV?d00001 diff --git a/objects/builders/index.html b/objects/builders/index.html new file mode 100644 index 00000000..74ad58bd --- /dev/null +++ b/objects/builders/index.html @@ -0,0 +1,1083 @@ + + + + + + + + + + + + + + + + + + + + + + + + Builders - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker builders

+

The Buildx builders objects.

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_builder = docker.buildx.inspect("my-builder")
+
+# or
+
+my_builder = docker.buildx.create()
+
+
+

For type hints, use this

+
from python_on_whales import Builder
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker buildx inspect ...

+

Only a few are available at the moment

+
In [1]: from python_on_whales import docker
+
+In [2]: my_builder = docker.buildx.create()
+
+In [4]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [4]: super_print(builder.name)
+type = <class 'str'>, value = sleepy_elbakyan
+
+In [5]: super_print(builder.driver)
+type = <class 'str'>, value = docker-container
+
+
+

Methods

+ + +
+ + + +

+ Builder + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ remove + + +

+
remove()
+
+ +
+ +

Removes this builder. After this operation the builder cannot be used anymore.

+

If you use the builder as a context manager, it will call this function when +you exit the context manager.

+
from python_on_whales import docker
+
+buildx_builder = docker.buildx.create(use=True)
+with buildx_builder:
+    docker.build(".")
+
+# now the variable buildx_builder is not usable since we're out of the context manager.
+# the .remove() method was called behind the scenes
+# since it was the current builder, 'default' is now the current builder.
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/configs/index.html b/objects/configs/index.html new file mode 100644 index 00000000..bd882f22 --- /dev/null +++ b/objects/configs/index.html @@ -0,0 +1,1096 @@ + + + + + + + + + + + + + + + + + + + + + + + + Configs - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker configs

+

Configs objects present in Swarm mode

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_config = docker.config.inspect("my-config-name")
+
+# or
+
+my_config = docker.config.create("my_config_name", "my_config_file")
+
+

For type hints, use this

+
from python_on_whales import Config
+
+def print_config_labels(config: Config):
+    print(config.spec.labels)
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker config inspect ...

+

To get a complete description of those attributes, you +can take a look at the daemon api reference page +and click on "200 No error".

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: config = docker.config.create("my_config", "./config_file.cfg", labels=dict(hello="world"))
+
+In [3]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [4]: super_print(config.id)
+type = <class 'str'>, value = vdvrpzslm08gpahzjkq5fg505
+
+In [5]: super_print(config.version.index)
+type = <class 'int'>, value = 11
+
+In [6]: super_print(config.created_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:28.636523+00:00
+
+In [7]: super_print(config.updated_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:28.636523+00:00
+
+In [8]: super_print(config.spec.name)
+type = <class 'str'>, value = my_config
+
+In [9]: super_print(config.spec.labels)
+type = <class 'dict'>, value = {'hello': 'world'}
+
+In [10]: super_print(config.spec.data)
+type = <class 'str'>, value = SGVsbG8gd29ybGQh
+
+In [11]: super_print(config.spec.templating)
+type = <class 'NoneType'>, value = None
+
+
+

Methods

+ + +
+ + + +

+ Config + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ remove + + +

+
remove()
+
+ +
+ +

Remove this config.

+

Note that you can also use a python_on_whales.Config as a context manager +to ensure it's removed even if an exception occurs.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/containers/index.html b/objects/containers/index.html new file mode 100644 index 00000000..f6551ac5 --- /dev/null +++ b/objects/containers/index.html @@ -0,0 +1,1836 @@ + + + + + + + + + + + + + + + + + + + + + + + + Containers - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker containers

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_container = docker.container.inspect("my-container-name")
+
+# for example:
+if my_container.state.running:
+    my_container.kill()
+
+
+

For type hints, use this

+
from python_on_whales import Container
+
+def print_dodo(container: Container):
+    print(container.execute(["echo", "dodo"]))
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker container inspect ...

+

If you want to know the exact structure, you can go to the +docker container inspect reference page +and click on "200 no error". +An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: container = docker.run("ubuntu", ["sleep", "infinity"], detach=True)
+
+In [4]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [4]: super_print(container.id)
+type = <class 'str'>, value = 0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad
+
+In [5]: super_print(container.created)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:42.492387+00:00
+
+In [6]: super_print(container.path)
+type = <class 'str'>, value = sleep
+
+In [7]: super_print(container.args)
+type = <class 'list'>, value = ['infinity']
+
+In [8]: super_print(container.state.status)
+type = <class 'str'>, value = running
+
+In [9]: super_print(container.state.running)
+type = <class 'bool'>, value = True
+
+In [10]: super_print(container.state.paused)
+type = <class 'bool'>, value = False
+
+In [11]: super_print(container.state.restarting)
+type = <class 'bool'>, value = False
+
+In [12]: super_print(container.state.oom_killed)
+type = <class 'bool'>, value = False
+
+In [13]: super_print(container.state.dead)
+type = <class 'bool'>, value = False
+
+In [14]: super_print(container.state.pid)
+type = <class 'int'>, value = 2696
+
+In [15]: super_print(container.state.exit_code)
+type = <class 'int'>, value = 0
+
+In [16]: super_print(container.state.error)
+type = <class 'str'>, value = 
+
+In [17]: super_print(container.state.started_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:42.690774+00:00
+
+In [18]: super_print(container.state.finished_at)
+type = <class 'datetime.datetime'>, value = 0001-01-01 00:00:00+00:00
+
+In [19]: super_print(container.state.health)
+type = <class 'NoneType'>, value = None
+
+In [20]: super_print(container.image)
+type = <class 'str'>, value = sha256:35a88802559dd2077e584394471ddaa1a2c5bfd16893b829ea57619301eb3908
+
+In [21]: super_print(container.resolv_conf_path)
+type = <class 'str'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/resolv.conf
+
+In [22]: super_print(container.hostname_path)
+type = <class 'pathlib.PosixPath'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/hostname
+
+In [23]: super_print(container.hosts_path)
+type = <class 'pathlib.PosixPath'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/hosts
+
+In [24]: super_print(container.log_path)
+type = <class 'pathlib.PosixPath'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad-json.log
+
+In [25]: super_print(container.node)
+type = <class 'NoneType'>, value = None
+
+In [26]: super_print(container.name)
+type = <class 'str'>, value = tender_dubinsky
+
+In [27]: super_print(container.restart_count)
+type = <class 'int'>, value = 0
+
+In [28]: super_print(container.driver)
+type = <class 'str'>, value = overlay2
+
+In [29]: super_print(container.platform)
+type = <class 'str'>, value = linux
+
+In [30]: super_print(container.mount_label)
+type = <class 'str'>, value = 
+
+In [31]: super_print(container.process_label)
+type = <class 'str'>, value = 
+
+In [32]: super_print(container.app_armor_profile)
+type = <class 'str'>, value = docker-default
+
+In [33]: super_print(container.exec_ids)
+type = <class 'NoneType'>, value = None
+
+In [34]: super_print(container.host_config.cpu_shares)
+type = <class 'int'>, value = 0
+
+In [35]: super_print(container.host_config.memory)
+type = <class 'int'>, value = 0
+
+In [36]: super_print(container.host_config.cgroup_parent)
+type = <class 'pathlib.PosixPath'>, value = .
+
+In [37]: super_print(container.host_config.blkio_weight)
+type = <class 'int'>, value = 0
+
+In [38]: super_print(container.host_config.blkio_weight_device)
+type = <class 'list'>, value = []
+
+In [39]: super_print(container.host_config.blkio_device_read_bps)
+type = <class 'list'>, value = []
+
+In [40]: super_print(container.host_config.blkio_device_write_bps)
+type = <class 'list'>, value = []
+
+In [41]: super_print(container.host_config.blkio_device_read_iops)
+type = <class 'list'>, value = []
+
+In [42]: super_print(container.host_config.blkio_device_write_iops)
+type = <class 'list'>, value = []
+
+In [43]: super_print(container.host_config.cpu_period)
+type = <class 'int'>, value = 0
+
+In [44]: super_print(container.host_config.cpu_quota)
+type = <class 'int'>, value = 0
+
+In [45]: super_print(container.host_config.cpu_realtime_period)
+type = <class 'int'>, value = 0
+
+In [46]: super_print(container.host_config.cpu_realtime_runtime)
+type = <class 'int'>, value = 0
+
+In [47]: super_print(container.host_config.cpuset_cpus)
+type = <class 'str'>, value = 
+
+In [48]: super_print(container.host_config.cpuset_mems)
+type = <class 'str'>, value = 
+
+In [49]: super_print(container.host_config.devices)
+type = <class 'list'>, value = []
+
+In [50]: super_print(container.host_config.device_cgroup_rules)
+type = <class 'NoneType'>, value = None
+
+In [51]: super_print(container.host_config.device_requests)
+type = <class 'NoneType'>, value = None
+
+In [52]: super_print(container.host_config.kernel_memory)
+type = <class 'NoneType'>, value = None
+
+In [53]: super_print(container.host_config.kernel_memory_tcp)
+type = <class 'NoneType'>, value = None
+
+In [54]: super_print(container.host_config.memory_reservation)
+type = <class 'int'>, value = 0
+
+In [55]: super_print(container.host_config.memory_swap)
+type = <class 'int'>, value = 0
+
+In [56]: super_print(container.host_config.memory_swappiness)
+type = <class 'NoneType'>, value = None
+
+In [57]: super_print(container.host_config.nano_cpus)
+type = <class 'int'>, value = 0
+
+In [58]: super_print(container.host_config.oom_kill_disable)
+type = <class 'NoneType'>, value = None
+
+In [59]: super_print(container.host_config.init)
+type = <class 'NoneType'>, value = None
+
+In [60]: super_print(container.host_config.pids_limit)
+type = <class 'NoneType'>, value = None
+
+In [61]: super_print(container.host_config.ulimits)
+type = <class 'list'>, value = []
+
+In [62]: super_print(container.host_config.cpu_count)
+type = <class 'int'>, value = 0
+
+In [63]: super_print(container.host_config.cpu_percent)
+type = <class 'int'>, value = 0
+
+In [64]: super_print(container.host_config.binds)
+type = <class 'NoneType'>, value = None
+
+In [65]: super_print(container.host_config.container_id_file)
+type = <class 'pathlib.PosixPath'>, value = .
+
+In [66]: super_print(container.host_config.log_config.type)
+type = <class 'str'>, value = json-file
+
+In [67]: super_print(container.host_config.log_config.config)
+type = <class 'dict'>, value = {}
+
+In [68]: super_print(container.host_config.network_mode)
+type = <class 'str'>, value = bridge
+
+In [69]: super_print(container.host_config.port_bindings)
+type = <class 'dict'>, value = {}
+
+In [70]: super_print(container.host_config.restart_policy.name)
+type = <class 'str'>, value = no
+
+In [71]: super_print(container.host_config.restart_policy.maximum_retry_count)
+type = <class 'int'>, value = 0
+
+In [72]: super_print(container.host_config.auto_remove)
+type = <class 'bool'>, value = False
+
+In [73]: super_print(container.host_config.volume_driver)
+type = <class 'str'>, value = 
+
+In [74]: super_print(container.host_config.volumes_from)
+type = <class 'NoneType'>, value = None
+
+In [75]: super_print(container.host_config.mounts)
+type = <class 'NoneType'>, value = None
+
+In [76]: super_print(container.host_config.capabilities)
+type = <class 'NoneType'>, value = None
+
+In [77]: super_print(container.host_config.cap_add)
+type = <class 'NoneType'>, value = None
+
+In [78]: super_print(container.host_config.cap_drop)
+type = <class 'NoneType'>, value = None
+
+In [79]: super_print(container.host_config.dns)
+type = <class 'list'>, value = []
+
+In [80]: super_print(container.host_config.dns_options)
+type = <class 'list'>, value = []
+
+In [81]: super_print(container.host_config.dns_search)
+type = <class 'list'>, value = []
+
+In [82]: super_print(container.host_config.extra_hosts)
+type = <class 'NoneType'>, value = None
+
+In [83]: super_print(container.host_config.group_add)
+type = <class 'NoneType'>, value = None
+
+In [84]: super_print(container.host_config.ipc_mode)
+type = <class 'str'>, value = private
+
+In [85]: super_print(container.host_config.cgroup)
+type = <class 'str'>, value = 
+
+In [86]: super_print(container.host_config.links)
+type = <class 'NoneType'>, value = None
+
+In [87]: super_print(container.host_config.oom_score_adj)
+type = <class 'int'>, value = 0
+
+In [88]: super_print(container.host_config.pid_mode)
+type = <class 'str'>, value = 
+
+In [89]: super_print(container.host_config.privileged)
+type = <class 'bool'>, value = False
+
+In [90]: super_print(container.host_config.publish_all_ports)
+type = <class 'bool'>, value = False
+
+In [91]: super_print(container.host_config.readonly_rootfs)
+type = <class 'bool'>, value = False
+
+In [92]: super_print(container.host_config.security_opt)
+type = <class 'NoneType'>, value = None
+
+In [93]: super_print(container.host_config.storage_opt)
+type = <class 'NoneType'>, value = None
+
+In [94]: super_print(container.host_config.tmpfs)
+type = <class 'NoneType'>, value = None
+
+In [95]: super_print(container.host_config.uts_mode)
+type = <class 'str'>, value = 
+
+In [96]: super_print(container.host_config.userns_mode)
+type = <class 'str'>, value = 
+
+In [97]: super_print(container.host_config.shm_size)
+type = <class 'int'>, value = 67108864
+
+In [98]: super_print(container.host_config.sysctls)
+type = <class 'NoneType'>, value = None
+
+In [99]: super_print(container.host_config.runtime)
+type = <class 'str'>, value = runc
+
+In [100]: super_print(container.host_config.console_size)
+type = <class 'tuple'>, value = (0, 0)
+
+In [101]: super_print(container.host_config.isolation)
+type = <class 'str'>, value = 
+
+In [102]: super_print(container.host_config.masked_paths)
+type = <class 'list'>, value = [PosixPath('/proc/asound'), PosixPath('/proc/acpi'), PosixPath('/proc/kcore'), PosixPath('/proc/keys'), PosixPath('/proc/latency_stats'), PosixPath('/proc/timer_list'), PosixPath('/proc/timer_stats'), PosixPath('/proc/sched_debug'), PosixPath('/proc/scsi'), PosixPath('/sys/firmware'), PosixPath('/sys/devices/virtual/powercap')]
+
+In [103]: super_print(container.host_config.readonly_paths)
+type = <class 'list'>, value = [PosixPath('/proc/bus'), PosixPath('/proc/fs'), PosixPath('/proc/irq'), PosixPath('/proc/sys'), PosixPath('/proc/sysrq-trigger')]
+
+In [104]: super_print(container.graph_driver.name)
+type = <class 'str'>, value = overlay2
+
+In [105]: super_print(container.graph_driver.data)
+type = <class 'dict'>, value = {'LowerDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e-init/diff:/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/diff', 'MergedDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e/merged', 'UpperDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e/diff', 'WorkDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e/work'}
+
+In [106]: super_print(container.size_rw)
+type = <class 'NoneType'>, value = None
+
+In [107]: super_print(container.size_root_fs)
+type = <class 'NoneType'>, value = None
+
+In [108]: super_print(container.mounts)
+type = <class 'list'>, value = []
+
+In [109]: super_print(container.config.hostname)
+type = <class 'str'>, value = 0c8e70d55ff6
+
+In [110]: super_print(container.config.domainname)
+type = <class 'str'>, value = 
+
+In [111]: super_print(container.config.user)
+type = <class 'str'>, value = 
+
+In [112]: super_print(container.config.attach_stdin)
+type = <class 'bool'>, value = False
+
+In [113]: super_print(container.config.attach_stdout)
+type = <class 'bool'>, value = False
+
+In [114]: super_print(container.config.attach_stderr)
+type = <class 'bool'>, value = False
+
+In [115]: super_print(container.config.exposed_ports)
+type = <class 'NoneType'>, value = None
+
+In [116]: super_print(container.config.tty)
+type = <class 'bool'>, value = False
+
+In [117]: super_print(container.config.open_stdin)
+type = <class 'bool'>, value = False
+
+In [118]: super_print(container.config.stdin_once)
+type = <class 'bool'>, value = False
+
+In [119]: super_print(container.config.env)
+type = <class 'list'>, value = ['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin']
+
+In [120]: super_print(container.config.cmd)
+type = <class 'list'>, value = ['sleep', 'infinity']
+
+In [121]: super_print(container.config.healthcheck)
+type = <class 'NoneType'>, value = None
+
+In [122]: super_print(container.config.args_escaped)
+type = <class 'NoneType'>, value = None
+
+In [123]: super_print(container.config.image)
+type = <class 'str'>, value = ubuntu
+
+In [124]: super_print(container.config.volumes)
+type = <class 'NoneType'>, value = None
+
+In [125]: super_print(container.config.working_dir)
+type = <class 'pathlib.PosixPath'>, value = .
+
+In [126]: super_print(container.config.entrypoint)
+type = <class 'NoneType'>, value = None
+
+In [127]: super_print(container.config.network_disabled)
+type = <class 'NoneType'>, value = None
+
+In [128]: super_print(container.config.mac_address)
+type = <class 'NoneType'>, value = None
+
+In [129]: super_print(container.config.on_build)
+type = <class 'NoneType'>, value = None
+
+In [130]: super_print(container.config.labels)
+type = <class 'dict'>, value = {'org.opencontainers.image.ref.name': 'ubuntu', 'org.opencontainers.image.version': '24.04'}
+
+In [131]: super_print(container.config.stop_signal)
+type = <class 'NoneType'>, value = None
+
+In [132]: super_print(container.config.stop_timeout)
+type = <class 'NoneType'>, value = None
+
+In [133]: super_print(container.config.shell)
+type = <class 'NoneType'>, value = None
+
+In [134]: super_print(container.network_settings.bridge)
+type = <class 'str'>, value = 
+
+In [135]: super_print(container.network_settings.sandbox_id)
+type = <class 'str'>, value = 22e349989b55b73ca9d0fd1eef5d3328aa27ca13991716ee7e0d0293c844409d
+
+In [136]: super_print(container.network_settings.hairpin_mode)
+type = <class 'bool'>, value = False
+
+In [137]: super_print(container.network_settings.link_local_ipv6_address)
+type = <class 'str'>, value = 
+
+In [138]: super_print(container.network_settings.link_local_ipv6_prefix_length)
+type = <class 'int'>, value = 0
+
+In [139]: super_print(container.network_settings.ports)
+type = <class 'dict'>, value = {}
+
+In [140]: super_print(container.network_settings.sandbox_key)
+type = <class 'pathlib.PosixPath'>, value = /var/run/docker/netns/22e349989b55
+
+In [141]: super_print(container.network_settings.secondary_ip_addresses)
+type = <class 'NoneType'>, value = None
+
+In [142]: super_print(container.network_settings.secondary_ipv6_addresses)
+type = <class 'NoneType'>, value = None
+
+In [143]: super_print(container.network_settings.endpoint_id)
+type = <class 'str'>, value = 4152cafa6948b742e16047abaaadd4d4b676d214b07b96946a8f57b34eafa68e
+
+In [144]: super_print(container.network_settings.gateway)
+type = <class 'str'>, value = 172.17.0.1
+
+In [145]: super_print(container.network_settings.global_ipv6_address)
+type = <class 'str'>, value = 
+
+In [146]: super_print(container.network_settings.global_ipv6_prefix_length)
+type = <class 'int'>, value = 0
+
+In [147]: super_print(container.network_settings.ip_address)
+type = <class 'str'>, value = 172.17.0.2
+
+In [148]: super_print(container.network_settings.ip_prefix_length)
+type = <class 'int'>, value = 16
+
+In [149]: super_print(container.network_settings.ipv6_gateway)
+type = <class 'str'>, value = 
+
+In [150]: super_print(container.network_settings.mac_address)
+type = <class 'str'>, value = 02:42:ac:11:00:02
+
+In [151]: super_print(container.network_settings.networks)
+type = <class 'dict'>, value = {'bridge': NetworkInspectResult(ipam_config=None, links=None, aliases=None, network_id='399724f5350f5e034c13aac3f6148368985003610391d744df7943e83b4f85b2', endpoint_id='4152cafa6948b742e16047abaaadd4d4b676d214b07b96946a8f57b34eafa68e', gateway='172.17.0.1', ip_address='172.17.0.2', ip_prefix_length=16, ipv6_gateway='', global_ipv6_address='', global_ipv6_prefix_length=0, mac_address='02:42:ac:11:00:02', driver_options=None)}
+
+
+

Methods

+ + +
+ + + +

+ Container + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ attach + + +

+
attach(detach_keys=None, stdin=True, sig_proxy=True)
+
+ +
+ +

Attach local standard input, output, and error streams to a running container.

+

Alias: docker.attach(...)

+

See the docker.container.attach command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ commit + + +

+
commit(tag=None, author=None, message=None, pause=True)
+
+ +
+ +

Create a new image from the container's changes.

+

Alias: docker.commit(...)

+

See the docker.container.commit command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ diff + + +

+
diff()
+
+ +
+ +

Returns the diff of this container filesystem.

+

See the docker.container.diff command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ execute + + +

+
execute(
+    command,
+    detach=False,
+    envs={},
+    env_files=[],
+    interactive=False,
+    privileged=False,
+    tty=False,
+    user=None,
+    workdir=None,
+    stream=False,
+    detach_keys=None,
+)
+
+ +
+ +

Execute a command in this container

+

See the docker.container.execute +command for information about the arguments.

+ +
+ +
+ +
+ + +

+ exists + + +

+
exists()
+
+ +
+ +

Returns True if the docker container exists and False if it doesn't exists.

+

If it doesn't exists, it most likely mean that it was removed.

+

See the docker.container.exists command for information about the arguments.

+ +
+ +
+ +
+ + +

+ export + + +

+
export(output)
+
+ +
+ +

Export this container filesystem.

+

See the docker.container.export command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ kill + + +

+
kill(signal=None)
+
+ +
+ +

Kill this container

+

See the docker.container.kill command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ logs + + +

+
logs(
+    *,
+    details=False,
+    since=None,
+    tail=None,
+    timestamps=False,
+    until=None
+)
+
+ +
+ +

Returns the logs of the container

+

See the docker.container.logs command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ pause + + +

+
pause()
+
+ +
+ +

Pause this container.

+

See the docker.container.pause command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(force=False, volumes=False)
+
+ +
+ +

Remove this container.

+

See the docker.container.remove command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ rename + + +

+
rename(new_name)
+
+ +
+ +

Rename this container

+

See the docker.container.rename command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ restart + + +

+
restart(time=None)
+
+ +
+ +

Restarts this container.

+

See the docker.container.restart command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ start + + +

+
start(
+    attach=False,
+    interactive=False,
+    stream=False,
+    detach_keys=None,
+)
+
+ +
+ +

Starts this container.

+

See the docker.container.start command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ stop + + +

+
stop(time=None)
+
+ +
+ +

Stops this container.

+

See the docker.container.stop command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ unpause + + +

+
unpause()
+
+ +
+ +

Unpause the container

+

See the docker.container.unpause command for +information about the arguments.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/images/index.html b/objects/images/index.html new file mode 100644 index 00000000..3f79b4a5 --- /dev/null +++ b/objects/images/index.html @@ -0,0 +1,1252 @@ + + + + + + + + + + + + + + + + + + + + + + + + Images - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker images

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_docker_image = docker.image.inspect("my-image-name")
+
+# or
+
+my_docker_image = docker.pull("my-image-name")
+
+

For type hints, use this

+
from python_on_whales import docker, Image
+
+def print_dodo(image: Image):
+    print(docker.run(image, ["echo", "dodo"]))
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker image inspect ...

+

To get a complete description of those attributes, you +can take a look at the daemon api reference page +and click on "200 No error".

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: image = docker.pull("ubuntu")
+20.04: Pulling from library/ubuntu
+6a5697faee43: Pull complete
+ba13d3bc422b: Pull complete
+a254829d9e55: Pull complete
+Digest: sha256:fff16eea1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
+Status: Downloaded newer image for ubuntu:latest
+docker.io/library/ubuntu:latest
+
+In [3]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [4]: super_print(image.id)
+type = <class 'str'>, value = sha256:35a88802559dd2077e584394471ddaa1a2c5bfd16893b829ea57619301eb3908
+
+In [5]: super_print(image.repo_tags)
+type = <class 'list'>, value = ['ubuntu:latest']
+
+In [6]: super_print(image.repo_digests)
+type = <class 'list'>, value = ['ubuntu@sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30']
+
+In [7]: super_print(image.parent)
+type = <class 'str'>, value = 
+
+In [8]: super_print(image.comment)
+type = <class 'str'>, value = 
+
+In [9]: super_print(image.created)
+type = <class 'datetime.datetime'>, value = 2024-06-07 12:00:09.099611+00:00
+
+In [10]: super_print(image.container)
+type = <class 'NoneType'>, value = None
+
+In [11]: super_print(image.container_config)
+type = <class 'NoneType'>, value = None
+
+In [12]: super_print(image.docker_version)
+type = <class 'str'>, value = 24.0.5
+
+In [13]: super_print(image.author)
+type = <class 'str'>, value = 
+
+In [14]: super_print(image.config)
+type = <class 'python_on_whales.components.container.models.ContainerConfig'>, value = hostname='' domainname='' user='' attach_stdin=False attach_stdout=False attach_stderr=False exposed_ports=None tty=False open_stdin=False stdin_once=False env=['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'] cmd=['/bin/bash'] healthcheck=None args_escaped=None image='sha256:5333392d4deeb70ab614d13914296b3ed15740bbf2c6e8557d681bc451013010' volumes=None working_dir=PosixPath('.') entrypoint=None network_disabled=None mac_address=None on_build=None labels={'org.opencontainers.image.ref.name': 'ubuntu', 'org.opencontainers.image.version': '24.04'} stop_signal=None stop_timeout=None shell=None systemd_mode=None
+
+In [15]: super_print(image.architecture)
+type = <class 'str'>, value = amd64
+
+In [16]: super_print(image.os)
+type = <class 'str'>, value = linux
+
+In [17]: super_print(image.os_version)
+type = <class 'NoneType'>, value = None
+
+In [18]: super_print(image.size)
+type = <class 'int'>, value = 78046512
+
+In [19]: super_print(image.virtual_size)
+type = <class 'NoneType'>, value = None
+
+In [20]: super_print(image.graph_driver.name)
+type = <class 'str'>, value = overlay2
+
+In [21]: super_print(image.graph_driver.data)
+type = <class 'dict'>, value = {'MergedDir': '/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/merged', 'UpperDir': '/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/diff', 'WorkDir': '/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/work'}
+
+In [22]: super_print(image.root_fs.type)
+type = <class 'str'>, value = layers
+
+In [23]: super_print(image.root_fs.layers)
+type = <class 'list'>, value = ['sha256:a30a5965a4f7d9d5ff76a46eb8939f58e95be844de1ac4a4b452d5d31158fdea']
+
+In [24]: super_print(image.root_fs.base_layer)
+type = <class 'NoneType'>, value = None
+
+In [25]: super_print(image.metadata)
+type = <class 'dict'>, value = {'LastTagTime': '0001-01-01T00:00:00Z'}
+
+
+

Methods

+ + +
+ + + +

+ Image + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ copy_from + + +

+
copy_from(path_in_image, destination, pull='missing')
+
+ +
+ +

Copy a file from a docker image in the local filesystem.

+

See the docker.image.copy_from command for information about the arguments.

+ +
+ +
+ +
+ + +

+ copy_to + + +

+
copy_to(
+    local_path, path_in_image, new_tag=None, pull="missing"
+)
+
+ +
+ +

Copy a file from the local filesystem in a docker image to create a new +docker image.

+

As if you did a dockerfile with a COPY instruction.

+

See the docker.image.copy_to command for information about the arguments.

+ +
+ +
+ +
+ + +

+ exists + + +

+
exists()
+
+ +
+ +

Returns True if the docker image exists and False if it doesn't exists.

+

Note that you might have done docker.image.remove("some_tag") and the image +might still exists because python-on-whales references images by id, not by tag.

+

See the docker.image.exists command for information about the arguments.

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(force=False, prune=True)
+
+ +
+ +

Remove this Docker image.

+

See the docker.image.remove command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ save + + +

+
save(output=None)
+
+ +
+ +

Saves this Docker image in a tar.

+

See the docker.image.save command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ tag + + +

+
tag(new_tag)
+
+ +
+ +

Add a tag to a Docker image.

+

See the docker.image.tag command for +information about the arguments.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/networks/index.html b/objects/networks/index.html new file mode 100644 index 00000000..34acfcdf --- /dev/null +++ b/objects/networks/index.html @@ -0,0 +1,1136 @@ + + + + + + + + + + + + + + + + + + + + + + + + Networks - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker networks

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_network = docker.network.create("some-network")
+
+my_network = docker.container.inspect("some-network")
+
+

For type hints, use this

+
from python_on_whales import Network, docker
+
+def ping_hostname_in_network(my_network: Network):
+    docker.run("busybox", ["ping", "-c", "10", "my_hostname"], networks=[my_network])
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker network inspect ...

+

If you want to know the exact structure, you can go to the +docker network inspect reference page +and click on "200 no error". +An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: network = docker.network.create("my-network")
+
+In [3]: container = docker.run(
+            "ubuntu", ["sleep", "infinity"], name="my_ubuntu", detach=True, networks=[network]
+        )
+
+In [4]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [5]: super_print(network.name)
+type = <class 'str'>, value = my-network
+
+In [6]: super_print(network.id)
+type = <class 'str'>, value = 25ef3691bdaf9226fa5d35425b58ae80b32940ce868041a3962f4d692ea5d73d
+
+In [7]: super_print(network.created)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:29.524886+00:00
+
+In [8]: super_print(network.scope)
+type = <class 'str'>, value = local
+
+In [9]: super_print(network.driver)
+type = <class 'str'>, value = bridge
+
+In [10]: super_print(network.enable_ipv6)
+type = <class 'bool'>, value = False
+
+In [11]: super_print(network.ipam.driver)
+type = <class 'str'>, value = default
+
+In [12]: super_print(network.ipam.config)
+type = <class 'list'>, value = [{'Subnet': '172.19.0.0/16', 'Gateway': '172.19.0.1'}]
+
+In [13]: super_print(network.ipam.options)
+type = <class 'dict'>, value = {}
+
+In [14]: super_print(network.internal)
+type = <class 'bool'>, value = False
+
+In [15]: super_print(network.attachable)
+type = <class 'bool'>, value = False
+
+In [16]: super_print(network.ingress)
+type = <class 'bool'>, value = False
+
+In [17]: super_print(network.containers)
+type = <class 'dict'>, value = {'9ed29545345c163a916ea0d348e971fb2bfed9e0ae0edcb769cb4099216b25ea': NetworkContainer(name='my_ubuntu', endpoint_id='f5b4654375118885360090b37e34c65c971f36e9be40600531098a5b7e0e4089', mac_address='02:42:ac:13:00:02', ipv4_address='172.19.0.2/16', ipv6_address='')}
+
+In [18]: super_print(network.options)
+type = <class 'dict'>, value = {}
+
+In [19]: super_print(network.labels)
+type = <class 'dict'>, value = {}
+
+In [20]: super_print(network.config_from)
+type = <class 'dict'>, value = {'Network': ''}
+
+In [21]: super_print(network.config_only)
+type = <class 'bool'>, value = False
+
+
+

Methods

+ + +
+ + + +

+ Network + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ remove + + +

+
remove()
+
+ +
+ +

Removes this Docker network.

+

Rather than removing it manually, you can use a context manager to +make sure the network is deleted even if an exception is raised.

+
from python_on_whales import docker
+
+with docker.network.create("some_name") as my_net:
+    docker.run(
+        "busybox",
+        ["ping", "idonotexistatall.com"],
+        networks=[my_net],
+        remove=True,
+    )
+    # an exception will be raised because the container will fail
+    # but the network will be removed anyway.
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/nodes/index.html b/objects/nodes/index.html new file mode 100644 index 00000000..18ee0314 --- /dev/null +++ b/objects/nodes/index.html @@ -0,0 +1,1187 @@ + + + + + + + + + + + + + + + + + + + + + + + + Nodes - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker nodes

+

Nodes in Docker swarm

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_docker_image = docker.node.inspect("my-node-name")
+
+list_of_nodes = docker.node.list()
+
+

For type hints, use this

+
from python_on_whales import Node
+
+def print_state(node: Node):
+    print(node.status.state)
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker node inspect ...

+

To get a complete description of those attributes, you +can take a look at the daemon api reference page +and click on "200 No error".

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: docker.swarm.init()
+
+In [3]: docker.node.list()[0]
+
+In [4]: def super_print(obj):
+   ...:     print(f"type = {type(obj)}, value = {obj}")
+   ...:
+
+In [4]: super_print(node.id)
+type = <class 'str'>, value = ee9frjmkrmp3ka8ycx8nxk4nr
+
+In [5]: super_print(node.version.index)
+type = <class 'int'>, value = 9
+
+In [6]: super_print(node.created_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:53.049852+00:00
+
+In [7]: super_print(node.updated_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:53.560521+00:00
+
+In [8]: super_print(node.spec.name)
+type = <class 'NoneType'>, value = None
+
+In [9]: super_print(node.spec.labels)
+type = <class 'dict'>, value = {}
+
+In [10]: super_print(node.spec.role)
+type = <class 'str'>, value = manager
+
+In [11]: super_print(node.spec.availability)
+type = <class 'str'>, value = active
+
+In [12]: super_print(node.description.hostname)
+type = <class 'str'>, value = fv-az569-936
+
+In [13]: super_print(node.description.platform.architecture)
+type = <class 'str'>, value = x86_64
+
+In [14]: super_print(node.description.platform.os)
+type = <class 'str'>, value = linux
+
+In [15]: super_print(node.description.resources.nano_cpus)
+type = <class 'int'>, value = 4000000000
+
+In [16]: super_print(node.description.resources.memory_bytes)
+type = <class 'int'>, value = 16757342208
+
+In [17]: super_print(node.description.resources.generic_resources)
+type = <class 'NoneType'>, value = None
+
+In [18]: super_print(node.description.engine.engine_version)
+type = <class 'str'>, value = 26.1.3
+
+In [19]: super_print(node.description.engine.labels)
+type = <class 'NoneType'>, value = None
+
+In [20]: super_print(node.description.engine.plugins)
+type = <class 'list'>, value = [EnginePlugin(type='Log', name='awslogs'), EnginePlugin(type='Log', name='fluentd'), EnginePlugin(type='Log', name='gcplogs'), EnginePlugin(type='Log', name='gelf'), EnginePlugin(type='Log', name='journald'), EnginePlugin(type='Log', name='json-file'), EnginePlugin(type='Log', name='local'), EnginePlugin(type='Log', name='splunk'), EnginePlugin(type='Log', name='syslog'), EnginePlugin(type='Network', name='bridge'), EnginePlugin(type='Network', name='host'), EnginePlugin(type='Network', name='ipvlan'), EnginePlugin(type='Network', name='macvlan'), EnginePlugin(type='Network', name='null'), EnginePlugin(type='Network', name='overlay'), EnginePlugin(type='Volume', name='local'), EnginePlugin(type='Volume', name='mochoa/s3fs-volume-plugin:latest')]
+
+In [21]: super_print(node.description.tls_info.trust_root)
+type = <class 'str'>, value = -----BEGIN CERTIFICATE-----
+MIIBajCCARCgAwIBAgIUV026KPx+m2lBDG60bWmbIW7TJ+QwCgYIKoZIzj0EAwIw
+EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjQwNzE5MTIyODAwWhcNNDQwNzE0MTIy
+ODAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
+A0IABPVCIMeRMVi0xS9yQZ1S1rQc0OoTtVJpIH+DCEVUO65oDLHe9pp1zSkk1gLt
+zP87onTj09KppTI0ndFvk3bS4RijQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBTC5qu98oXnnjfyzO5MJoB/Ft2upTAKBggqhkjO
+PQQDAgNIADBFAiAK3hx0U6DK197w688SGwl+tdqaA9E4Z7a6nzHi5wCjygIhANfc
+4YM5+iEomHSwn043PaHrFXIha/kLW4mfZxqLz/2O
+-----END CERTIFICATE-----
+
+
+In [22]: super_print(node.description.tls_info.cert_issuer_subject)
+type = <class 'str'>, value = MBMxETAPBgNVBAMTCHN3YXJtLWNh
+
+In [23]: super_print(node.description.tls_info.cert_issuer_public_key)
+type = <class 'str'>, value = MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9UIgx5ExWLTFL3JBnVLWtBzQ6hO1Umkgf4MIRVQ7rmgMsd72mnXNKSTWAu3M/zuidOPT0qmlMjSd0W+TdtLhGA==
+
+In [24]: super_print(node.status.state)
+type = <class 'str'>, value = ready
+
+In [25]: super_print(node.status.message)
+type = <class 'NoneType'>, value = None
+
+In [26]: super_print(node.status.addr)
+type = <class 'str'>, value = 10.1.0.180
+
+In [27]: super_print(node.manager_status.leader)
+type = <class 'bool'>, value = True
+
+In [28]: super_print(node.manager_status.reachability)
+type = <class 'str'>, value = reachable
+
+In [29]: super_print(node.manager_status.addr)
+type = <class 'str'>, value = 10.1.0.180:2377
+
+
+

Methods

+ + +
+ + + +

+ Node + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ ps + + +

+
ps()
+
+ +
+ +

Returns the list of tasks running on this node

+

Returns

+
A `List[python_on_whales.Task]` object.
+
+ +
+ +
+ +
+ + +

+ update + + +

+
update(
+    availability=None,
+    labels_add={},
+    rm_labels=[],
+    role=None,
+)
+
+ +
+ +

Updates this Swarm node.

+

See docker.node.update for more information +about the arguments.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/plugins/index.html b/objects/plugins/index.html new file mode 100644 index 00000000..e569c880 --- /dev/null +++ b/objects/plugins/index.html @@ -0,0 +1,1186 @@ + + + + + + + + + + + + + + + + + + + + + + + + Plugins - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker plugins

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_docker_plugin = docker.plugin.install("vieux/sshfs:latest")
+# or
+my_docker_plugin = docker.plugin.inspect("vieux/sshfs:latest")
+# or
+list_of_plugins = docker.plugins.list()
+
+

For type hints, use this

+
from python_on_whales import Plugin
+
+def print_name(plugin: Plugin):
+    print(plugin.name)
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker plugin inspect ...

+

To get a complete description of those attributes, you +can take a look at the daemon api reference page +and click on "200 No error".

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: plugin = docker.plugin.install("vieux/sshfs:latest")
+
+In [4]: def super_print(obj):
+   ...:     print(f"type = {type(obj)}, value = {obj}")
+   ...:
+
+In [4]: super_print(plugin.id)
+type = <class 'str'>, value = 534345adf57206caf082d6bb38bc3951bcca35ba2bfa5556cae4b84b2ce803ef
+
+In [5]: super_print(plugin.name)
+type = <class 'str'>, value = mochoa/s3fs-volume-plugin:latest
+
+In [6]: super_print(plugin.enabled)
+type = <class 'bool'>, value = True
+
+In [7]: super_print(plugin.settings)
+type = <class 'python_on_whales.components.plugin.models.PluginSettings'>, value = mounts=[] env=['AWSACCESSKEYID=', 'AWSSECRETACCESSKEY=', 'DEFAULT_S3FSOPTS=nomultipart,use_path_request_style'] args=[] devices=[PluginDevice()]
+
+In [8]: super_print(plugin.plugin_reference)
+type = <class 'str'>, value = docker.io/mochoa/s3fs-volume-plugin:latest
+
+In [9]: super_print(plugin.config)
+type = <class 'python_on_whales.components.plugin.models.PluginConfig'>, value = docker_version='19.03.15' description='S3FS plugin for Docker v2.0.9' documentation='https://github.com/marcelo-ochoa/docker-volume-plugins/' interface=Interface() entrypoint=['/usr/bin/tini', '--', '/s3fs-volume-plugin'] work_dir=''
+
+
+

Methods

+ + +
+ + + +

+ Plugin + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ disable + + +

+
disable(force=False)
+
+ +
+ +

Disable this plugin

+ +
+ +
+ +
+ + +

+ enable + + +

+
enable(timeout=None)
+
+ +
+ +

Enable this plugin

+ +
+ +
+ +
+ + +

+ push + + +

+
push(disable_content_trust=True)
+
+ +
+ +

Push this plugin

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(force=False)
+
+ +
+ +

Remove this plugin

+ +
+ +
+ +
+ + +

+ set + + +

+
set(configuration)
+
+ +
+ +

Set the configuration for this plugin

+ +
+ +
+ +
+ + +

+ upgrade + + +

+
upgrade(
+    remote=None,
+    disable_content_trust=True,
+    skip_remote_check=False,
+)
+
+ +
+ +

Upgrade this plugin

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/pods/index.html b/objects/pods/index.html new file mode 100644 index 00000000..fbc4289b --- /dev/null +++ b/objects/pods/index.html @@ -0,0 +1,1278 @@ + + + + + + + + + + + + + + + + + + + + + + + + Pods - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Podman pods

+

Don't use the constructor directly. Instead use

+
from python_on_whales import DockerClient
+
+podman = DockerClient(client_call=["podman"])
+
+my_pod = podman.pod.inspect("my-pod-name")
+
+# or
+
+my_pod = podman.pod.create("my-pod-name")
+
+

For type hints, use this

+
from python_on_whales import Pod
+
+def print_container_names(pod: Pod):
+    print([ctr.name for ctr in pod.containers])
+
+

Attributes

+

The attributes are the same that you get with the command line: +podman pod inspect ...

+

If you want to know the exact structure, you can go to the +podman pod inspect reference page

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import DockerClient
+
+In [2]: podman = DockerClient(client_call=["podman"])
+
+In [3]: pod = podman.pod.create("my-pod")
+
+In [4]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [5]: super_print(pod.id)
+type = <class 'str'>, value = f44088309370b03c4ba354ee6433d08d26e73940ee162de59c71b4c1e3352ed8
+
+In [6]: super_print(pod.name)
+type = <class 'str'>, value = my-pod
+
+In [7]: super_print(pod.created)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:33:02.109606+00:00
+
+In [8]: super_print(pod.state)
+type = <class 'str'>, value = Created
+
+In [9]: super_print(pod.num_containers)
+type = <class 'int'>, value = 1
+
+In [10]: super_print(pod.infra_container_id)
+type = <class 'str'>, value = 4b1d6cfac50742acf4685ec158932a5806c449b9394c2ab6bd870909553b35ce
+
+In [11]: super_print(pod.shared_namespaces)
+type = <class 'list'>, value = ['uts', 'ipc', 'net']
+
+In [12]: super_print(pod.hostname)
+type = <class 'str'>, value = 
+
+In [13]: super_print(pod.exit_policy)
+type = <class 'NoneType'>, value = None
+
+
+

Methods

+ + +
+ + + +

+ Pod + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ exists + + +

+
exists()
+
+ +
+ +

Returns True if the pod exists and False if not.

+

See the podman.pod.exists command for information about the arguments.

+ +
+ +
+ +
+ + +

+ kill + + +

+
kill(*, signal=None)
+
+ +
+ +

Kill this pod

+

See the podman.pod.kill command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ logs + + +

+
logs(
+    container=None,
+    *,
+    names=False,
+    since=None,
+    tail=None,
+    timestamps=False,
+    until=None,
+    follow=False,
+    stream=False
+)
+
+ +
+ +

Returns the logs of the pod containers

+

See the podman.pod.logs command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ pause + + +

+
pause()
+
+ +
+ +

Pause this pod.

+

See the podman.pod.pause command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(*, force=False, time=None)
+
+ +
+ +

Remove this pod.

+

See the podman.pod.remove command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ restart + + +

+
restart()
+
+ +
+ +

Restart this pod.

+

See the podman.pod.restart command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ start + + +

+
start()
+
+ +
+ +

Starts this pod.

+

See the podman.pod.start command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ stop + + +

+
stop(*, time=None)
+
+ +
+ +

Stops this pod.

+

See the podman.pod.stop command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ unpause + + +

+
unpause()
+
+ +
+ +

Unpause the pod

+

See the podman.pod.unpause command for +information about the arguments.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/secrets/index.html b/objects/secrets/index.html new file mode 100644 index 00000000..ca084738 --- /dev/null +++ b/objects/secrets/index.html @@ -0,0 +1,1022 @@ + + + + + + + + + + + + + + + + + + + + + + + + Secrets - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ Secret + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ remove + + +

+
remove()
+
+ +
+ +

Remove this Docker secret.

+

See the docker.secret.remove command for +information about the arguments.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/services/index.html b/objects/services/index.html new file mode 100644 index 00000000..af3a9bfe --- /dev/null +++ b/objects/services/index.html @@ -0,0 +1,1237 @@ + + + + + + + + + + + + + + + + + + + + + + + + Services - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker services

+

Services in Docker swarm

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_docker_service = docker.service.inspect("my-service")
+
+my_docker_service = docker.service.create("busybox", ["ping", "www.google.com"])
+
+
+

For type hints, use this

+
from python_on_whales import Service
+
+def print_creation_time(some_service: Service):
+    print(some_service.created_at)
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker service inspect ...

+

To get a complete description of those attributes, you +can take a look at the daemon api reference page +and click on "200 No error".

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: docker.swarm.init()
+
+In [3]: my_service = docker.service.create("busybox", ["ping", "www.google.com"])
+
+In [4]: def super_print(obj):
+   ...:     print(f"type = {type(obj)}, value = {obj}")
+   ...:
+
+In [4]: super_print(service.id)
+type = <class 'str'>, value = yw4cbz4s6yhiyusljbysiiz1a
+
+In [5]: super_print(service.version)
+type = <class 'python_on_whales.components.service.models.ServiceVersion'>, value = index=11
+
+In [6]: super_print(service.created_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:55.041139+00:00
+
+In [7]: super_print(service.updated_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:55.041139+00:00
+
+In [8]: super_print(service.spec.name)
+type = <class 'str'>, value = loving_shirley
+
+In [9]: super_print(service.spec.labels)
+type = <class 'dict'>, value = {}
+
+In [10]: super_print(service.spec.mode)
+type = <class 'dict'>, value = {'Replicated': {'Replicas': 1}}
+
+In [11]: super_print(service.spec.update_config)
+type = <class 'python_on_whales.components.service.models.ChangeConfig'>, value = parallelism=1 failure_action='pause' monitor=5000000000 max_failure_ratio=0.0 order='stop-first'
+
+In [12]: super_print(service.spec.rollback_config)
+type = <class 'python_on_whales.components.service.models.ChangeConfig'>, value = parallelism=1 failure_action='pause' monitor=5000000000 max_failure_ratio=0.0 order='stop-first'
+
+In [13]: super_print(service.spec.task_template.container_spec.image)
+type = <class 'str'>, value = busybox:latest@sha256:9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7
+
+In [14]: super_print(service.spec.task_template.container_spec.labels)
+type = <class 'NoneType'>, value = None
+
+In [15]: super_print(service.spec.task_template.container_spec.privileges)
+type = <class 'NoneType'>, value = None
+
+In [16]: super_print(service.spec.task_template.container_spec.stop_grace_period)
+type = <class 'int'>, value = 10000000000
+
+In [17]: super_print(service.spec.task_template.container_spec.isolation)
+type = <class 'str'>, value = default
+
+In [18]: super_print(service.spec.task_template.container_spec.env)
+type = <class 'NoneType'>, value = None
+
+In [19]: super_print(service.spec.task_template.resources.limits)
+type = <class 'python_on_whales.components.service.models.CPUMemoryQuotas'>, value = nano_cpus=None memory_bytes=None
+
+In [20]: super_print(service.spec.task_template.resources.reservations)
+type = <class 'python_on_whales.components.service.models.CPUMemoryQuotas'>, value = nano_cpus=None memory_bytes=None
+
+In [21]: super_print(service.previous_spec)
+type = <class 'NoneType'>, value = None
+
+In [22]: super_print(service.endpoint.spec)
+type = <class 'python_on_whales.components.service.models.ServiceEndpointSpec'>, value = mode=None ports=None
+
+In [23]: super_print(service.endpoint.ports)
+type = <class 'NoneType'>, value = None
+
+In [24]: super_print(service.endpoint.virtual_ips)
+type = <class 'NoneType'>, value = None
+
+In [25]: super_print(service.update_status)
+type = <class 'NoneType'>, value = None
+
+
+

Methods

+ + +
+ + + +

+ Service + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ exists + + +

+
exists()
+
+ +
+ +

Returns True if the service is still present in the swarm, False +if the service has been removed.

+ +
+ +
+ +
+ + +

+ ps + + +

+
ps()
+
+ +
+ +

Returns the list of tasks of this service.

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove()
+
+ +
+ +

Removes this service

+

It's also possible to use a service as a context manager. +By using a context manager, you ensures that the service will be removed even +if an exception occurs.

+
from python_on_whales import docker
+
+docker.swarm.init()
+with docker.service.create("ubuntu", ["sleep", "infinity"]) as my_service:
+    print("I'm doing things with the service here")
+    print(my_service.update_status)
+
+print("I'm out of the context manager, the service has been removed.")
+
+ +
+ +
+ +
+ + +

+ scale + + +

+
scale(new_scale, detach=False)
+
+ +
+ +

Change the scale of a service.

+

See the docker.service.scale command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ update + + +

+
update(
+    detach=False,
+    force=False,
+    image=None,
+    with_registry_authentication=False,
+    quiet=False,
+    replicas=None,
+)
+
+ +
+ +

Updates a service

+

See the docker.service.update command for +information about the arguments.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/stacks/index.html b/objects/stacks/index.html new file mode 100644 index 00000000..6d0e4756 --- /dev/null +++ b/objects/stacks/index.html @@ -0,0 +1,955 @@ + + + + + + + + + + + + + + + + + + + + + + + + Stacks - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ Stack + + +

+ + +
+ + + + + +
+ + + + + + + + + + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/tasks/index.html b/objects/tasks/index.html new file mode 100644 index 00000000..0030925d --- /dev/null +++ b/objects/tasks/index.html @@ -0,0 +1,989 @@ + + + + + + + + + + + + + + + + + + + + + + + + Tasks - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker tasks

+

Tasks in Docker swarm

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_docker_task = docker.task.inspect("some-task-id")
+
+my_tasks_list = docker.service.ps("my-service")
+
+
+

For type hints, use this

+
from python_on_whales import Task
+
+def print_creation_time(some_task: Task):
+    print(some_task.created_at)
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker inspect <task-id>

+

To get a complete description of those attributes, you +can take a look at the daemon api reference page +and click on "200 No error".

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects/volumes/index.html b/objects/volumes/index.html new file mode 100644 index 00000000..48d19034 --- /dev/null +++ b/objects/volumes/index.html @@ -0,0 +1,1144 @@ + + + + + + + + + + + + + + + + + + + + + + + + Volumes - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker volumes

+

Don't use the constructor directly. Instead use

+
from python_on_whales import docker
+
+my_docker_volume = docker.volume.inspect("my-volume")
+
+# or
+
+my_docker_image = docker.volume.create()
+
+

For type hints, use this

+
from python_on_whales import docker, Volume
+
+def print_file(my_volume: Volume):
+    print(
+        docker.run(
+            "ubuntu", 
+            ["cat", "/some_volume/some_file"],
+            volumes=[(my_volume, "/some_volume/some_file")]
+        )
+    )
+
+

Attributes

+

It attributes are the same that you get with the command line: +docker volume inspect ...

+

To get a complete description of those attributes, you +can take a look at +the daemon api reference page +and click on "200 No error".

+

An example is worth many lines of descriptions.

+
In [1]: from python_on_whales import docker
+
+In [2]: volume = docker.volume.create()
+
+In [3]: def super_print(obj):
+   ...:     print(f"type={type(obj)}, value={obj}")
+   ...:
+
+In [4]: super_print(volume.name)
+type = <class 'str'>, value = 57a6bb36fa6c31ab2525cab0443f35ed349295938b3231439afe9a286c589a85
+
+In [5]: super_print(volume.driver)
+type = <class 'str'>, value = local
+
+In [6]: super_print(volume.mountpoint)
+type = <class 'pathlib.PosixPath'>, value = /var/lib/docker/volumes/57a6bb36fa6c31ab2525cab0443f35ed349295938b3231439afe9a286c589a85/_data
+
+In [7]: super_print(volume.created_at)
+type = <class 'datetime.datetime'>, value = 2024-07-19 12:32:42+00:00
+
+In [8]: super_print(volume.status)
+type = <class 'NoneType'>, value = None
+
+In [9]: super_print(volume.labels)
+type = <class 'dict'>, value = {'com.docker.volume.anonymous': ''}
+
+In [10]: super_print(volume.scope)
+type = <class 'str'>, value = local
+
+In [11]: super_print(volume.options)
+type = <class 'NoneType'>, value = None
+
+
+

Methods

+ + +
+ + + +

+ Volume + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ clone + + +

+
clone(
+    new_volume_name=None, driver=None, labels={}, options={}
+)
+
+ +
+ +

Creates a new volume and copy all the data inside.

+

See the docker.volume.clone command for +information about the arguments.

+ +
+ +
+ +
+ + +

+ exists + + +

+
exists()
+
+ +
+ +

Returns True if the docker volume exists and False if it doesn't exists.

+

If it doesn't exists, it most likely mean that it was removed.

+

See the docker.volume.exists command for information about the arguments.

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove()
+
+ +
+ +

Removes this volume

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..b81c8739 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Home","text":"

A Docker client for Python, designed to be fun and intuitive!

Works on Linux, macOS and Windows, for Python 3.8 and above.

  • Documentation
  • Github repository
"},{"location":"#how-to-install","title":"How to install?","text":"
pip install python-on-whales\n
"},{"location":"#some-cool-examples","title":"Some cool examples","text":"

Start by doing

from python_on_whales import docker\n

and then:

  • docker run hello-world -> docker.run(\"hello-world\")
  • docker pull ubuntu -> docker.pull(\"ubuntu\")
  • docker build ./ -> docker.build(\"./\")
  • docker compose up my_service -> docker.compose.up([\"my_service\"])
  • docker image ls -> docker.image.list()
  • docker ps -> docker.ps()
  • docker cp -> docker.copy()

You get the idea \ud83d\ude42 it's the same as the CLI we all know and love.

>>> from python_on_whales import docker\n\n>>> output = docker.run(\"hello-world\")\n>>> print(output)\n\nHello from Docker!\nThis message shows that your installation appears to be working correctly.\n\n...\n
>>> from python_on_whales import docker\n>>> print(docker.run(\"nvidia/cuda:11.0-base\", [\"nvidia-smi\"], gpus=\"all\"))\n+-----------------------------------------------------------------------------+\n| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |\n|-------------------------------+----------------------+----------------------+\n| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |\n| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |\n|                               |                      |               MIG M. |\n|===============================+======================+======================|\n|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |\n| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |\n|                               |                      |                  N/A |\n+-------------------------------+----------------------+----------------------+\n\n+-----------------------------------------------------------------------------+\n| Processes:                                                                  |\n|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |\n|        ID   ID                                                   Usage      |\n|=============================================================================|\n|  No running processes found                                                 |\n+-----------------------------------------------------------------------------+\n
>>> from python_on_whales import docker\n>>> my_docker_image = docker.pull(\"ubuntu:20.04\")\n20.04: Pulling from library/ubuntu\ne6ca3592b144: Downloading [=============>                                     ]  7.965MB/28.56MB\n534a5505201d: Download complete\n990916bd23bb: Download complete\n\n>>> print(my_docker_image.repo_tags)\n['ubuntu:20.04']\n\n>>> docker.image.list()\n[python_on_whales.Image(id='sha256:1a437e363abfa', tags=['ubuntu:20.04'])]\n\n>>> my_docker_image.remove()\n
>>> from python_on_whales import docker\n>>> my_image = docker.build(\".\", tags=\"some_name\")  # uses Buildx/buildkit by default\n[+] Building 1.6s (17/17) FINISHED\n => [internal] load build definition from Dockerfile                                                            0.0s\n => => transferring dockerfile: 32B                                                                             0.0s\n => [internal] load .dockerignore                                                                               0.0s\n => => transferring context: 2B                                                                                 0.0s\n => [internal] load metadata for docker.io/library/python:3.6                                                   1.4s\n => [python_dependencies 1/5] FROM docker.io/library/python:3.6@sha256:29328c59adb9ee6acc7bea8eb86d0cb14033c85  0.0s\n => [internal] load build context                                                                               0.1s\n => => transferring context: 72.86kB                                                                            0.0s\n => CACHED [python_dependencies 2/5] RUN pip install typeguard pydantic requests tqdm                           0.0s\n => CACHED [python_dependencies 3/5] COPY tests/test-requirements.txt /tmp/                                     0.0s\n => CACHED [python_dependencies 4/5] COPY requirements.txt /tmp/                                                0.0s\n => CACHED [python_dependencies 5/5] RUN pip install -r /tmp/test-requirements.txt -r /tmp/requirements.txt     0.0s\n => CACHED [tests_ubuntu_install_without_buildx 1/7] RUN apt-get update &&     apt-get install -y       apt-tr  0.0s\n => CACHED [tests_ubuntu_install_without_buildx 2/7] RUN curl -fsSL https://download.docker.com/linux/ubuntu/g  0.0s\n => CACHED [tests_ubuntu_install_without_buildx 3/7] RUN add-apt-repository    \"deb [arch=amd64] https://downl  0.0s\n => CACHED [tests_ubuntu_install_without_buildx 4/7] RUN  apt-get update &&      apt-get install -y docker-ce-  0.0s\n => CACHED [tests_ubuntu_install_without_buildx 5/7] WORKDIR /python-on-whales                                  0.0s\n => CACHED [tests_ubuntu_install_without_buildx 6/7] COPY . .                                                   0.0s\n => CACHED [tests_ubuntu_install_without_buildx 7/7] RUN pip install -e .                                       0.0s\n => exporting to image                                                                                          0.1s\n => => exporting layers                                                                                         0.0s\n => => writing image sha256:e1c2382d515b097ebdac4ed189012ca3b34ab6be65ba0c650421ebcac8b70a4d                    0.0s\n => => naming to docker.io/library/some_image_name\n
"},{"location":"#some-more-dockerrun-advanced-examples-with-postgres","title":"Some more docker.run() advanced examples with postgres","text":"
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres\n

becomes

from python_on_whales import docker\n\ndocker.run(\n    \"postgres:9.6\",\n    name=\"some-postgres\",\n    envs={\"POSTGRES_PASSWORD\": \"mysecretpassword\"},\n    detach=True,\n)\nprint(docker.ps())\n# [python_on_whales.Container(id='f5fb939c409d', name='some-postgres')]\n
docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres\n

becomes

from python_on_whales import docker\n\n# since it's interactive, you'll be dropped into the psql shell. The python code\n# will continue only after you exit the shell.\ndocker.run(\n    \"postgres:9.6\",\n    [\"psql\", \"-h\", \"some-postgres\", \"-U\", \"postgres\"],\n    networks=[\"some-network\"],\n    interactive=True,\n    tty=True,\n    remove=True,\n)\n
docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -e PGDATA=/var/lib/postgresql/data/pgdata -v /custom/mount:/var/lib/postgresql/data -v myvolume:/tmp/myvolume postgres -c shared_buffers=256MB -c max_connections=200\n

becomes

from python_on_whales import docker\n\ndocker.run(\n    \"postgres:9.6\",\n    [\"-c\", \"shared_buffers=256MB\", \"-c\", \"max_connections=200\"],\n    name=\"some-postgres\",\n    envs={\"POSTGRES_PASSWORD\": \"mysecretpassword\", \"PGDATA\": \"/var/lib/postgresql/data/pgdata\"},\n    volumes=[(\"/custom/mount\", \"/var/lib/postgresql/data\"), (\"myvolume\", \"/tmp/myvolume\")],\n    detach=True,\n)\n

Any Docker object can be used as a context manager to ensure it's removed even if an exception occurs:

from python_on_whales import docker\n\nwith docker.volume.create(\"random_name\") as some_volume:\n    docker.run(\n        \"postgres:9.6\",\n        [\"-c\", \"shared_buffers=256MB\", \"-c\", \"max_connections=200\"],\n        name=\"some-postgres\",\n        envs={\"POSTGRES_PASSWORD\": \"mysecretpassword\", \"PGDATA\": \"/var/lib/postgresql/data/pgdata\"},\n        volumes=[(some_volume, \"/var/lib/postgresql/data\"), (\"myvolume\", \"/tmp/myvolume\")],\n        detach=True,\n    )\n    # so some stuff here\n\n# here we are out of the context manager, so the volume has been removed, even if there was an exception.\n
"},{"location":"#main-features","title":"Main features","text":"
  • 1 to 1 mapping between the CLI interface and the Python API. No need to look in the docs what is the name of the function/argument you need.
  • Support for the latest Docker features: Docker buildx/buildkit, docker run --gpu=all ...
  • Support for Docker stack, services and Swarm (same API as the command line).
  • Progress bars and progressive outputs when pulling, pushing, loading, building...
  • Support for some other CLI commands that are not in Docker-py: docker cp, docker run --cpus ... and more.
  • Nice SSH support for remote daemons.
  • Docker object as Python objects: Container, Images, Volumes, Services... and their attributes are updated in real-time!
  • Each Docker object can be used as a context manager. When getting out of the context, the Docker object is removed automatically, even if an exception occurs.
  • A fully typed API (Mypy and IDE-friendly) compatible with pathlib and os.path
  • All Docker objects and the Docker client are safe to use with multithreading and multiprocessing.
  • Display the commands called and the environment variables used by setting the environment variable PYTHON_ON_WHALES_DEBUG=1.
"},{"location":"#why-another-project-why-not-build-on-docker-py","title":"Why another project? Why not build on Docker-py?","text":"

In a sense this project is built on top of Docker-py because the implementation, the organisation and the API is inspired from the project, but the codebases could not be the same.

Two major differences do not permit that:

1) The API is quite different. The aim of Python on Whales is to provide a 1-to-1 mapping between the Docker command line and Python, so that users don't even have to open the docs to do write code.

2) While Docker-py is a complete re-implementation of the Docker client binary (written in Go), Python on whales sits on top of the Docker client binary, which makes implementing new features much easier and safer. For example, it's unlikely that docker-py supports Buildx/buildkit anytime soon because rewriting a large Go codebase in Python is hard work.

"},{"location":"#should-i-use-docker-py-or-python-on-whales","title":"Should I use Docker-py or Python on Whales?","text":"

Well, it's written in each project's description!

  • Docker-py: A Python library for the Docker Engine API
  • Python on whales: An awesome Python wrapper for an awesome Docker CLI

If you need to talk to the Docker engine directly, you need to do low level operations, use docker-py. Some good example would be writing the code to control docker from an IDE, or if the speed of Docker calls is very important. If you don't want to depend on the Docker CLI binary (~50MB), use docker-py.

If you wanted to call the docker command line from Python, do high level operations, use Python on Whales. For example if you want to write your CI logic in Python rather than in bash (a very good choice \ud83d\ude09). Some commands are only available in Python on whales too: docker.buildx.build(...), docker.stack.deploy(...)...

Use the right tool for the right job \ud83d\ude42

"},{"location":"#alternatives-to-docker-podman-nerdctl","title":"Alternatives to Docker: Podman, nerdctl...","text":"

Support for Docker-compatible clients like Podman and Nerdctl was introduced in Python-on-whales version 0.44.0.

You can use an arbitrary binary to execute Docker commands by using the argument client_call of python_on_whales.DockerCLient. Here is an example:

>>> from python_on_whales import DockerClient\n\n>>> nerdctl = DockerClient(client_call=[\"nerdctl\"])\n\n>>> nerdctl.pull(\"python:3.9\")\ndocker.io/library/python:3.9:                                                     resolved       |++++++++++++++++++++++++++++++++++++++|\nindex-sha256:a83c0aa6471527636d7331c30704d0f88e0ab3331bbc460d4ae2e53bbae64dca:    done           |++++++++++++++++++++++++++++++++++++++|\nmanifest-sha256:8ccef93ff3c9e1bb9562d394526cdc6834033a0498073d41baa8b309f4fac20e: done           |++++++++++++++++++++++++++++++++++++++|\nconfig-sha256:f033692e2c5abe1e0ee34bcca759a3e4432b10b0031174b08d48bcc90d14d68b:   done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:9952b1051adaff513c99f86765361450af108b12b0073d0ba40255c4e419b481:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:c766e27afb21eddf9ab3e4349700ebe697c32a4c6ada6af4f08282277a291a28:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:1535e3c1181a81ea66d5bacb16564e4da2ba96304506598be39afe9c82b21c5c:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:6de7cb7bdc8f9b4c4d6539233fe87304aa1a6427c3238183265c9f02d831eddb:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:967757d5652770cfa81b6cc7577d65e06d336173da116d1fb5b2d349d5d44127:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:c357e2c68cb3bf1e98dcb3eb6ceb16837253db71535921d6993c594588bffe04:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:26787c68cf0c92a778db814d327e283fe1da4434a7fea1f0232dae8002e38f33:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:6aefca2dc61dcbcd268b8a9861e552f9cdb69e57242faec64ac120d2355a9c1a:    done           |++++++++++++++++++++++++++++++++++++++|\nlayer-sha256:32a180f5cf85702e7680719c40c39c07972b1176355df5a621de9eb87ad07ce2:    done           |++++++++++++++++++++++++++++++++++++++|\nelapsed: 35.9s                                                                    total:  333.5  (9.3 MiB/s)\n\npython_on_whales.Image(id='sha256:f033692e2c5ab', tags=['python:3.9'])\n

You can do something similar with podman:

from python_on_whales import DockerClient\n\npodman = DockerClient(client_call=[\"podman\"])\n\npodman.pull(\"hello-world\")\npodman.run(\"hello-world\")\nprint(podman.ps())\n...\n
"},{"location":"#contributing","title":"Contributing","text":"

Any and all PRs are welcome. Please see this documentation.

"},{"location":"#what-about-the-license","title":"What about the license?","text":"

It's a MIT license, so quite permissive.

The license can be found in the git repository.

"},{"location":"docker_client/","title":"The Docker client object","text":""},{"location":"docker_client/#python_on_whales.docker_client.DockerClient","title":"DockerClient","text":"

Creates a Docker client

Note that

from python_on_whales import docker\nprint(docker.run(\"hello-world\"))\n

is equivalent to

from python_on_whales import DockerClient\ndocker = DockerClient()\nprint(docker.run(\"hello-world\")\n
PARAMETER DESCRIPTION config

Location of client config files (default \"~/.docker\")

TYPE: Optional[ValidPath] DEFAULT: None

context

Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with \"docker context use\")

TYPE: Optional[str] DEFAULT: None

debug

Enable debug mode

TYPE: Optional[bool] DEFAULT: None

host

Daemon socket(s) to connect to

TYPE: Optional[str] DEFAULT: None

log_level

Set the logging level (\"debug\"|\"info\"|\"warn\"|\"error\"|\"fatal\") (default \"info\")

TYPE: Optional[str] DEFAULT: None

tls

Use TLS; implied by tlsverify

TYPE: Optional[bool] DEFAULT: None

tlscacert

Trust certs signed only by this CA (default \"~/.docker/ca.pem\")

TYPE: Optional[ValidPath] DEFAULT: None

compose_files

Docker compose yaml file

TYPE: List[ValidPath] DEFAULT: []

compose_profiles

List of compose profiles to use. Take a look at the documentation for profiles.

TYPE: List[str] DEFAULT: []

compose_env_file

.env file containing the environments variables to inject into the compose project. By default, it uses ./.env.

TYPE: Optional[ValidPath] DEFAULT: None

compose_project_name

The name of the compose project. It will be prefixed to networks, volumes and containers created by compose.

TYPE: Optional[str] DEFAULT: None

compose_project_directory

Use an alternate working directory. By default, it uses the path of the compose file.

TYPE: Optional[ValidPath] DEFAULT: None

compose_compatibility

Use docker compose in compatibility mode.

TYPE: Optional[bool] DEFAULT: None

client_call

Client binary to use and how to call it. Default is [\"docker\"]. You can try with for example [\"podman\"] or [\"nerdctl\"]. The client must have the same commands and outputs as Docker to work. Some best effort support is done in case of divergences, meaning you can report issues occuring on some other binary than Docker, but we don't guarantee that it will be fixed. This option is a list because you can provide a list of command line arguments to be placed after \"docker\". For exemple host=\"ssh://my_user@host.com\" is equivalent to client_call=[\"docker\", \"--host=ssh://my_user@host.com\"]. This will allow you to use some exotic options that are not explicitly supported by Python-on-whales. Let's say you want to use estargz to run a container immediately, without waiting for the \"pull\" to finish (yes it's possible!), you can do nerdctl = DockerClient(client_call=[\"nerdctl\", \"--snapshotter=stargz\"]) and then nerdctl.run(\"ghcr.io/stargz-containers/python:3.7-org\", [\"-c\", \"print('hi')\"]). You can also use this system to call Docker with sudo with client_call=[\"sudo\", \"docker\"] (note that it won't ask for your password, so sudo should be passwordless during the python program execution).

TYPE: List[str] DEFAULT: ['docker']

client_binary

Deprecated, use client_call. If you used before client_binary=\"podman\", now use client_call=[\"podman\"].

TYPE: str DEFAULT: 'docker'

client_type

The kind of client that is called by the Python process. It allows Python-on-whales to adapt to the client's behavior if two client have a different behavior. The client_call is not enough for Python-on-whales to know what kind of client you're using. For example, if you use a symlink to call Docker, Python-on-whales will not know that you're using Docker. Default is \"unknown\". If at some point, Python-on-whales has to choose a behavior and client_type is \"unknown\", it will raise an exception and ask you to specify what kind of client you're working with. Valid values are \"docker\", \"podman\", \"nerdctl\" and \"unknown\".

TYPE: Literal['docker', 'podman', 'nerdctl', 'unknown'] DEFAULT: 'unknown'

"},{"location":"docker_client/#python_on_whales.docker_client.DockerClient.login","title":"login","text":"
login(server=None, username=None, password=None)\n

Log in to a Docker registry.

If no server is specified, the default is defined by the daemon.

PARAMETER DESCRIPTION server

The server to log into. For example, with a self-hosted registry it might be something like server=\"192.168.0.10:5000\"

TYPE: Optional[str] DEFAULT: None

username

The username

TYPE: Optional[str] DEFAULT: None

password

The password

TYPE: Optional[str] DEFAULT: None

"},{"location":"docker_client/#python_on_whales.docker_client.DockerClient.login_ecr","title":"login_ecr","text":"
login_ecr(\n    aws_access_key_id=None,\n    aws_secret_access_key=None,\n    region_name=None,\n    registry=None,\n)\n

Login to the aws ECR registry. Credentials are taken from the environment variables as defined in the aws docs.

If you don't have a profile or your environment variables configured, you can also use the function arguments aws_access_key_id, aws_secret_access_key, region_name.

Behind the scenes, those arguments are passed directly to

botocore.session.get_session().create_client(...)\n

You need botocore to run this function. Use pip install botocore to install it.

The registry parameter can be used to override the registry that is guessed from the authorization token request's response. In other words: If the registry is None (the default) then it will be assumed that it's the ECR registry linked to the credentials provided. It is especially useful if the aws account you use can access several repositories and you need to explicitly define the one you want to use

"},{"location":"docker_client/#python_on_whales.docker_client.DockerClient.logout","title":"logout","text":"
logout(server=None)\n

Logout from a Docker registry

PARAMETER DESCRIPTION server

The server to logout from. For example, with a self-hosted registry it might be something like server=\"192.168.0.10:5000\"

TYPE: Optional[str] DEFAULT: None

"},{"location":"docker_client/#python_on_whales.docker_client.DockerClient.version","title":"version","text":"
version()\n

Get version information about the container client and server.

"},{"location":"docker_client/#python_on_whales.docker_client.DockerClient.version--returns","title":"Returns","text":"
A `python_on_whales.Version` object\n

As an example:

from python_on_whales import docker\n\nversion_info = docker.version()\nprint(version_info.client.version)\n# 3.4.2\nprint(version_info.server.kernel_version)\n# 5.15.133.1-microsoft-standard-WSL2\n...\n
"},{"location":"docker_client/#sub-commands","title":"Sub-commands","text":"
  • docker.buildx
  • docker.compose
  • docker.config
  • docker.container
  • docker.context
  • docker.image
  • docker.manifest
  • docker.network
  • docker.node
  • docker.secret
  • docker.service
  • docker.stack
  • docker.swarm
  • docker.system
  • docker.trust
  • docker.volume
  • podman.pod
"},{"location":"docker_client/#other-commands","title":"Other commands","text":"

They're actually aliases

  • docker.attach
  • docker.build
  • docker.commit
  • docker.copy
  • docker.create
  • docker.diff
  • docker.execute
  • docker.export
  • docker.images
  • docker.import_
  • docker.info
  • docker.kill
  • docker.load
  • docker.logs
  • docker.pause
  • docker.ps
  • docker.pull
  • docker.push
  • docker.rename
  • docker.restart
  • docker.remove
  • docker.run
  • docker.save
  • docker.start
  • docker.stats
  • docker.stop
  • docker.tag
  • docker.top
  • docker.unpause
  • docker.update
  • docker.wait
"},{"location":"docker_client/#about-multithreading-and-multiprocessing","title":"About multithreading and multiprocessing","text":"

Behind the scenes, Python on whales calls the Docker command line interface with subprocess. The Python on whales client does not store any intermediate state so it's safe to use with multithreading.

The Docker objects store some intermediate states (the attributes that you would normally get with docker ... inspectbut no logic in the codebase depends on those attributes. They're just here so that users can look at them. So you can share them between process/threads and pickle containers, images, networks...

The Docker daemon works with its own objects internally and handles concurrent and conflicting requests. For example, if you create two containers with the same name from different threads, only one will succeed. If you pull the same docker image from multiple processes/threads, the Docker daemon will only pull the image and layers once.

Just be careful with some scenario similar to this one

Thread 1: my_container = docker.run(..., detach=True)\n...\n# my_container finishes\n...\nThread 2: docker.container.prune()\n...\nThread 1: docker.logs(my_container)  # will fail because the container was removed by thread 2\n

In the end, unless you use this type of logic in your code, Python-on-whales is safe to use with multithreading and multiprocessing.

"},{"location":"docker_client/#the-docker-cli","title":"The Docker CLI","text":"

Python-on-whales needs the Docker CLI to work (unlike docker-py). Most of the time, users already have the CLI installed on their machines. It's possible to verify that the CLI is there by doing docker --help in the command line.

Sometimes, the CLI might not be available on the system, it can happen if you want to control Docker from within a container with -v /var/run/docker.sock:/var/run/docker.sock, or if you want to connect to a remote daemon with the host argument.

In this case, when using python-on-whales, the CLI will be downloaded automatically (it's a single binary), and will be put in

pathlib.Path.home() / \".cache/python-on-whales/docker\"\n

Since it's not in the PATH and was not downloaded with the package manager, it's only seen and used by python-on-whales.

If you want to trigger the download manually (to avoid downloading the CLI at runtime), you can run from your shell:

python-on-whales download-cli\n
"},{"location":"docker_client/#handling-an-unavailable-client","title":"Handling an unavailable client","text":"

Trying to use Python-on-whales when it cannot find or download a Docker client binary will trigger a python_on_whales.ClientNotFoundError. You can use a try-except around a first docker.ps() call to handle the case when Python-on-whales won't work.

"},{"location":"objects/builders/","title":"Docker builders","text":"

The Buildx builders objects.

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_builder = docker.buildx.inspect(\"my-builder\")\n\n# or\n\nmy_builder = docker.buildx.create()\n\n

For type hints, use this

from python_on_whales import Builder\n
"},{"location":"objects/builders/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker buildx inspect ...

Only a few are available at the moment

In [1]: from python_on_whales import docker\n\nIn [2]: my_builder = docker.buildx.create()\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [4]: super_print(builder.name)\ntype = <class 'str'>, value = sleepy_elbakyan\n\nIn [5]: super_print(builder.driver)\ntype = <class 'str'>, value = docker-container\n\n
"},{"location":"objects/builders/#methods","title":"Methods","text":""},{"location":"objects/builders/#python_on_whales.Builder","title":"Builder","text":""},{"location":"objects/builders/#python_on_whales.Builder.remove","title":"remove","text":"
remove()\n

Removes this builder. After this operation the builder cannot be used anymore.

If you use the builder as a context manager, it will call this function when you exit the context manager.

from python_on_whales import docker\n\nbuildx_builder = docker.buildx.create(use=True)\nwith buildx_builder:\n    docker.build(\".\")\n\n# now the variable buildx_builder is not usable since we're out of the context manager.\n# the .remove() method was called behind the scenes\n# since it was the current builder, 'default' is now the current builder.\n
"},{"location":"objects/configs/","title":"Docker configs","text":"

Configs objects present in Swarm mode

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_config = docker.config.inspect(\"my-config-name\")\n\n# or\n\nmy_config = docker.config.create(\"my_config_name\", \"my_config_file\")\n

For type hints, use this

from python_on_whales import Config\n\ndef print_config_labels(config: Config):\n    print(config.spec.labels)\n
"},{"location":"objects/configs/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker config inspect ...

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: config = docker.config.create(\"my_config\", \"./config_file.cfg\", labels=dict(hello=\"world\"))\n\nIn [3]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [4]: super_print(config.id)\ntype = <class 'str'>, value = vdvrpzslm08gpahzjkq5fg505\n\nIn [5]: super_print(config.version.index)\ntype = <class 'int'>, value = 11\n\nIn [6]: super_print(config.created_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:28.636523+00:00\n\nIn [7]: super_print(config.updated_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:28.636523+00:00\n\nIn [8]: super_print(config.spec.name)\ntype = <class 'str'>, value = my_config\n\nIn [9]: super_print(config.spec.labels)\ntype = <class 'dict'>, value = {'hello': 'world'}\n\nIn [10]: super_print(config.spec.data)\ntype = <class 'str'>, value = SGVsbG8gd29ybGQh\n\nIn [11]: super_print(config.spec.templating)\ntype = <class 'NoneType'>, value = None\n\n
"},{"location":"objects/configs/#methods","title":"Methods","text":""},{"location":"objects/configs/#python_on_whales.Config","title":"Config","text":""},{"location":"objects/configs/#python_on_whales.Config.remove","title":"remove","text":"
remove()\n

Remove this config.

Note that you can also use a python_on_whales.Config as a context manager to ensure it's removed even if an exception occurs.

"},{"location":"objects/containers/","title":"Docker containers","text":"

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_container = docker.container.inspect(\"my-container-name\")\n\n# for example:\nif my_container.state.running:\n    my_container.kill()\n\n

For type hints, use this

from python_on_whales import Container\n\ndef print_dodo(container: Container):\n    print(container.execute([\"echo\", \"dodo\"]))\n
"},{"location":"objects/containers/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker container inspect ...

If you want to know the exact structure, you can go to the docker container inspect reference page and click on \"200 no error\". An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: container = docker.run(\"ubuntu\", [\"sleep\", \"infinity\"], detach=True)\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [4]: super_print(container.id)\ntype = <class 'str'>, value = 0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad\n\nIn [5]: super_print(container.created)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:42.492387+00:00\n\nIn [6]: super_print(container.path)\ntype = <class 'str'>, value = sleep\n\nIn [7]: super_print(container.args)\ntype = <class 'list'>, value = ['infinity']\n\nIn [8]: super_print(container.state.status)\ntype = <class 'str'>, value = running\n\nIn [9]: super_print(container.state.running)\ntype = <class 'bool'>, value = True\n\nIn [10]: super_print(container.state.paused)\ntype = <class 'bool'>, value = False\n\nIn [11]: super_print(container.state.restarting)\ntype = <class 'bool'>, value = False\n\nIn [12]: super_print(container.state.oom_killed)\ntype = <class 'bool'>, value = False\n\nIn [13]: super_print(container.state.dead)\ntype = <class 'bool'>, value = False\n\nIn [14]: super_print(container.state.pid)\ntype = <class 'int'>, value = 2696\n\nIn [15]: super_print(container.state.exit_code)\ntype = <class 'int'>, value = 0\n\nIn [16]: super_print(container.state.error)\ntype = <class 'str'>, value = \n\nIn [17]: super_print(container.state.started_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:42.690774+00:00\n\nIn [18]: super_print(container.state.finished_at)\ntype = <class 'datetime.datetime'>, value = 0001-01-01 00:00:00+00:00\n\nIn [19]: super_print(container.state.health)\ntype = <class 'NoneType'>, value = None\n\nIn [20]: super_print(container.image)\ntype = <class 'str'>, value = sha256:35a88802559dd2077e584394471ddaa1a2c5bfd16893b829ea57619301eb3908\n\nIn [21]: super_print(container.resolv_conf_path)\ntype = <class 'str'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/resolv.conf\n\nIn [22]: super_print(container.hostname_path)\ntype = <class 'pathlib.PosixPath'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/hostname\n\nIn [23]: super_print(container.hosts_path)\ntype = <class 'pathlib.PosixPath'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/hosts\n\nIn [24]: super_print(container.log_path)\ntype = <class 'pathlib.PosixPath'>, value = /var/lib/docker/containers/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad/0c8e70d55ff6c3c28e75ec494bc3f9554f3d686098c3ca5f6f94e8d3d853a3ad-json.log\n\nIn [25]: super_print(container.node)\ntype = <class 'NoneType'>, value = None\n\nIn [26]: super_print(container.name)\ntype = <class 'str'>, value = tender_dubinsky\n\nIn [27]: super_print(container.restart_count)\ntype = <class 'int'>, value = 0\n\nIn [28]: super_print(container.driver)\ntype = <class 'str'>, value = overlay2\n\nIn [29]: super_print(container.platform)\ntype = <class 'str'>, value = linux\n\nIn [30]: super_print(container.mount_label)\ntype = <class 'str'>, value = \n\nIn [31]: super_print(container.process_label)\ntype = <class 'str'>, value = \n\nIn [32]: super_print(container.app_armor_profile)\ntype = <class 'str'>, value = docker-default\n\nIn [33]: super_print(container.exec_ids)\ntype = <class 'NoneType'>, value = None\n\nIn [34]: super_print(container.host_config.cpu_shares)\ntype = <class 'int'>, value = 0\n\nIn [35]: super_print(container.host_config.memory)\ntype = <class 'int'>, value = 0\n\nIn [36]: super_print(container.host_config.cgroup_parent)\ntype = <class 'pathlib.PosixPath'>, value = .\n\nIn [37]: super_print(container.host_config.blkio_weight)\ntype = <class 'int'>, value = 0\n\nIn [38]: super_print(container.host_config.blkio_weight_device)\ntype = <class 'list'>, value = []\n\nIn [39]: super_print(container.host_config.blkio_device_read_bps)\ntype = <class 'list'>, value = []\n\nIn [40]: super_print(container.host_config.blkio_device_write_bps)\ntype = <class 'list'>, value = []\n\nIn [41]: super_print(container.host_config.blkio_device_read_iops)\ntype = <class 'list'>, value = []\n\nIn [42]: super_print(container.host_config.blkio_device_write_iops)\ntype = <class 'list'>, value = []\n\nIn [43]: super_print(container.host_config.cpu_period)\ntype = <class 'int'>, value = 0\n\nIn [44]: super_print(container.host_config.cpu_quota)\ntype = <class 'int'>, value = 0\n\nIn [45]: super_print(container.host_config.cpu_realtime_period)\ntype = <class 'int'>, value = 0\n\nIn [46]: super_print(container.host_config.cpu_realtime_runtime)\ntype = <class 'int'>, value = 0\n\nIn [47]: super_print(container.host_config.cpuset_cpus)\ntype = <class 'str'>, value = \n\nIn [48]: super_print(container.host_config.cpuset_mems)\ntype = <class 'str'>, value = \n\nIn [49]: super_print(container.host_config.devices)\ntype = <class 'list'>, value = []\n\nIn [50]: super_print(container.host_config.device_cgroup_rules)\ntype = <class 'NoneType'>, value = None\n\nIn [51]: super_print(container.host_config.device_requests)\ntype = <class 'NoneType'>, value = None\n\nIn [52]: super_print(container.host_config.kernel_memory)\ntype = <class 'NoneType'>, value = None\n\nIn [53]: super_print(container.host_config.kernel_memory_tcp)\ntype = <class 'NoneType'>, value = None\n\nIn [54]: super_print(container.host_config.memory_reservation)\ntype = <class 'int'>, value = 0\n\nIn [55]: super_print(container.host_config.memory_swap)\ntype = <class 'int'>, value = 0\n\nIn [56]: super_print(container.host_config.memory_swappiness)\ntype = <class 'NoneType'>, value = None\n\nIn [57]: super_print(container.host_config.nano_cpus)\ntype = <class 'int'>, value = 0\n\nIn [58]: super_print(container.host_config.oom_kill_disable)\ntype = <class 'NoneType'>, value = None\n\nIn [59]: super_print(container.host_config.init)\ntype = <class 'NoneType'>, value = None\n\nIn [60]: super_print(container.host_config.pids_limit)\ntype = <class 'NoneType'>, value = None\n\nIn [61]: super_print(container.host_config.ulimits)\ntype = <class 'list'>, value = []\n\nIn [62]: super_print(container.host_config.cpu_count)\ntype = <class 'int'>, value = 0\n\nIn [63]: super_print(container.host_config.cpu_percent)\ntype = <class 'int'>, value = 0\n\nIn [64]: super_print(container.host_config.binds)\ntype = <class 'NoneType'>, value = None\n\nIn [65]: super_print(container.host_config.container_id_file)\ntype = <class 'pathlib.PosixPath'>, value = .\n\nIn [66]: super_print(container.host_config.log_config.type)\ntype = <class 'str'>, value = json-file\n\nIn [67]: super_print(container.host_config.log_config.config)\ntype = <class 'dict'>, value = {}\n\nIn [68]: super_print(container.host_config.network_mode)\ntype = <class 'str'>, value = bridge\n\nIn [69]: super_print(container.host_config.port_bindings)\ntype = <class 'dict'>, value = {}\n\nIn [70]: super_print(container.host_config.restart_policy.name)\ntype = <class 'str'>, value = no\n\nIn [71]: super_print(container.host_config.restart_policy.maximum_retry_count)\ntype = <class 'int'>, value = 0\n\nIn [72]: super_print(container.host_config.auto_remove)\ntype = <class 'bool'>, value = False\n\nIn [73]: super_print(container.host_config.volume_driver)\ntype = <class 'str'>, value = \n\nIn [74]: super_print(container.host_config.volumes_from)\ntype = <class 'NoneType'>, value = None\n\nIn [75]: super_print(container.host_config.mounts)\ntype = <class 'NoneType'>, value = None\n\nIn [76]: super_print(container.host_config.capabilities)\ntype = <class 'NoneType'>, value = None\n\nIn [77]: super_print(container.host_config.cap_add)\ntype = <class 'NoneType'>, value = None\n\nIn [78]: super_print(container.host_config.cap_drop)\ntype = <class 'NoneType'>, value = None\n\nIn [79]: super_print(container.host_config.dns)\ntype = <class 'list'>, value = []\n\nIn [80]: super_print(container.host_config.dns_options)\ntype = <class 'list'>, value = []\n\nIn [81]: super_print(container.host_config.dns_search)\ntype = <class 'list'>, value = []\n\nIn [82]: super_print(container.host_config.extra_hosts)\ntype = <class 'NoneType'>, value = None\n\nIn [83]: super_print(container.host_config.group_add)\ntype = <class 'NoneType'>, value = None\n\nIn [84]: super_print(container.host_config.ipc_mode)\ntype = <class 'str'>, value = private\n\nIn [85]: super_print(container.host_config.cgroup)\ntype = <class 'str'>, value = \n\nIn [86]: super_print(container.host_config.links)\ntype = <class 'NoneType'>, value = None\n\nIn [87]: super_print(container.host_config.oom_score_adj)\ntype = <class 'int'>, value = 0\n\nIn [88]: super_print(container.host_config.pid_mode)\ntype = <class 'str'>, value = \n\nIn [89]: super_print(container.host_config.privileged)\ntype = <class 'bool'>, value = False\n\nIn [90]: super_print(container.host_config.publish_all_ports)\ntype = <class 'bool'>, value = False\n\nIn [91]: super_print(container.host_config.readonly_rootfs)\ntype = <class 'bool'>, value = False\n\nIn [92]: super_print(container.host_config.security_opt)\ntype = <class 'NoneType'>, value = None\n\nIn [93]: super_print(container.host_config.storage_opt)\ntype = <class 'NoneType'>, value = None\n\nIn [94]: super_print(container.host_config.tmpfs)\ntype = <class 'NoneType'>, value = None\n\nIn [95]: super_print(container.host_config.uts_mode)\ntype = <class 'str'>, value = \n\nIn [96]: super_print(container.host_config.userns_mode)\ntype = <class 'str'>, value = \n\nIn [97]: super_print(container.host_config.shm_size)\ntype = <class 'int'>, value = 67108864\n\nIn [98]: super_print(container.host_config.sysctls)\ntype = <class 'NoneType'>, value = None\n\nIn [99]: super_print(container.host_config.runtime)\ntype = <class 'str'>, value = runc\n\nIn [100]: super_print(container.host_config.console_size)\ntype = <class 'tuple'>, value = (0, 0)\n\nIn [101]: super_print(container.host_config.isolation)\ntype = <class 'str'>, value = \n\nIn [102]: super_print(container.host_config.masked_paths)\ntype = <class 'list'>, value = [PosixPath('/proc/asound'), PosixPath('/proc/acpi'), PosixPath('/proc/kcore'), PosixPath('/proc/keys'), PosixPath('/proc/latency_stats'), PosixPath('/proc/timer_list'), PosixPath('/proc/timer_stats'), PosixPath('/proc/sched_debug'), PosixPath('/proc/scsi'), PosixPath('/sys/firmware'), PosixPath('/sys/devices/virtual/powercap')]\n\nIn [103]: super_print(container.host_config.readonly_paths)\ntype = <class 'list'>, value = [PosixPath('/proc/bus'), PosixPath('/proc/fs'), PosixPath('/proc/irq'), PosixPath('/proc/sys'), PosixPath('/proc/sysrq-trigger')]\n\nIn [104]: super_print(container.graph_driver.name)\ntype = <class 'str'>, value = overlay2\n\nIn [105]: super_print(container.graph_driver.data)\ntype = <class 'dict'>, value = {'LowerDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e-init/diff:/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/diff', 'MergedDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e/merged', 'UpperDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e/diff', 'WorkDir': '/var/lib/docker/overlay2/9c5a4188fdabc845d4c207cc6f079274a9add6a613592cf479470f69b691d13e/work'}\n\nIn [106]: super_print(container.size_rw)\ntype = <class 'NoneType'>, value = None\n\nIn [107]: super_print(container.size_root_fs)\ntype = <class 'NoneType'>, value = None\n\nIn [108]: super_print(container.mounts)\ntype = <class 'list'>, value = []\n\nIn [109]: super_print(container.config.hostname)\ntype = <class 'str'>, value = 0c8e70d55ff6\n\nIn [110]: super_print(container.config.domainname)\ntype = <class 'str'>, value = \n\nIn [111]: super_print(container.config.user)\ntype = <class 'str'>, value = \n\nIn [112]: super_print(container.config.attach_stdin)\ntype = <class 'bool'>, value = False\n\nIn [113]: super_print(container.config.attach_stdout)\ntype = <class 'bool'>, value = False\n\nIn [114]: super_print(container.config.attach_stderr)\ntype = <class 'bool'>, value = False\n\nIn [115]: super_print(container.config.exposed_ports)\ntype = <class 'NoneType'>, value = None\n\nIn [116]: super_print(container.config.tty)\ntype = <class 'bool'>, value = False\n\nIn [117]: super_print(container.config.open_stdin)\ntype = <class 'bool'>, value = False\n\nIn [118]: super_print(container.config.stdin_once)\ntype = <class 'bool'>, value = False\n\nIn [119]: super_print(container.config.env)\ntype = <class 'list'>, value = ['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin']\n\nIn [120]: super_print(container.config.cmd)\ntype = <class 'list'>, value = ['sleep', 'infinity']\n\nIn [121]: super_print(container.config.healthcheck)\ntype = <class 'NoneType'>, value = None\n\nIn [122]: super_print(container.config.args_escaped)\ntype = <class 'NoneType'>, value = None\n\nIn [123]: super_print(container.config.image)\ntype = <class 'str'>, value = ubuntu\n\nIn [124]: super_print(container.config.volumes)\ntype = <class 'NoneType'>, value = None\n\nIn [125]: super_print(container.config.working_dir)\ntype = <class 'pathlib.PosixPath'>, value = .\n\nIn [126]: super_print(container.config.entrypoint)\ntype = <class 'NoneType'>, value = None\n\nIn [127]: super_print(container.config.network_disabled)\ntype = <class 'NoneType'>, value = None\n\nIn [128]: super_print(container.config.mac_address)\ntype = <class 'NoneType'>, value = None\n\nIn [129]: super_print(container.config.on_build)\ntype = <class 'NoneType'>, value = None\n\nIn [130]: super_print(container.config.labels)\ntype = <class 'dict'>, value = {'org.opencontainers.image.ref.name': 'ubuntu', 'org.opencontainers.image.version': '24.04'}\n\nIn [131]: super_print(container.config.stop_signal)\ntype = <class 'NoneType'>, value = None\n\nIn [132]: super_print(container.config.stop_timeout)\ntype = <class 'NoneType'>, value = None\n\nIn [133]: super_print(container.config.shell)\ntype = <class 'NoneType'>, value = None\n\nIn [134]: super_print(container.network_settings.bridge)\ntype = <class 'str'>, value = \n\nIn [135]: super_print(container.network_settings.sandbox_id)\ntype = <class 'str'>, value = 22e349989b55b73ca9d0fd1eef5d3328aa27ca13991716ee7e0d0293c844409d\n\nIn [136]: super_print(container.network_settings.hairpin_mode)\ntype = <class 'bool'>, value = False\n\nIn [137]: super_print(container.network_settings.link_local_ipv6_address)\ntype = <class 'str'>, value = \n\nIn [138]: super_print(container.network_settings.link_local_ipv6_prefix_length)\ntype = <class 'int'>, value = 0\n\nIn [139]: super_print(container.network_settings.ports)\ntype = <class 'dict'>, value = {}\n\nIn [140]: super_print(container.network_settings.sandbox_key)\ntype = <class 'pathlib.PosixPath'>, value = /var/run/docker/netns/22e349989b55\n\nIn [141]: super_print(container.network_settings.secondary_ip_addresses)\ntype = <class 'NoneType'>, value = None\n\nIn [142]: super_print(container.network_settings.secondary_ipv6_addresses)\ntype = <class 'NoneType'>, value = None\n\nIn [143]: super_print(container.network_settings.endpoint_id)\ntype = <class 'str'>, value = 4152cafa6948b742e16047abaaadd4d4b676d214b07b96946a8f57b34eafa68e\n\nIn [144]: super_print(container.network_settings.gateway)\ntype = <class 'str'>, value = 172.17.0.1\n\nIn [145]: super_print(container.network_settings.global_ipv6_address)\ntype = <class 'str'>, value = \n\nIn [146]: super_print(container.network_settings.global_ipv6_prefix_length)\ntype = <class 'int'>, value = 0\n\nIn [147]: super_print(container.network_settings.ip_address)\ntype = <class 'str'>, value = 172.17.0.2\n\nIn [148]: super_print(container.network_settings.ip_prefix_length)\ntype = <class 'int'>, value = 16\n\nIn [149]: super_print(container.network_settings.ipv6_gateway)\ntype = <class 'str'>, value = \n\nIn [150]: super_print(container.network_settings.mac_address)\ntype = <class 'str'>, value = 02:42:ac:11:00:02\n\nIn [151]: super_print(container.network_settings.networks)\ntype = <class 'dict'>, value = {'bridge': NetworkInspectResult(ipam_config=None, links=None, aliases=None, network_id='399724f5350f5e034c13aac3f6148368985003610391d744df7943e83b4f85b2', endpoint_id='4152cafa6948b742e16047abaaadd4d4b676d214b07b96946a8f57b34eafa68e', gateway='172.17.0.1', ip_address='172.17.0.2', ip_prefix_length=16, ipv6_gateway='', global_ipv6_address='', global_ipv6_prefix_length=0, mac_address='02:42:ac:11:00:02', driver_options=None)}\n\n
"},{"location":"objects/containers/#methods","title":"Methods","text":""},{"location":"objects/containers/#python_on_whales.Container","title":"Container","text":""},{"location":"objects/containers/#python_on_whales.Container.attach","title":"attach","text":"
attach(detach_keys=None, stdin=True, sig_proxy=True)\n

Attach local standard input, output, and error streams to a running container.

Alias: docker.attach(...)

See the docker.container.attach command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.commit","title":"commit","text":"
commit(tag=None, author=None, message=None, pause=True)\n

Create a new image from the container's changes.

Alias: docker.commit(...)

See the docker.container.commit command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.diff","title":"diff","text":"
diff()\n

Returns the diff of this container filesystem.

See the docker.container.diff command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.execute","title":"execute","text":"
execute(\n    command,\n    detach=False,\n    envs={},\n    env_files=[],\n    interactive=False,\n    privileged=False,\n    tty=False,\n    user=None,\n    workdir=None,\n    stream=False,\n    detach_keys=None,\n)\n

Execute a command in this container

See the docker.container.execute command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.exists","title":"exists","text":"
exists()\n

Returns True if the docker container exists and False if it doesn't exists.

If it doesn't exists, it most likely mean that it was removed.

See the docker.container.exists command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.export","title":"export","text":"
export(output)\n

Export this container filesystem.

See the docker.container.export command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.kill","title":"kill","text":"
kill(signal=None)\n

Kill this container

See the docker.container.kill command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.logs","title":"logs","text":"
logs(\n    *,\n    details=False,\n    since=None,\n    tail=None,\n    timestamps=False,\n    until=None\n)\n

Returns the logs of the container

See the docker.container.logs command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.pause","title":"pause","text":"
pause()\n

Pause this container.

See the docker.container.pause command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.remove","title":"remove","text":"
remove(force=False, volumes=False)\n

Remove this container.

See the docker.container.remove command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.rename","title":"rename","text":"
rename(new_name)\n

Rename this container

See the docker.container.rename command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.restart","title":"restart","text":"
restart(time=None)\n

Restarts this container.

See the docker.container.restart command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.start","title":"start","text":"
start(\n    attach=False,\n    interactive=False,\n    stream=False,\n    detach_keys=None,\n)\n

Starts this container.

See the docker.container.start command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.stop","title":"stop","text":"
stop(time=None)\n

Stops this container.

See the docker.container.stop command for information about the arguments.

"},{"location":"objects/containers/#python_on_whales.Container.unpause","title":"unpause","text":"
unpause()\n

Unpause the container

See the docker.container.unpause command for information about the arguments.

"},{"location":"objects/images/","title":"Docker images","text":"

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_docker_image = docker.image.inspect(\"my-image-name\")\n\n# or\n\nmy_docker_image = docker.pull(\"my-image-name\")\n

For type hints, use this

from python_on_whales import docker, Image\n\ndef print_dodo(image: Image):\n    print(docker.run(image, [\"echo\", \"dodo\"]))\n
"},{"location":"objects/images/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker image inspect ...

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: image = docker.pull(\"ubuntu\")\n20.04: Pulling from library/ubuntu\n6a5697faee43: Pull complete\nba13d3bc422b: Pull complete\na254829d9e55: Pull complete\nDigest: sha256:fff16eea1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1\nStatus: Downloaded newer image for ubuntu:latest\ndocker.io/library/ubuntu:latest\n\nIn [3]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [4]: super_print(image.id)\ntype = <class 'str'>, value = sha256:35a88802559dd2077e584394471ddaa1a2c5bfd16893b829ea57619301eb3908\n\nIn [5]: super_print(image.repo_tags)\ntype = <class 'list'>, value = ['ubuntu:latest']\n\nIn [6]: super_print(image.repo_digests)\ntype = <class 'list'>, value = ['ubuntu@sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30']\n\nIn [7]: super_print(image.parent)\ntype = <class 'str'>, value = \n\nIn [8]: super_print(image.comment)\ntype = <class 'str'>, value = \n\nIn [9]: super_print(image.created)\ntype = <class 'datetime.datetime'>, value = 2024-06-07 12:00:09.099611+00:00\n\nIn [10]: super_print(image.container)\ntype = <class 'NoneType'>, value = None\n\nIn [11]: super_print(image.container_config)\ntype = <class 'NoneType'>, value = None\n\nIn [12]: super_print(image.docker_version)\ntype = <class 'str'>, value = 24.0.5\n\nIn [13]: super_print(image.author)\ntype = <class 'str'>, value = \n\nIn [14]: super_print(image.config)\ntype = <class 'python_on_whales.components.container.models.ContainerConfig'>, value = hostname='' domainname='' user='' attach_stdin=False attach_stdout=False attach_stderr=False exposed_ports=None tty=False open_stdin=False stdin_once=False env=['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'] cmd=['/bin/bash'] healthcheck=None args_escaped=None image='sha256:5333392d4deeb70ab614d13914296b3ed15740bbf2c6e8557d681bc451013010' volumes=None working_dir=PosixPath('.') entrypoint=None network_disabled=None mac_address=None on_build=None labels={'org.opencontainers.image.ref.name': 'ubuntu', 'org.opencontainers.image.version': '24.04'} stop_signal=None stop_timeout=None shell=None systemd_mode=None\n\nIn [15]: super_print(image.architecture)\ntype = <class 'str'>, value = amd64\n\nIn [16]: super_print(image.os)\ntype = <class 'str'>, value = linux\n\nIn [17]: super_print(image.os_version)\ntype = <class 'NoneType'>, value = None\n\nIn [18]: super_print(image.size)\ntype = <class 'int'>, value = 78046512\n\nIn [19]: super_print(image.virtual_size)\ntype = <class 'NoneType'>, value = None\n\nIn [20]: super_print(image.graph_driver.name)\ntype = <class 'str'>, value = overlay2\n\nIn [21]: super_print(image.graph_driver.data)\ntype = <class 'dict'>, value = {'MergedDir': '/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/merged', 'UpperDir': '/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/diff', 'WorkDir': '/var/lib/docker/overlay2/74193457b8507d42caa86c55d9a8318ee47c482fbaf86804ba39c77e2bd1d85d/work'}\n\nIn [22]: super_print(image.root_fs.type)\ntype = <class 'str'>, value = layers\n\nIn [23]: super_print(image.root_fs.layers)\ntype = <class 'list'>, value = ['sha256:a30a5965a4f7d9d5ff76a46eb8939f58e95be844de1ac4a4b452d5d31158fdea']\n\nIn [24]: super_print(image.root_fs.base_layer)\ntype = <class 'NoneType'>, value = None\n\nIn [25]: super_print(image.metadata)\ntype = <class 'dict'>, value = {'LastTagTime': '0001-01-01T00:00:00Z'}\n\n
"},{"location":"objects/images/#methods","title":"Methods","text":""},{"location":"objects/images/#python_on_whales.Image","title":"Image","text":""},{"location":"objects/images/#python_on_whales.Image.copy_from","title":"copy_from","text":"
copy_from(path_in_image, destination, pull='missing')\n

Copy a file from a docker image in the local filesystem.

See the docker.image.copy_from command for information about the arguments.

"},{"location":"objects/images/#python_on_whales.Image.copy_to","title":"copy_to","text":"
copy_to(\n    local_path, path_in_image, new_tag=None, pull=\"missing\"\n)\n

Copy a file from the local filesystem in a docker image to create a new docker image.

As if you did a dockerfile with a COPY instruction.

See the docker.image.copy_to command for information about the arguments.

"},{"location":"objects/images/#python_on_whales.Image.exists","title":"exists","text":"
exists()\n

Returns True if the docker image exists and False if it doesn't exists.

Note that you might have done docker.image.remove(\"some_tag\") and the image might still exists because python-on-whales references images by id, not by tag.

See the docker.image.exists command for information about the arguments.

"},{"location":"objects/images/#python_on_whales.Image.remove","title":"remove","text":"
remove(force=False, prune=True)\n

Remove this Docker image.

See the docker.image.remove command for information about the arguments.

"},{"location":"objects/images/#python_on_whales.Image.save","title":"save","text":"
save(output=None)\n

Saves this Docker image in a tar.

See the docker.image.save command for information about the arguments.

"},{"location":"objects/images/#python_on_whales.Image.tag","title":"tag","text":"
tag(new_tag)\n

Add a tag to a Docker image.

See the docker.image.tag command for information about the arguments.

"},{"location":"objects/networks/","title":"Docker networks","text":"

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_network = docker.network.create(\"some-network\")\n\nmy_network = docker.container.inspect(\"some-network\")\n

For type hints, use this

from python_on_whales import Network, docker\n\ndef ping_hostname_in_network(my_network: Network):\n    docker.run(\"busybox\", [\"ping\", \"-c\", \"10\", \"my_hostname\"], networks=[my_network])\n
"},{"location":"objects/networks/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker network inspect ...

If you want to know the exact structure, you can go to the docker network inspect reference page and click on \"200 no error\". An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: network = docker.network.create(\"my-network\")\n\nIn [3]: container = docker.run(\n            \"ubuntu\", [\"sleep\", \"infinity\"], name=\"my_ubuntu\", detach=True, networks=[network]\n        )\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [5]: super_print(network.name)\ntype = <class 'str'>, value = my-network\n\nIn [6]: super_print(network.id)\ntype = <class 'str'>, value = 25ef3691bdaf9226fa5d35425b58ae80b32940ce868041a3962f4d692ea5d73d\n\nIn [7]: super_print(network.created)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:29.524886+00:00\n\nIn [8]: super_print(network.scope)\ntype = <class 'str'>, value = local\n\nIn [9]: super_print(network.driver)\ntype = <class 'str'>, value = bridge\n\nIn [10]: super_print(network.enable_ipv6)\ntype = <class 'bool'>, value = False\n\nIn [11]: super_print(network.ipam.driver)\ntype = <class 'str'>, value = default\n\nIn [12]: super_print(network.ipam.config)\ntype = <class 'list'>, value = [{'Subnet': '172.19.0.0/16', 'Gateway': '172.19.0.1'}]\n\nIn [13]: super_print(network.ipam.options)\ntype = <class 'dict'>, value = {}\n\nIn [14]: super_print(network.internal)\ntype = <class 'bool'>, value = False\n\nIn [15]: super_print(network.attachable)\ntype = <class 'bool'>, value = False\n\nIn [16]: super_print(network.ingress)\ntype = <class 'bool'>, value = False\n\nIn [17]: super_print(network.containers)\ntype = <class 'dict'>, value = {'9ed29545345c163a916ea0d348e971fb2bfed9e0ae0edcb769cb4099216b25ea': NetworkContainer(name='my_ubuntu', endpoint_id='f5b4654375118885360090b37e34c65c971f36e9be40600531098a5b7e0e4089', mac_address='02:42:ac:13:00:02', ipv4_address='172.19.0.2/16', ipv6_address='')}\n\nIn [18]: super_print(network.options)\ntype = <class 'dict'>, value = {}\n\nIn [19]: super_print(network.labels)\ntype = <class 'dict'>, value = {}\n\nIn [20]: super_print(network.config_from)\ntype = <class 'dict'>, value = {'Network': ''}\n\nIn [21]: super_print(network.config_only)\ntype = <class 'bool'>, value = False\n\n
"},{"location":"objects/networks/#methods","title":"Methods","text":""},{"location":"objects/networks/#python_on_whales.Network","title":"Network","text":""},{"location":"objects/networks/#python_on_whales.Network.remove","title":"remove","text":"
remove()\n

Removes this Docker network.

Rather than removing it manually, you can use a context manager to make sure the network is deleted even if an exception is raised.

from python_on_whales import docker\n\nwith docker.network.create(\"some_name\") as my_net:\n    docker.run(\n        \"busybox\",\n        [\"ping\", \"idonotexistatall.com\"],\n        networks=[my_net],\n        remove=True,\n    )\n    # an exception will be raised because the container will fail\n    # but the network will be removed anyway.\n
"},{"location":"objects/nodes/","title":"Docker nodes","text":"

Nodes in Docker swarm

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_docker_image = docker.node.inspect(\"my-node-name\")\n\nlist_of_nodes = docker.node.list()\n

For type hints, use this

from python_on_whales import Node\n\ndef print_state(node: Node):\n    print(node.status.state)\n
"},{"location":"objects/nodes/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker node inspect ...

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: docker.swarm.init()\n\nIn [3]: docker.node.list()[0]\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type = {type(obj)}, value = {obj}\")\n   ...:\n\nIn [4]: super_print(node.id)\ntype = <class 'str'>, value = ee9frjmkrmp3ka8ycx8nxk4nr\n\nIn [5]: super_print(node.version.index)\ntype = <class 'int'>, value = 9\n\nIn [6]: super_print(node.created_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:53.049852+00:00\n\nIn [7]: super_print(node.updated_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:53.560521+00:00\n\nIn [8]: super_print(node.spec.name)\ntype = <class 'NoneType'>, value = None\n\nIn [9]: super_print(node.spec.labels)\ntype = <class 'dict'>, value = {}\n\nIn [10]: super_print(node.spec.role)\ntype = <class 'str'>, value = manager\n\nIn [11]: super_print(node.spec.availability)\ntype = <class 'str'>, value = active\n\nIn [12]: super_print(node.description.hostname)\ntype = <class 'str'>, value = fv-az569-936\n\nIn [13]: super_print(node.description.platform.architecture)\ntype = <class 'str'>, value = x86_64\n\nIn [14]: super_print(node.description.platform.os)\ntype = <class 'str'>, value = linux\n\nIn [15]: super_print(node.description.resources.nano_cpus)\ntype = <class 'int'>, value = 4000000000\n\nIn [16]: super_print(node.description.resources.memory_bytes)\ntype = <class 'int'>, value = 16757342208\n\nIn [17]: super_print(node.description.resources.generic_resources)\ntype = <class 'NoneType'>, value = None\n\nIn [18]: super_print(node.description.engine.engine_version)\ntype = <class 'str'>, value = 26.1.3\n\nIn [19]: super_print(node.description.engine.labels)\ntype = <class 'NoneType'>, value = None\n\nIn [20]: super_print(node.description.engine.plugins)\ntype = <class 'list'>, value = [EnginePlugin(type='Log', name='awslogs'), EnginePlugin(type='Log', name='fluentd'), EnginePlugin(type='Log', name='gcplogs'), EnginePlugin(type='Log', name='gelf'), EnginePlugin(type='Log', name='journald'), EnginePlugin(type='Log', name='json-file'), EnginePlugin(type='Log', name='local'), EnginePlugin(type='Log', name='splunk'), EnginePlugin(type='Log', name='syslog'), EnginePlugin(type='Network', name='bridge'), EnginePlugin(type='Network', name='host'), EnginePlugin(type='Network', name='ipvlan'), EnginePlugin(type='Network', name='macvlan'), EnginePlugin(type='Network', name='null'), EnginePlugin(type='Network', name='overlay'), EnginePlugin(type='Volume', name='local'), EnginePlugin(type='Volume', name='mochoa/s3fs-volume-plugin:latest')]\n\nIn [21]: super_print(node.description.tls_info.trust_root)\ntype = <class 'str'>, value = -----BEGIN CERTIFICATE-----\nMIIBajCCARCgAwIBAgIUV026KPx+m2lBDG60bWmbIW7TJ+QwCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjQwNzE5MTIyODAwWhcNNDQwNzE0MTIy\nODAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABPVCIMeRMVi0xS9yQZ1S1rQc0OoTtVJpIH+DCEVUO65oDLHe9pp1zSkk1gLt\nzP87onTj09KppTI0ndFvk3bS4RijQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBTC5qu98oXnnjfyzO5MJoB/Ft2upTAKBggqhkjO\nPQQDAgNIADBFAiAK3hx0U6DK197w688SGwl+tdqaA9E4Z7a6nzHi5wCjygIhANfc\n4YM5+iEomHSwn043PaHrFXIha/kLW4mfZxqLz/2O\n-----END CERTIFICATE-----\n\n\nIn [22]: super_print(node.description.tls_info.cert_issuer_subject)\ntype = <class 'str'>, value = MBMxETAPBgNVBAMTCHN3YXJtLWNh\n\nIn [23]: super_print(node.description.tls_info.cert_issuer_public_key)\ntype = <class 'str'>, value = MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9UIgx5ExWLTFL3JBnVLWtBzQ6hO1Umkgf4MIRVQ7rmgMsd72mnXNKSTWAu3M/zuidOPT0qmlMjSd0W+TdtLhGA==\n\nIn [24]: super_print(node.status.state)\ntype = <class 'str'>, value = ready\n\nIn [25]: super_print(node.status.message)\ntype = <class 'NoneType'>, value = None\n\nIn [26]: super_print(node.status.addr)\ntype = <class 'str'>, value = 10.1.0.180\n\nIn [27]: super_print(node.manager_status.leader)\ntype = <class 'bool'>, value = True\n\nIn [28]: super_print(node.manager_status.reachability)\ntype = <class 'str'>, value = reachable\n\nIn [29]: super_print(node.manager_status.addr)\ntype = <class 'str'>, value = 10.1.0.180:2377\n\n
"},{"location":"objects/nodes/#methods","title":"Methods","text":""},{"location":"objects/nodes/#python_on_whales.Node","title":"Node","text":""},{"location":"objects/nodes/#python_on_whales.Node.ps","title":"ps","text":"
ps()\n

Returns the list of tasks running on this node

"},{"location":"objects/nodes/#python_on_whales.Node.ps--returns","title":"Returns","text":"
A `List[python_on_whales.Task]` object.\n
"},{"location":"objects/nodes/#python_on_whales.Node.update","title":"update","text":"
update(\n    availability=None,\n    labels_add={},\n    rm_labels=[],\n    role=None,\n)\n

Updates this Swarm node.

See docker.node.update for more information about the arguments.

"},{"location":"objects/plugins/","title":"Docker plugins","text":"

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_docker_plugin = docker.plugin.install(\"vieux/sshfs:latest\")\n# or\nmy_docker_plugin = docker.plugin.inspect(\"vieux/sshfs:latest\")\n# or\nlist_of_plugins = docker.plugins.list()\n

For type hints, use this

from python_on_whales import Plugin\n\ndef print_name(plugin: Plugin):\n    print(plugin.name)\n
"},{"location":"objects/plugins/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker plugin inspect ...

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: plugin = docker.plugin.install(\"vieux/sshfs:latest\")\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type = {type(obj)}, value = {obj}\")\n   ...:\n\nIn [4]: super_print(plugin.id)\ntype = <class 'str'>, value = 534345adf57206caf082d6bb38bc3951bcca35ba2bfa5556cae4b84b2ce803ef\n\nIn [5]: super_print(plugin.name)\ntype = <class 'str'>, value = mochoa/s3fs-volume-plugin:latest\n\nIn [6]: super_print(plugin.enabled)\ntype = <class 'bool'>, value = True\n\nIn [7]: super_print(plugin.settings)\ntype = <class 'python_on_whales.components.plugin.models.PluginSettings'>, value = mounts=[] env=['AWSACCESSKEYID=', 'AWSSECRETACCESSKEY=', 'DEFAULT_S3FSOPTS=nomultipart,use_path_request_style'] args=[] devices=[PluginDevice()]\n\nIn [8]: super_print(plugin.plugin_reference)\ntype = <class 'str'>, value = docker.io/mochoa/s3fs-volume-plugin:latest\n\nIn [9]: super_print(plugin.config)\ntype = <class 'python_on_whales.components.plugin.models.PluginConfig'>, value = docker_version='19.03.15' description='S3FS plugin for Docker v2.0.9' documentation='https://github.com/marcelo-ochoa/docker-volume-plugins/' interface=Interface() entrypoint=['/usr/bin/tini', '--', '/s3fs-volume-plugin'] work_dir=''\n\n
"},{"location":"objects/plugins/#methods","title":"Methods","text":""},{"location":"objects/plugins/#python_on_whales.Plugin","title":"Plugin","text":""},{"location":"objects/plugins/#python_on_whales.Plugin.disable","title":"disable","text":"
disable(force=False)\n

Disable this plugin

"},{"location":"objects/plugins/#python_on_whales.Plugin.enable","title":"enable","text":"
enable(timeout=None)\n

Enable this plugin

"},{"location":"objects/plugins/#python_on_whales.Plugin.push","title":"push","text":"
push(disable_content_trust=True)\n

Push this plugin

"},{"location":"objects/plugins/#python_on_whales.Plugin.remove","title":"remove","text":"
remove(force=False)\n

Remove this plugin

"},{"location":"objects/plugins/#python_on_whales.Plugin.set","title":"set","text":"
set(configuration)\n

Set the configuration for this plugin

"},{"location":"objects/plugins/#python_on_whales.Plugin.upgrade","title":"upgrade","text":"
upgrade(\n    remote=None,\n    disable_content_trust=True,\n    skip_remote_check=False,\n)\n

Upgrade this plugin

"},{"location":"objects/pods/","title":"Podman pods","text":"

Don't use the constructor directly. Instead use

from python_on_whales import DockerClient\n\npodman = DockerClient(client_call=[\"podman\"])\n\nmy_pod = podman.pod.inspect(\"my-pod-name\")\n\n# or\n\nmy_pod = podman.pod.create(\"my-pod-name\")\n

For type hints, use this

from python_on_whales import Pod\n\ndef print_container_names(pod: Pod):\n    print([ctr.name for ctr in pod.containers])\n
"},{"location":"objects/pods/#attributes","title":"Attributes","text":"

The attributes are the same that you get with the command line: podman pod inspect ...

If you want to know the exact structure, you can go to the podman pod inspect reference page

An example is worth many lines of descriptions.

In [1]: from python_on_whales import DockerClient\n\nIn [2]: podman = DockerClient(client_call=[\"podman\"])\n\nIn [3]: pod = podman.pod.create(\"my-pod\")\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [5]: super_print(pod.id)\ntype = <class 'str'>, value = f44088309370b03c4ba354ee6433d08d26e73940ee162de59c71b4c1e3352ed8\n\nIn [6]: super_print(pod.name)\ntype = <class 'str'>, value = my-pod\n\nIn [7]: super_print(pod.created)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:33:02.109606+00:00\n\nIn [8]: super_print(pod.state)\ntype = <class 'str'>, value = Created\n\nIn [9]: super_print(pod.num_containers)\ntype = <class 'int'>, value = 1\n\nIn [10]: super_print(pod.infra_container_id)\ntype = <class 'str'>, value = 4b1d6cfac50742acf4685ec158932a5806c449b9394c2ab6bd870909553b35ce\n\nIn [11]: super_print(pod.shared_namespaces)\ntype = <class 'list'>, value = ['uts', 'ipc', 'net']\n\nIn [12]: super_print(pod.hostname)\ntype = <class 'str'>, value = \n\nIn [13]: super_print(pod.exit_policy)\ntype = <class 'NoneType'>, value = None\n\n
"},{"location":"objects/pods/#methods","title":"Methods","text":""},{"location":"objects/pods/#python_on_whales.Pod","title":"Pod","text":""},{"location":"objects/pods/#python_on_whales.Pod.exists","title":"exists","text":"
exists()\n

Returns True if the pod exists and False if not.

See the podman.pod.exists command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.kill","title":"kill","text":"
kill(*, signal=None)\n

Kill this pod

See the podman.pod.kill command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.logs","title":"logs","text":"
logs(\n    container=None,\n    *,\n    names=False,\n    since=None,\n    tail=None,\n    timestamps=False,\n    until=None,\n    follow=False,\n    stream=False\n)\n

Returns the logs of the pod containers

See the podman.pod.logs command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.pause","title":"pause","text":"
pause()\n

Pause this pod.

See the podman.pod.pause command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.remove","title":"remove","text":"
remove(*, force=False, time=None)\n

Remove this pod.

See the podman.pod.remove command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.restart","title":"restart","text":"
restart()\n

Restart this pod.

See the podman.pod.restart command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.start","title":"start","text":"
start()\n

Starts this pod.

See the podman.pod.start command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.stop","title":"stop","text":"
stop(*, time=None)\n

Stops this pod.

See the podman.pod.stop command for information about the arguments.

"},{"location":"objects/pods/#python_on_whales.Pod.unpause","title":"unpause","text":"
unpause()\n

Unpause the pod

See the podman.pod.unpause command for information about the arguments.

"},{"location":"objects/secrets/","title":"Secrets","text":""},{"location":"objects/secrets/#python_on_whales.Secret","title":"Secret","text":""},{"location":"objects/secrets/#python_on_whales.Secret.remove","title":"remove","text":"
remove()\n

Remove this Docker secret.

See the docker.secret.remove command for information about the arguments.

"},{"location":"objects/services/","title":"Docker services","text":"

Services in Docker swarm

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_docker_service = docker.service.inspect(\"my-service\")\n\nmy_docker_service = docker.service.create(\"busybox\", [\"ping\", \"www.google.com\"])\n\n

For type hints, use this

from python_on_whales import Service\n\ndef print_creation_time(some_service: Service):\n    print(some_service.created_at)\n
"},{"location":"objects/services/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker service inspect ...

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: docker.swarm.init()\n\nIn [3]: my_service = docker.service.create(\"busybox\", [\"ping\", \"www.google.com\"])\n\nIn [4]: def super_print(obj):\n   ...:     print(f\"type = {type(obj)}, value = {obj}\")\n   ...:\n\nIn [4]: super_print(service.id)\ntype = <class 'str'>, value = yw4cbz4s6yhiyusljbysiiz1a\n\nIn [5]: super_print(service.version)\ntype = <class 'python_on_whales.components.service.models.ServiceVersion'>, value = index=11\n\nIn [6]: super_print(service.created_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:55.041139+00:00\n\nIn [7]: super_print(service.updated_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:55.041139+00:00\n\nIn [8]: super_print(service.spec.name)\ntype = <class 'str'>, value = loving_shirley\n\nIn [9]: super_print(service.spec.labels)\ntype = <class 'dict'>, value = {}\n\nIn [10]: super_print(service.spec.mode)\ntype = <class 'dict'>, value = {'Replicated': {'Replicas': 1}}\n\nIn [11]: super_print(service.spec.update_config)\ntype = <class 'python_on_whales.components.service.models.ChangeConfig'>, value = parallelism=1 failure_action='pause' monitor=5000000000 max_failure_ratio=0.0 order='stop-first'\n\nIn [12]: super_print(service.spec.rollback_config)\ntype = <class 'python_on_whales.components.service.models.ChangeConfig'>, value = parallelism=1 failure_action='pause' monitor=5000000000 max_failure_ratio=0.0 order='stop-first'\n\nIn [13]: super_print(service.spec.task_template.container_spec.image)\ntype = <class 'str'>, value = busybox:latest@sha256:9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7\n\nIn [14]: super_print(service.spec.task_template.container_spec.labels)\ntype = <class 'NoneType'>, value = None\n\nIn [15]: super_print(service.spec.task_template.container_spec.privileges)\ntype = <class 'NoneType'>, value = None\n\nIn [16]: super_print(service.spec.task_template.container_spec.stop_grace_period)\ntype = <class 'int'>, value = 10000000000\n\nIn [17]: super_print(service.spec.task_template.container_spec.isolation)\ntype = <class 'str'>, value = default\n\nIn [18]: super_print(service.spec.task_template.container_spec.env)\ntype = <class 'NoneType'>, value = None\n\nIn [19]: super_print(service.spec.task_template.resources.limits)\ntype = <class 'python_on_whales.components.service.models.CPUMemoryQuotas'>, value = nano_cpus=None memory_bytes=None\n\nIn [20]: super_print(service.spec.task_template.resources.reservations)\ntype = <class 'python_on_whales.components.service.models.CPUMemoryQuotas'>, value = nano_cpus=None memory_bytes=None\n\nIn [21]: super_print(service.previous_spec)\ntype = <class 'NoneType'>, value = None\n\nIn [22]: super_print(service.endpoint.spec)\ntype = <class 'python_on_whales.components.service.models.ServiceEndpointSpec'>, value = mode=None ports=None\n\nIn [23]: super_print(service.endpoint.ports)\ntype = <class 'NoneType'>, value = None\n\nIn [24]: super_print(service.endpoint.virtual_ips)\ntype = <class 'NoneType'>, value = None\n\nIn [25]: super_print(service.update_status)\ntype = <class 'NoneType'>, value = None\n\n
"},{"location":"objects/services/#methods","title":"Methods","text":""},{"location":"objects/services/#python_on_whales.Service","title":"Service","text":""},{"location":"objects/services/#python_on_whales.Service.exists","title":"exists","text":"
exists()\n

Returns True if the service is still present in the swarm, False if the service has been removed.

"},{"location":"objects/services/#python_on_whales.Service.ps","title":"ps","text":"
ps()\n

Returns the list of tasks of this service.

"},{"location":"objects/services/#python_on_whales.Service.remove","title":"remove","text":"
remove()\n

Removes this service

It's also possible to use a service as a context manager. By using a context manager, you ensures that the service will be removed even if an exception occurs.

from python_on_whales import docker\n\ndocker.swarm.init()\nwith docker.service.create(\"ubuntu\", [\"sleep\", \"infinity\"]) as my_service:\n    print(\"I'm doing things with the service here\")\n    print(my_service.update_status)\n\nprint(\"I'm out of the context manager, the service has been removed.\")\n
"},{"location":"objects/services/#python_on_whales.Service.scale","title":"scale","text":"
scale(new_scale, detach=False)\n

Change the scale of a service.

See the docker.service.scale command for information about the arguments.

"},{"location":"objects/services/#python_on_whales.Service.update","title":"update","text":"
update(\n    detach=False,\n    force=False,\n    image=None,\n    with_registry_authentication=False,\n    quiet=False,\n    replicas=None,\n)\n

Updates a service

See the docker.service.update command for information about the arguments.

"},{"location":"objects/stacks/","title":"Stacks","text":""},{"location":"objects/stacks/#python_on_whales.Stack","title":"Stack","text":""},{"location":"objects/tasks/","title":"Docker tasks","text":"

Tasks in Docker swarm

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_docker_task = docker.task.inspect(\"some-task-id\")\n\nmy_tasks_list = docker.service.ps(\"my-service\")\n\n

For type hints, use this

from python_on_whales import Task\n\ndef print_creation_time(some_task: Task):\n    print(some_task.created_at)\n
"},{"location":"objects/tasks/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker inspect <task-id>

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

"},{"location":"objects/volumes/","title":"Docker volumes","text":"

Don't use the constructor directly. Instead use

from python_on_whales import docker\n\nmy_docker_volume = docker.volume.inspect(\"my-volume\")\n\n# or\n\nmy_docker_image = docker.volume.create()\n

For type hints, use this

from python_on_whales import docker, Volume\n\ndef print_file(my_volume: Volume):\n    print(\n        docker.run(\n            \"ubuntu\", \n            [\"cat\", \"/some_volume/some_file\"],\n            volumes=[(my_volume, \"/some_volume/some_file\")]\n        )\n    )\n
"},{"location":"objects/volumes/#attributes","title":"Attributes","text":"

It attributes are the same that you get with the command line: docker volume inspect ...

To get a complete description of those attributes, you can take a look at the daemon api reference page and click on \"200 No error\".

An example is worth many lines of descriptions.

In [1]: from python_on_whales import docker\n\nIn [2]: volume = docker.volume.create()\n\nIn [3]: def super_print(obj):\n   ...:     print(f\"type={type(obj)}, value={obj}\")\n   ...:\n\nIn [4]: super_print(volume.name)\ntype = <class 'str'>, value = 57a6bb36fa6c31ab2525cab0443f35ed349295938b3231439afe9a286c589a85\n\nIn [5]: super_print(volume.driver)\ntype = <class 'str'>, value = local\n\nIn [6]: super_print(volume.mountpoint)\ntype = <class 'pathlib.PosixPath'>, value = /var/lib/docker/volumes/57a6bb36fa6c31ab2525cab0443f35ed349295938b3231439afe9a286c589a85/_data\n\nIn [7]: super_print(volume.created_at)\ntype = <class 'datetime.datetime'>, value = 2024-07-19 12:32:42+00:00\n\nIn [8]: super_print(volume.status)\ntype = <class 'NoneType'>, value = None\n\nIn [9]: super_print(volume.labels)\ntype = <class 'dict'>, value = {'com.docker.volume.anonymous': ''}\n\nIn [10]: super_print(volume.scope)\ntype = <class 'str'>, value = local\n\nIn [11]: super_print(volume.options)\ntype = <class 'NoneType'>, value = None\n\n
"},{"location":"objects/volumes/#methods","title":"Methods","text":""},{"location":"objects/volumes/#python_on_whales.Volume","title":"Volume","text":""},{"location":"objects/volumes/#python_on_whales.Volume.clone","title":"clone","text":"
clone(\n    new_volume_name=None, driver=None, labels={}, options={}\n)\n

Creates a new volume and copy all the data inside.

See the docker.volume.clone command for information about the arguments.

"},{"location":"objects/volumes/#python_on_whales.Volume.exists","title":"exists","text":"
exists()\n

Returns True if the docker volume exists and False if it doesn't exists.

If it doesn't exists, it most likely mean that it was removed.

See the docker.volume.exists command for information about the arguments.

"},{"location":"objects/volumes/#python_on_whales.Volume.remove","title":"remove","text":"
remove()\n

Removes this volume

"},{"location":"sub-commands/buildx/","title":"docker buildx","text":""},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI","title":"BuildxCLI","text":""},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.bake","title":"bake","text":"
bake(\n    targets=[],\n    builder=None,\n    files=[],\n    load=False,\n    cache=True,\n    print=False,\n    progress=\"auto\",\n    pull=False,\n    push=False,\n    set={},\n    variables={},\n    stream_logs=False,\n)\n

Bake is similar to make, it allows you to build things declared in a file.

For example it allows you to build multiple docker image in parallel.

The CLI docs is here and it contains a lot more information.

PARAMETER DESCRIPTION targets

Targets or groups of targets to build.

TYPE: Union[str, List[str]] DEFAULT: []

builder

The builder to use.

TYPE: Optional[ValidBuilder] DEFAULT: None

files

Build definition file(s)

TYPE: Union[ValidPath, List[ValidPath]] DEFAULT: []

load

Shorthand for set=[\"*.output=type=docker\"]

TYPE: bool DEFAULT: False

cache

Whether to use the cache or not.

TYPE: bool DEFAULT: True

print

Do nothing, just returns the config.

TYPE: bool DEFAULT: False

progress

Set type of progress output (\"auto\", \"plain\", \"tty\", or False). Use plain to keep the container output on screen

TYPE: Literal['auto', 'plain', 'tty', False] DEFAULT: 'auto'

pull

Always try to pull the newer version of the image

TYPE: bool DEFAULT: False

push

Shorthand for set=[\"*.output=type=registry\"]

TYPE: bool DEFAULT: False

set

A list of overrides in the form \"targetpattern.key=value\".

TYPE: Dict[str, str] DEFAULT: {}

variables

A dict containing the values of the variables defined in the hcl file. See https://github.com/docker/buildx#hcl-variables-and-functions

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.bake--returns","title":"Returns","text":"
The configuration used for the bake (files merged + override with\nthe arguments used in the function). It's the loaded json you would\nobtain by running `docker buildx bake --print --load my_target` if\nyour command was `docker buildx bake --load my_target`. Some example here.\n
from python_on_whales import docker\n\n# returns the config used and runs the builds\nconfig = docker.buildx.bake([\"my_target1\", \"my_target2\"], load=True)\nassert config == {\n    \"target\": {\n        \"my_target1\": {\n            \"context\": \"./\",\n            \"dockerfile\": \"Dockerfile\",\n            \"tags\": [\"pretty_image1:1.0.0\"],\n            \"target\": \"out1\",\n            \"output\": [\"type=docker\"]\n        },\n        \"my_target2\": {\n            \"context\": \"./\",\n            \"dockerfile\": \"Dockerfile\",\n            \"tags\": [\"pretty_image2:1.0.0\"],\n            \"target\": \"out2\",\n            \"output\": [\"type=docker\"]\n        }\n    }\n}\n\n# returns the config only, doesn't run the builds\nconfig = docker.buildx.bake([\"my_target1\", \"my_target2\"], load=True, print=True)\n
"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.build","title":"build","text":"
build(\n    context_path,\n    add_hosts={},\n    allow=[],\n    attest=None,\n    build_args={},\n    build_contexts={},\n    builder=None,\n    cache=True,\n    cache_from=None,\n    cache_to=None,\n    file=None,\n    labels={},\n    load=False,\n    network=None,\n    output={},\n    platforms=None,\n    progress=\"auto\",\n    provenance=None,\n    pull=False,\n    push=False,\n    sbom=None,\n    secrets=[],\n    ssh=None,\n    tags=[],\n    target=None,\n    stream_logs=False,\n)\n

Build a Docker image with builkit as backend.

Alias: docker.build(...)

A python_on_whales.Image is returned, even when using multiple tags. That is because it will produce a single image with multiple tags. If no image is loaded into the Docker daemon (if push=True for ex), then None is returned.

PARAMETER DESCRIPTION context_path

The path of the build context.

TYPE: ValidPath

add_hosts

Hosts to add. add_hosts={\"my_host1\": \"192.168.32.35\"}

TYPE: Dict[str, str] DEFAULT: {}

allow

List of extra privileges. Eg allow=[\"network.host\", \"security.insecure\"]

TYPE: List[str] DEFAULT: []

attest

Attestation parameters. Eg attest={\"type\": \"sbom\", \"generator\": \"my_image\"}

TYPE: Optional[Dict[str, str]] DEFAULT: None

build_args

The build arguments. ex build_args={\"PY_VERSION\": \"3.7.8\", \"UBUNTU_VERSION\": \"20.04\"}.

TYPE: Dict[str, str] DEFAULT: {}

build_contexts

Additional build contexts. build_contexts={[name]: [value], ...} Supports local directories, git repositories, HTTP URL to a tarball, a docker image defined with a docker-image:// prefix, and the oci-layout:// protocol. ex build_contexts={\"project2\": \"../path/to/project2/src\", \"qumu-src\": \"https://github.com/qemu/qemu.git\"}.

TYPE: Dict[str, Union[str, ValidPath]] DEFAULT: {}

builder

Specify which builder to use.

TYPE: Optional[ValidBuilder] DEFAULT: None

cache

Whether or not to use the cache

TYPE: bool DEFAULT: True

cache_from

Works only with the container driver. Loads the cache (if needed) from a registry cache_from=\"user/app:cache\" or a directory on the client cache_from=\"type=local,src=path/to/dir\". It's also possible to use a dict or list of dict form for this argument. e.g. cache_from=dict(type=\"local\", src=\"path/to/dir\")

TYPE: Union[str, Dict[str, str], List[Dict[str, str]], None] DEFAULT: None

cache_to

Works only with the container driver. Sends the resulting docker cache either to a registry cache_to=\"user/app:cache\", or to a local directory cache_to=\"type=local,dest=path/to/dir\". It's also possible to use a dict form for this argument. e.g. cache_to=dict(type=\"local\", dest=\"path/to/dir\", mode=\"max\")

TYPE: Union[str, Dict[str, str], None] DEFAULT: None

file

The path of the Dockerfile

TYPE: Optional[ValidPath] DEFAULT: None

labels

Dict of labels to add to the image. labels={\"very-secure\": \"1\", \"needs-gpu\": \"0\"} for example.

TYPE: Dict[str, str] DEFAULT: {}

load

Shortcut for output=dict(type=\"docker\") If True, docker.buildx.build will return a python_on_whales.Image.

TYPE: bool DEFAULT: False

network

which network to use when building the Docker image

TYPE: Optional[str] DEFAULT: None

output

Output destination (format: output={\"type\": \"local\", \"dest\": \"path\"} Possible output types are [\"local\", \"tar\", \"oci\", \"docker\", \"image\", \"registry\"]. See this link for more details about each exporter.

TYPE: Dict[str, str] DEFAULT: {}

platforms

List of target platforms when building the image. Ex: platforms=[\"linux/amd64\", \"linux/arm64\"]

TYPE: Optional[List[str]] DEFAULT: None

progress

Set type of progress output (auto, plain, tty, or False). Use plain to keep the container output on screen

TYPE: Literal['auto', 'plain', 'tty', False] DEFAULT: 'auto'

provenance

Shortand for attest={\"type\": \"provenance\"}. Eg provenance=True or provenance=dict(mode=\"max\"). provenance=False might be needed if you are having the issue Default image output from buildx v0.10 cannot run on Google Cloud Run or AWS Lambda

TYPE: Union[bool, Dict[str, str], None] DEFAULT: None

pull

Always attempt to pull a newer version of the image

TYPE: bool DEFAULT: False

push

Shorthand for output=dict(type=\"registry\").

TYPE: bool DEFAULT: False

sbom

Shorthand for attest={\"type\": \"sbom\"}. Eg sbom=True.

TYPE: Union[bool, Dict[str, str], None] DEFAULT: None

secrets

One or more secrets passed as string(s). For example secrets=\"id=aws,src=/home/my_user/.aws/credentials\"

TYPE: Union[str, List[str]] DEFAULT: []

ssh

SSH agent socket or keys to expose to the build (format is default|<id>[=<socket>|<key>[,<key>]] as a string)

TYPE: Optional[str] DEFAULT: None

tags

Tag or tags to put on the resulting image.

TYPE: Union[str, List[str]] DEFAULT: []

target

Set the target build stage to build.

TYPE: Optional[str] DEFAULT: None

stream_logs

If True this function will return an iterator of strings. You can then read the logs as they arrive.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.build--returns","title":"Returns","text":"
A `python_on_whales.Image` if a Docker image is loaded\nin the daemon after the build (the default behavior when\ncalling `docker.build(...)`). Otherwise, `None`.\n
"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.create","title":"create","text":"
create(\n    context_or_endpoint=None,\n    buildkitd_flags=None,\n    config=None,\n    platforms=None,\n    driver=None,\n    driver_options={},\n    name=None,\n    use=False,\n)\n

Create a new builder instance

PARAMETER DESCRIPTION context_or_endpoint

TYPE: Optional[str] DEFAULT: None

buildkitd_flags

Flags for buildkitd daemon

TYPE: Optional[str] DEFAULT: None

config

BuildKit config file

TYPE: Optional[ValidPath] DEFAULT: None

platforms

Comma-separated list of platforms of the form OS/architecture/variant. Ex: platforms=[\"linux/amd64\", \"linux/arm64\"]

TYPE: Optional[List[str]] DEFAULT: None

driver

Driver to use (available: [kubernetes docker docker-container])

TYPE: Optional[str] DEFAULT: None

driver_options

Options for the driver. e.g driver_options=dict(network=\"host\")

TYPE: Dict[str, str] DEFAULT: {}

name

Builder instance name

TYPE: Optional[str] DEFAULT: None

use

Set the current builder instance to this builder

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.create--returns","title":"Returns","text":"
A `python_on_whales.Builder` object.\n
"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.disk_usage","title":"disk_usage","text":"
disk_usage()\n

Not yet implemented

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.inspect","title":"inspect","text":"
inspect(x=None)\n

Returns a builder instance from the name.

PARAMETER DESCRIPTION x

If None (the default), returns the current builder. If a string is provided, the builder that has this name is returned.

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.inspect--returns","title":"Returns","text":"
A `python_on_whales.Builder` object.\n
"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.is_installed","title":"is_installed","text":"
is_installed()\n

Returns True if docker buildx is installed and working.

If it's not installed, head to the installation page and follow the instructions.

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.list","title":"list","text":"
list()\n

Returns the list of python_on_whales.Builder available.

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.prune","title":"prune","text":"
prune(all=False, filters={}, stream_logs=False)\n

Remove build cache on the current builder.

PARAMETER DESCRIPTION all

Remove all cache, not just dangling layers

TYPE: bool DEFAULT: False

filters

Filters to use, for example filters=dict(until=\"24h\")

TYPE: Dict[str, str] DEFAULT: {}

stream_logs

If True this function will return an iterator of strings. You can then read the logs as they arrive. If False (the default value), then the function returns None, but when it returns, then the prune operation has already been done.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.remove","title":"remove","text":"
remove(builder)\n

Remove a builder

PARAMETER DESCRIPTION builder

The builder to remove

TYPE: Union[Builder, str]

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.stop","title":"stop","text":"
stop(builder)\n

Stop the builder instance

PARAMETER DESCRIPTION builder

The builder to stop. If None (the default value), the current builder is stopped.

TYPE: Optional[ValidBuilder]

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.use","title":"use","text":"
use(builder, default=False, global_=False)\n

Set the current builder instance

PARAMETER DESCRIPTION builder

The builder to use

TYPE: Union[Builder, str]

default

Set builder as default for the current context

TYPE: bool DEFAULT: False

global_

Builder will be used even when changing contexts

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.cli_wrapper.BuildxCLI.version","title":"version","text":"
version()\n

Returns the docker buildx version as a string.

from python_on_whales import docker\n\nversion = docker.buildx.version()\nprint(version)\n# \"github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2\"\n
"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.imagetools.cli_wrapper.ImagetoolsCLI","title":"ImagetoolsCLI","text":""},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.imagetools.cli_wrapper.ImagetoolsCLI.create","title":"create","text":"
create(\n    sources=[],\n    tags=[],\n    append=False,\n    files=[],\n    dry_run=False,\n    builder=None,\n)\n

Create a new manifest list based on source manifests. The source manifests can be manifest lists or single platform distribution manifests and must already exist in the registry where the new manifest is created. If only one source is specified, create performs a carbon copy.

The CLI docs is here and it contains a lot more information.

PARAMETER DESCRIPTION sources

The sources manifest to create, change

TYPE: List[str] DEFAULT: []

append

Append to existing manifest

TYPE: bool DEFAULT: False

dry_run

Show final image instead of pushing

TYPE: bool DEFAULT: False

files

Read source descriptor from file

TYPE: List[Union[str, Path]] DEFAULT: []

builder

The builder to use.

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/buildx/#python_on_whales.components.buildx.imagetools.cli_wrapper.ImagetoolsCLI.inspect","title":"inspect","text":"
inspect(name)\n

Returns the manifest of a Docker image in a registry without pulling it

"},{"location":"sub-commands/buildx/#notes-about-the-transition-between-the-legacy-builder-and-buildx","title":"Notes about the transition between the legacy builder and buildx","text":"

Users are encouraged to use buildx in Python-on-whales through the docker.build() function.

Buildx is the next gen Docker builder and a transition is underway to make the docker build shell command use buildx. Python-on-whales has had an opinionated answer on the matter as docker.build() will always use buildx. This is because Python-on-whales was created during the transition and doesn't have an existing user codebase to support.

The legacy builder is still available by calling docker.legacy_build(), but note that

  • It won't work if you use Docker 22.06 or above
  • It won't work if you used docker.buildx.install() or docker buildx install previously
  • It won't work if you had set the environment variable DOCKER_BUILDKIT to 1

Some resources on the matter:

  • Discussion about supporting the legacy builder in Python-on-whales
  • Proposal: make BuildKit the default builder on Linux
  • Deprecated Engine Features: Legacy builder for Linux images
"},{"location":"sub-commands/compose/","title":"docker compose","text":""},{"location":"sub-commands/compose/#some-notes-about-the-compose-functions","title":"Some notes about the compose functions","text":"

Behind the scenes, the Go implementation of Docker compose is called a.k.a. Compose v2, not the Python implementation.

You can verify that docker compose is installed by running

docker compose --help\n

Be careful! it's different from docker-compose --help! Notice the - between 'docker' and 'compose'. Compose v2 has no - in the command.

If that doesn't work, then install the cli plugin. it's just a single binary to download.

The Go implementation of compose is still experimental, so take the appropriate precautions.

If you don't need to set any project-wide options, like the project name or the compose file path, you can just import docker and start working.

from python_on_whales import docker\n\ndocker.compose.build()\ndocker.compose.up()\n...\ndocker.compose.down()\n

Otherwise, you have to define your project-wide options only once, when creating the Docker client.

from python_on_whales import DockerClient\n\ndocker = DockerClient(compose_files=[\"./my-compose-file.yml\"])\n\ndocker.compose.build()\ndocker.compose.up()\n...\ndocker.compose.down()\n

You have multiple compose options available (like profiles, env_files, project name) when creating the Docker client. You can check them out in the DockerClient documentation.

"},{"location":"sub-commands/compose/#about-dockercomposeimages","title":"About docker.compose.images().","text":"

The Docker command line has a docker compose images command. Python-on-whales doesn't have an equivalent because it's trivial to do so with existing functions.

images = [docker.image.inspect(container.image) for container in docker.compose.ps()]\n
  • docker.compose.ps() returns the list of all containers in the compose stack.
  • container.image gives you the id of the Docker image of the container as a str.
  • docker.image.inspect() gives you a python_on_whales.Image from a str.
"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI","title":"ComposeCLI","text":""},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.build","title":"build","text":"
build(\n    services=None,\n    build_args={},\n    cache=True,\n    progress=None,\n    pull=False,\n    quiet=False,\n    ssh=None,\n    stream_logs=False,\n)\n

Build services declared in a yaml compose file.

PARAMETER DESCRIPTION services

The services to build (as list of strings). If None (default), all services are built. An empty list means that nothing will be built.

TYPE: Union[List[str], str, None] DEFAULT: None

build_args

Set build-time variables for services. For example build_args={\"PY_VERSION\": \"3.7.8\", \"UBUNTU_VERSION\": \"20.04\"}.

TYPE: Dict[str, str] DEFAULT: {}

cache

Set to False if you don't want to use the cache to build your images

TYPE: bool DEFAULT: True

progress

Set type of progress output (auto, tty, plain, quiet) (default \"auto\")

TYPE: Optional[str] DEFAULT: None

pull

Set to True to always attempt to pull a newer version of the image (in the FROM statements for example).

TYPE: bool DEFAULT: False

quiet

Don't print anything

TYPE: bool DEFAULT: False

ssh

Set SSH authentications used when building service images. (use 'default' for using your default SSH Agent)

TYPE: Optional[str] DEFAULT: None

stream_logs

If False this function returns None. If True, this function returns an Iterable of Tuple[str, bytes] where the first element is the type of log (\"stdin\" or \"stdout\"). The second element is the log itself, as bytes, you'll need to call .decode() if you want the logs as str. See the streaming guide if you are not familiar with the streaming of logs in Python-on-whales.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.config","title":"config","text":"
config(return_json=False)\n

Returns the configuration of the compose stack for further inspection.

For example

from python_on_whales import docker\nproject_config = docker.compose.config()\nprint(project_config.services[\"my_first_service\"].image)\n\"redis\"\n
PARAMETER DESCRIPTION return_json

If False, a ComposeConfig object will be returned, and you 'll be able to take advantage of your IDE autocompletion. If you want the full json output, you may use return_json. In this case, you'll get lists and dicts corresponding to the json response, unmodified. It may be useful if you just want to print the config or want to access a field that was not in the ComposeConfig class.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.config--returns","title":"Returns","text":"
A `ComposeConfig` object if `return_json` is `False`, and a `dict` otherwise.\n
"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.create","title":"create","text":"
create(\n    services=None,\n    build=False,\n    force_recreate=False,\n    no_build=False,\n    no_recreate=False,\n    stream_logs=False,\n)\n

Creates containers for a service.

PARAMETER DESCRIPTION services

The name of the services for which the containers will be created. The default None means that the containers for all services will be created. A single string means we will create the container for a single service. A list of string means we will create the containers for each service in the list. An empty list means nothing will be created, the function call is then a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

build

Build images before starting containers.

TYPE: bool DEFAULT: False

force_recreate

Recreate containers even if their configuration and image haven't changed.

TYPE: bool DEFAULT: False

no_build

Don't build an image, even if it's missing.

TYPE: bool DEFAULT: False

no_recreate

If containers already exist, don't recreate them. Incompatible with force_recreate=True.

TYPE: bool DEFAULT: False

stream_logs

If False this function returns None. If True, this function returns an Iterable of Tuple[str, bytes] where the first element is the type of log (\"stdin\" or \"stdout\"). The second element is the log itself, as bytes, you'll need to call .decode() if you want the logs as str. See the streaming guide if you are not familiar with the streaming of logs in Python-on-whales.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.down","title":"down","text":"
down(\n    services=None,\n    remove_orphans=False,\n    remove_images=None,\n    timeout=None,\n    volumes=False,\n    quiet=False,\n    stream_logs=False,\n)\n

Stops and removes the containers

PARAMETER DESCRIPTION services

The services to stop. If None (default), all services are stopped. If an empty list is provided, the function call does nothing, it's a no-op.

TYPE: Union[List[str], str, None] DEFAULT: None

remove_orphans

Remove containers for services not defined in the Compose file.

TYPE: bool DEFAULT: False

remove_images

Remove images used by services. \"local\" remove only images that don't have a custom tag. Possible values are \"local\" and \"all\".

TYPE: Optional[str] DEFAULT: None

timeout

Specify a shutdown timeout in seconds (default 10).

TYPE: Optional[int] DEFAULT: None

volumes

Remove named volumes declared in the volumes section of the Compose file and anonymous volumes attached to containers.

TYPE: bool DEFAULT: False

quiet

If False, send to stderr and stdout the progress spinners with the messages. If True, do not display anything.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.execute","title":"execute","text":"
execute(\n    service,\n    command,\n    detach=False,\n    envs={},\n    index=1,\n    tty=True,\n    privileged=False,\n    user=None,\n    workdir=None,\n)\n

Execute a command in a running container.

PARAMETER DESCRIPTION service

The name of the service.

TYPE: str

command

The command to execute.

TYPE: List[str]

detach

If True, detach from the container after the command exits. In this case, nothing is returned by the function. By default, the execute command returns only when the command has finished running, and the function will raise an exception DockerException if the command exits with a non-zero exit code. If False, the command is executed and the stdout is returned.

TYPE: bool DEFAULT: False

envs

A dictionary of environment variables to set in the container.

TYPE: Dict[str, str] DEFAULT: {}

index

The index of the container to execute the command in (default 1) if there are multiple containers for this service.

TYPE: int DEFAULT: 1

tty

If True, allocate a pseudo-TTY. Use False to get the output of the command.

TYPE: bool DEFAULT: True

privileged

If True, run the command in privileged mode.

TYPE: bool DEFAULT: False

user

The username to use inside the container.

TYPE: Optional[str] DEFAULT: None

workdir

The working directory inside the container.

TYPE: Union[str, Path, None] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.is_installed","title":"is_installed","text":"
is_installed()\n

Returns True if docker compose (the one written in Go) is installed and working.

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.kill","title":"kill","text":"
kill(services=None, signal=None)\n

Kills the container(s) of a service

PARAMETER DESCRIPTION services

One or more service(s) to kill. The default (None) is to kill all services. A string means the call will kill one single service. A list of service names can be provided to kill multiple services in one function call. An empty list means that no services are going to be killed, the function is then a no-op.

TYPE: Union[str, List[str]] DEFAULT: None

signal

the signal to send to the container. Default is \"SIGKILL\"

TYPE: Optional[Union[int, str]] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.logs","title":"logs","text":"
logs(\n    services=[],\n    tail=None,\n    follow=False,\n    no_log_prefix=False,\n    timestamps=False,\n    since=None,\n    until=None,\n    stream=False,\n)\n

View output from containers

PARAMETER DESCRIPTION services

One or more service(s) to view

TYPE: Union[str, List[str]] DEFAULT: []

tail

Number of lines to show from the end of the logs for each container. (default \"all\")

TYPE: Optional[str] DEFAULT: None

follow

Follow log output WARNING: With this option, docker.compose.logs() will not return at all. Use it exclusively with stream=True. You can loop on the logs but the loop will never end.

TYPE: bool DEFAULT: False

no_log_prefix

Don't print prefix in logs

TYPE: bool DEFAULT: False

timestamps

Show timestamps

TYPE: bool DEFAULT: False

since

Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

TYPE: Optional[str] DEFAULT: None

until

Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

TYPE: Optional[str] DEFAULT: None

stream

Similar to the stream argument of docker.run(). This function will then return and iterator that will yield a tuple (source, content) with source being \"stderr\" or \"stdout\". content is the content of the line as bytes. Take a look at the user guide to have an example of the output.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.logs--returns","title":"Returns","text":"
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`\nif `stream=True`.\n
"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.ls","title":"ls","text":"
ls(all=False, filters={})\n

Returns a list of docker compose projects

PARAMETER DESCRIPTION all

Results include all stopped compose projects.

TYPE: bool DEFAULT: False

filters

Filter results based on conditions provided.

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.ls--returns","title":"Returns","text":"
A `List[python_on_whales.ComposeProject]`\n
"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.pause","title":"pause","text":"
pause(services=None)\n

Pause one or more services

PARAMETER DESCRIPTION services

None (the default) means pause all containers of all compose services. A string means that the call will pause the container of a specific service. A list of string means the call will pause the containers of all the services specified. So if an empty list is provided, then this function call is a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.port","title":"port","text":"
port(service, private_port, index=1, protocol='tcp')\n

Returns the public port for a port binding.

PARAMETER DESCRIPTION service

The name of the service.

TYPE: str

private_port

The private port.

TYPE: Union[str, int]

index

Index of the container if service has multiple replicas (default 1)

TYPE: int DEFAULT: 1

protocol

tcp or udp (default \"tcp\").

TYPE: str DEFAULT: 'tcp'

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.port--returns","title":"Returns","text":"
tuple with (host, port). If port is unknown, then host and port are None.\n
"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.ps","title":"ps","text":"
ps(services=None, all=False)\n

Returns the containers that were created by the current project.

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.ps--returns","title":"Returns","text":"
A `List[python_on_whales.Container]`\n
"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.pull","title":"pull","text":"
pull(\n    services=None,\n    ignore_pull_failures=False,\n    include_deps=False,\n    quiet=False,\n    stream_logs=False,\n)\n

Pull service images

PARAMETER DESCRIPTION services

The list of services to select. Only the images of those services will be pulled. If no services are specified (None) (the default behavior) all images of all services are pulled. If an empty list is provided, then the function call is a no-op.

TYPE: Union[List[str], str, None] DEFAULT: None

ignore_pull_failures

Pull what it can and ignores images with pull failures

TYPE: bool DEFAULT: False

include_deps

Also pull services declared as dependencies

TYPE: bool DEFAULT: False

quiet

By default, the progress bars are printed in stdout and stderr (both). To disable all output, use quiet=True

TYPE: bool DEFAULT: False

stream_logs

If False this function returns None. If True, this function returns an Iterable of Tuple[str, bytes] where the first element is the type of log (\"stdin\" or \"stdout\"). The second element is the log itself, as bytes, you'll need to call .decode() if you want the logs as str. See the streaming guide if you are not familiar with the streaming of logs in Python-on-whales.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.push","title":"push","text":"
push(services=None)\n

Push service images

PARAMETER DESCRIPTION services

The list of services to select. Only the images of those services will be pushed. If no services are specified (None, the default behavior) all images of all services are pushed. If an empty list is provided, then the function call is a no-op.

TYPE: Optional[List[str]] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.restart","title":"restart","text":"
restart(services=None, timeout=None)\n

Restart containers

PARAMETER DESCRIPTION services

The names of one or more services to restart (str or list of str). If the argument is not specified, services is None and all services are restarted. If services is an empty list, then the function call is a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

timeout

The shutdown timeout (int are interpreted as seconds). None means the CLI default value (10s). See the docker stop docs for more details about this argument.

TYPE: Union[int, timedelta, None] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.rm","title":"rm","text":"
rm(services=None, stop=False, volumes=False)\n

Removes stopped service containers

By default, anonymous volumes attached to containers will not be removed. You can override this with volumes=True.

Any data which is not in a volume will be lost.

PARAMETER DESCRIPTION services

The names of one or more services to remove (str or list of str). If None (the default) then all services are removed. If an empty list is provided, this function call is a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

stop

Stop the containers, if required, before removing

TYPE: bool DEFAULT: False

volumes

Remove any anonymous volumes attached to containers

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.run","title":"run","text":"
run(\n    service,\n    command=[],\n    build=False,\n    detach=False,\n    labels={},\n    name=None,\n    tty=True,\n    stream=False,\n    dependencies=True,\n    publish=[],\n    remove=False,\n    service_ports=False,\n    use_aliases=False,\n    user=None,\n    workdir=None,\n)\n

Run a one-off command on a service.

PARAMETER DESCRIPTION service

The name of the service.

TYPE: str

command

The command to execute.

TYPE: List[str] DEFAULT: []

detach

if True, returns immediately with the Container. If False, returns the command stdout as string.

TYPE: bool DEFAULT: False

labels

Add or override labels

TYPE: Dict[str, str] DEFAULT: {}

name

Assign a name to the container.

TYPE: Optional[str] DEFAULT: None

dependencies

Also start linked services.

TYPE: bool DEFAULT: True

publish

Publish a container's port(s) to the host.

TYPE: List[ValidPortMapping] DEFAULT: []

service_ports

Enable service's ports and map them to the host.

TYPE: bool DEFAULT: False

remove

Automatically remove the container when it exits.

TYPE: bool DEFAULT: False

use_aliases

Use the service's network aliases in the connected network(s).

TYPE: bool DEFAULT: False

tty

Allocate a pseudo-TTY. Allow the process to access your terminal to write on it.

TYPE: bool DEFAULT: True

stream

Similar to docker.run(..., stream=True).

TYPE: bool DEFAULT: False

user

Username or UID, format: \"<name|uid>[:<group|gid>]\"

TYPE: Optional[str] DEFAULT: None

workdir

Working directory inside the container

TYPE: Union[None, str, Path] DEFAULT: None

RETURNS DESCRIPTION Union[str, Container, Iterable[Tuple[str, bytes]]]

Optional[str]

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.start","title":"start","text":"
start(services=None, stream_logs=False)\n

Start the specified services.

PARAMETER DESCRIPTION services

The names of one or more services to start. If None (the default), it means all services will start. If an empty list is provided, this function call is a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

stream_logs

If False this function returns None. If True, this function returns an Iterable of Tuple[str, bytes] where the first element is the type of log (\"stdin\" or \"stdout\"). The second element is the log itself, as bytes, you'll need to call .decode() if you want the logs as str. See the streaming guide if you are not familiar with the streaming of logs in Python-on-whales.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.stop","title":"stop","text":"
stop(services=None, timeout=None, stream_logs=False)\n

Stop services

PARAMETER DESCRIPTION services

The names of one or more services to stop (str or list of str). If None (the default), it means all services will stop. If an empty list is provided, this function call is a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

timeout

Number of seconds or timedelta (will be converted to seconds). Specify a shutdown timeout. Default is 10s.

TYPE: Union[int, timedelta, None] DEFAULT: None

stream_logs

If False this function returns None. If True, this function returns an Iterable of Tuple[str, bytes] where the first element is the type of log (\"stdin\" or \"stdout\"). The second element is the log itself, as bytes, you'll need to call .decode() if you want the logs as str. See the streaming guide if you are not familiar with the streaming of logs in Python-on-whales.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.top","title":"top","text":"
top()\n

Not yet implemented

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.unpause","title":"unpause","text":"
unpause(services=None)\n

Unpause one or more services

PARAMETER DESCRIPTION services

One or more service to unpause. If None (the default), all services are unpaused. If services is an empty list, the function call does nothing, it's a no-op.

TYPE: Union[str, List[str], None] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.up","title":"up","text":"
up(\n    services=None,\n    build=False,\n    detach=False,\n    abort_on_container_exit=False,\n    scales={},\n    attach_dependencies=False,\n    force_recreate=False,\n    recreate=True,\n    no_build=False,\n    remove_orphans=False,\n    renew_anon_volumes=False,\n    color=True,\n    log_prefix=True,\n    start=True,\n    quiet=False,\n    wait=False,\n    no_attach_services=None,\n    pull=None,\n    stream_logs=False,\n    wait_timeout=None,\n)\n

Start the containers.

Reading the logs of the containers is not yet implemented.

PARAMETER DESCRIPTION services

The services to start. If None (default), all services are started. If an empty list is provided, the function call does nothing, it's a no-op.

TYPE: Union[List[str], str, None] DEFAULT: None

build

If True, build the docker images before starting the containers even if a docker image with this name already exists. If False (the default), build only the docker images that do not already exist.

TYPE: bool DEFAULT: False

detach

If True, run the containers in the background. If False this function returns only when all containers have stopped. Incompatible with abort_on_container_exit=True.

TYPE: bool DEFAULT: False

abort_on_container_exit

If True stops all containers if any container was stopped. Incompatible with detach=True.

TYPE: bool DEFAULT: False

scales

Scale SERVICE to NUM instances. Overrides the scale setting in the Compose file if present. For example: scales={\"my_service\": 2, \"my_other_service\": 5}.

TYPE: Dict[str, int] DEFAULT: {}

attach_dependencies

Attach to dependent containers.

TYPE: bool DEFAULT: False

force_recreate

Recreate containers even if their configuration and image haven't changed.

TYPE: bool DEFAULT: False

recreate

Recreate the containers if already exist. recreate=False and force_recreate=True are incompatible.

TYPE: bool DEFAULT: True

no_build

Don't build an image, even if it's missing.

TYPE: bool DEFAULT: False

remove_orphans

Remove containers for services not defined in the Compose file.

TYPE: bool DEFAULT: False

renew_anon_volumes

Recreate anonymous volumes instead of retrieving data from the previous containers.

TYPE: bool DEFAULT: False

color

If False, it will produce monochrome output.

TYPE: bool DEFAULT: True

log_prefix

If False, will not display the prefix in the logs.

TYPE: bool DEFAULT: True

start

Start the service after creating them.

TYPE: bool DEFAULT: True

quiet

By default, some progress bars and logs are sent to stderr and stdout. Set quiet=True to avoid having any output.

TYPE: bool DEFAULT: False

wait

Wait for services to be running|healthy. Implies detached mode.

TYPE: bool DEFAULT: False

no_attach_services

The services not to attach to.

TYPE: Union[List[str], str, None] DEFAULT: None

pull

Pull image before running (\u201calways\u201d|\u201dmissing\u201d|\u201dnever\u201d).

TYPE: Literal['always', 'missing', 'never', None] DEFAULT: None

stream_logs

If False this function returns None. If True, this function returns an Iterable of Tuple[str, bytes] where the first element is the type of log (\"stdin\" or \"stdout\"). The second element is the log itself, as bytes, you'll need to call .decode() if you want the logs as str. See the streaming guide if you are not familiar with the streaming of logs in Python-on-whales.

TYPE: bool DEFAULT: False

wait_timeout

Maximum duration to wait for the project to be running|healthy

TYPE: Optional[int] DEFAULT: None

"},{"location":"sub-commands/compose/#python_on_whales.components.compose.cli_wrapper.ComposeCLI.version","title":"version","text":"
version()\n

Returns the version of docker compose as a str.

"},{"location":"sub-commands/config/","title":"docker config","text":""},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI","title":"ConfigCLI","text":""},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.create","title":"create","text":"
create(name, file, labels={}, template_driver=None)\n

Create a config from a file

See the docker docs for more information about swarm configs.

PARAMETER DESCRIPTION name

The config name.

TYPE: str

file

Tbe file to be used as config.

TYPE: Union[str, Path]

labels

The labels to add to the config

TYPE: Dict[str, str] DEFAULT: {}

template_driver

The template driver

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.create--returns","title":"Returns","text":"
A `python_on_whales.Config` object.\n
"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns a python_on_whales.Config object based on its name or id.

"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.inspect--argument","title":"Argument","text":"
x: An id or name or a list of ids/names.\n
"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.inspect--returns","title":"Returns","text":"
A `python_on_whales.Config` if a string was passed as argument. A\n`List[python_on_whales.Config]` if a list of strings was passed as argument.\n
"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.list","title":"list","text":"
list(filters={})\n

List all config available in the swarm.

PARAMETER DESCRIPTION filters

If you want to filter the results based on a given condition. For example, docker.config.list(filters=dict(label=\"my_label=hello\")).

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Config]`.\n
"},{"location":"sub-commands/config/#python_on_whales.components.config.cli_wrapper.ConfigCLI.remove","title":"remove","text":"
remove(x)\n

Remove one or more configs.

PARAMETER DESCRIPTION x

One or a list of configs. Valid values are the id of the config or a python_on_whales.Config object. An empty list means the function call does nothing.

TYPE: Union[ValidConfig, List[ValidConfig]]

"},{"location":"sub-commands/container/","title":"docker container","text":""},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI","title":"ContainerCLI","text":""},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.attach","title":"attach","text":"
attach(\n    container, detach_keys=None, stdin=True, sig_proxy=True\n)\n

Attach local standard input, output, and error streams to a running container

Alias: docker.attach(...)

PARAMETER DESCRIPTION container

The running container to attach to

TYPE: ValidContainer

detach_keys

Override the key sequence for detaching a container

TYPE: Optional[str] DEFAULT: None

stdin

Attach STDIN

TYPE: bool DEFAULT: True

sig_proxy

Proxy all received signals to the process (default true)

TYPE: bool DEFAULT: True

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.attach--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.commit","title":"commit","text":"
commit(\n    container,\n    tag=None,\n    author=None,\n    message=None,\n    pause=True,\n)\n

Create a new image from a container's changes

PARAMETER DESCRIPTION container

The container to create the image from

TYPE: ValidContainer

tag

tag to apply on the image produced

TYPE: Optional[str] DEFAULT: None

author

Author (e.g., \"John Hannibal Smith hannibal@a-team.com\")

TYPE: Optional[str] DEFAULT: None

message

Commit message

TYPE: Optional[str] DEFAULT: None

pause

Pause container during commit

TYPE: bool DEFAULT: True

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.copy","title":"copy","text":"
copy(source, destination)\n

Copy files/folders between a container and the local filesystem

Alias: docker.copy(...)

from python_on_whales import docker\n\ndocker.run(\"ubuntu\", [\"sleep\", \"infinity\"], name=\"dodo\", remove=True, detach=True)\n\ndocker.copy(\"/tmp/my_local_file.txt\", (\"dodo\", \"/path/in/container.txt\"))\ndocker.copy((\"dodo\", \"/path/in/container.txt\"), \"/tmp/my_local_file2.txt\")\n

Doesn't yet support sending or receiving iterators of Python bytes.

PARAMETER DESCRIPTION source

Local path or tuple. When using a tuple, the first element of the tuple is the container, the second element is the path in the container. ex: source=(\"my-container\", \"/usr/bin/something\").

TYPE: Union[ValidPath, ContainerPath]

destination

Local path or tuple. When using a tuple, the first element of the tuple is the container, the second element is the path in the container. ex: source=(\"my-container\", \"/usr/bin/something\").

TYPE: Union[ValidPath, ContainerPath]

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.create","title":"create","text":"
create(\n    image,\n    command=[],\n    *,\n    add_hosts=[],\n    blkio_weight=None,\n    blkio_weight_device=[],\n    cap_add=[],\n    cap_drop=[],\n    cgroup_parent=None,\n    cgroupns=None,\n    cidfile=None,\n    cpu_period=None,\n    cpu_quota=None,\n    cpu_rt_period=None,\n    cpu_rt_runtime=None,\n    cpu_shares=None,\n    cpus=None,\n    cpuset_cpus=None,\n    cpuset_mems=None,\n    detach=False,\n    devices=[],\n    device_cgroup_rules=[],\n    device_read_bps=[],\n    device_read_iops=[],\n    device_write_bps=[],\n    device_write_iops=[],\n    content_trust=False,\n    dns=[],\n    dns_options=[],\n    dns_search=[],\n    domainname=None,\n    entrypoint=None,\n    envs={},\n    env_files=[],\n    env_host=False,\n    expose=[],\n    gpus=None,\n    groups_add=[],\n    healthcheck=True,\n    health_cmd=None,\n    health_interval=None,\n    health_retries=None,\n    health_start_period=None,\n    health_timeout=None,\n    hostname=None,\n    init=False,\n    interactive=False,\n    ip=None,\n    ip6=None,\n    ipc=None,\n    isolation=None,\n    kernel_memory=None,\n    labels={},\n    label_files=[],\n    link=[],\n    link_local_ip=[],\n    log_driver=None,\n    log_options=[],\n    mac_address=None,\n    memory=None,\n    memory_reservation=None,\n    memory_swap=None,\n    memory_swappiness=None,\n    mounts=[],\n    name=None,\n    networks=[],\n    network_aliases=[],\n    oom_kill=True,\n    oom_score_adj=None,\n    pid=None,\n    pids_limit=None,\n    platform=None,\n    pod=None,\n    privileged=False,\n    publish=[],\n    publish_all=False,\n    pull=\"missing\",\n    read_only=False,\n    restart=None,\n    remove=False,\n    runtime=None,\n    security_options=[],\n    shm_size=None,\n    sig_proxy=True,\n    stop_signal=None,\n    stop_timeout=None,\n    storage_options=[],\n    sysctl={},\n    systemd=None,\n    tmpfs=[],\n    tty=False,\n    tz=None,\n    ulimit=[],\n    user=None,\n    userns=None,\n    uts=None,\n    volumes=[],\n    volume_driver=None,\n    volumes_from=[],\n    workdir=None\n)\n

Creates a container, but does not start it.

Alias: docker.create(...)

Start it then with the .start() method.

It might be useful if you want to delay the start of a container, to do some preparations beforehand. For example, it's common to do this workflow: docker create -> docker cp -> docker start to put files in the container before starting.

There is no detach argument since it's a runtime option.

The arguments are the same as docker.run.

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.diff","title":"diff","text":"
diff(container)\n

List all the files modified, added or deleted since the container started.

Alias: docker.diff(...)

PARAMETER DESCRIPTION container

The container to inspect

TYPE: ValidContainer

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.diff--returns","title":"Returns","text":"
`Dict[str, str]` Something like\n`{\"/some_path\": \"A\", \"/some_file\": \"M\", \"/tmp\": \"D\"}` for example.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.execute","title":"execute","text":"
execute(\n    container,\n    command,\n    detach=False,\n    envs={},\n    env_files=[],\n    interactive=False,\n    privileged=False,\n    tty=False,\n    user=None,\n    workdir=None,\n    stream=False,\n    detach_keys=None,\n    preserve_fds=None,\n)\n

Execute a command inside a container

Alias: docker.execute(...)

PARAMETER DESCRIPTION container

The container to execute the command in.

TYPE: ValidContainer

command

The command to execute.

TYPE: List[str]

detach

if True, returns immediately with None. If False, returns the command stdout as string.

TYPE: bool DEFAULT: False

envs

Set environment variables

TYPE: Dict[str, str] DEFAULT: {}

env_files

Read one or more files of environment variables

TYPE: Union[ValidPath, List[ValidPath]] DEFAULT: []

interactive

Leave stdin open during the duration of the process to allow communication with the parent process. Currently only works with tty=True for interactive use on the terminal.

TYPE: bool DEFAULT: False

preserve_fds

The number of additional file descriptors to pass through to the container. Only supported by podman.

TYPE: Optional[int] DEFAULT: None

privileged

Give extended privileges to the container.

TYPE: bool DEFAULT: False

tty

Allocate a pseudo-TTY. Allow the process to access your terminal to write on it.

TYPE: bool DEFAULT: False

user

Username or UID, format: \"<name|uid>[:<group|gid>]\"

TYPE: Optional[str] DEFAULT: None

workdir

Working directory inside the container

TYPE: Optional[ValidPath] DEFAULT: None

stream

Similar to docker.run(..., stream=True).

TYPE: bool DEFAULT: False

detach_keys

Override the key sequence for detaching a container.

TYPE: Optional[str] DEFAULT: None

RETURNS DESCRIPTION Union[None, str, Iterable[Tuple[str, bytes]]]

Optional[str]

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.execute--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.exists","title":"exists","text":"
exists(x)\n

Returns True if the container exists. False otherwise.

It's just calling docker.container.inspect(...) and verifies that it doesn't throw a python_on_whales.exceptions.NoSuchContainer.

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.exists--returns","title":"Returns","text":"
A `bool`\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.export","title":"export","text":"
export(container, output)\n

Export a container's filesystem as a tar archive

Alias: docker.export(...)

PARAMETER DESCRIPTION container

The container to export.

TYPE: ValidContainer

output

The path of the output tar archive. Returning a generator of bytes is not yet implemented.

TYPE: ValidPath

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.export--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns a container object from a name or ID.

PARAMETER DESCRIPTION x

A container name or ID, or a list of container names and/or IDs

TYPE: Union[ValidContainer, List[ValidContainer]]

RETURNS DESCRIPTION Union[Container, List[Container]]

A python_on_whales.Container object or a list of those

Union[Container, List[Container]]

if a list of IDs was passed as input.

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.inspect--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.kill","title":"kill","text":"
kill(containers, signal=None)\n

Kill one or more containers.

Alias: docker.kill(...)

PARAMETER DESCRIPTION containers

One or more containers to kill

TYPE: Union[ValidContainer, List[ValidContainer]]

signal

The signal to send the container

TYPE: Optional[Union[int, str]] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.kill--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if any of the\ncontainers do not exist.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.list","title":"list","text":"
list(all=False, filters={})\n

List the containers on the host.

Alias: docker.ps(...)

PARAMETER DESCRIPTION all

If True, also returns containers that are not running.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Container]`\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.logs","title":"logs","text":"
logs(\n    container,\n    *,\n    details=False,\n    since=None,\n    tail=None,\n    timestamps=False,\n    until=None,\n    follow=False,\n    stream=False\n)\n

Returns the logs of a container as a string or an iterator.

Alias: docker.logs(...)

PARAMETER DESCRIPTION container

The container to get the logs of

TYPE: ValidContainer

details

Show extra details provided to logs

TYPE: bool DEFAULT: False

since

Use a datetime or timedelta to specify the lower date limit for the logs.

TYPE: Union[None, datetime, timedelta] DEFAULT: None

tail

Number of lines to show from the end of the logs (default all)

TYPE: Optional[int] DEFAULT: None

timestamps

Put timestamps next to lines.

TYPE: bool DEFAULT: False

until

Use a datetime or a timedelta to specify the upper date limit for the logs.

TYPE: Union[None, datetime, timedelta] DEFAULT: None

follow

If False (the default), the logs returned are the logs up to the time of the function call. If True, the logs of the container up to the time the container stopped are displayed. Which means that if the container isn't stopped yet, the function will continue until the container is stopped. Which is why it is advised to use the stream option if you use the follow option. Without stream, only a str will be returned, possibly much later in the future. With stream, you'll be able to read the logs in real time.

TYPE: bool DEFAULT: False

stream

Similar to the stream argument of docker.run. This function will then return an iterator that will yield a tuple (source, content) with source being \"stderr\" or \"stdout\". content is the content of the line as bytes. Take a look at the user guide to have an example of the output.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.logs--returns","title":"Returns","text":"
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`\nif `stream=True`.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.logs--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exist.\n

If you are a bit confused about follow and stream, here are some use cases.

  • If you want to have the logs up to this point as a str, don't use those args.
  • If you want to stream the output in real time, use follow=True, stream=True
  • If you want the logs up to this point, but you don't want to fit all the logs in memory because they are too big, use stream=True.
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.pause","title":"pause","text":"
pause(containers)\n

Pauses one or more containers

Alias: docker.pause(...)

PARAMETER DESCRIPTION containers

One or more containers to pause

TYPE: Union[ValidContainer, List[ValidContainer]]

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.pause--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.prune","title":"prune","text":"
prune(filters={}, stream_logs=False)\n

Remove containers that are not running.

PARAMETER DESCRIPTION filters

Filters as strings or list of strings

TYPE: Dict[str, str] DEFAULT: {}

stream_logs

If True this function will return an iterator of strings. You can then read the logs as they arrive. If False (the default value), then the function returns None, but when it returns, then the prune operation has already been done.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.remove","title":"remove","text":"
remove(containers, *, force=False, volumes=False)\n

Removes a container

Alias: docker.remove(...)

PARAMETER DESCRIPTION containers

One or more containers.

TYPE: Union[ValidContainer, List[ValidContainer]]

force

Force the removal of a running container (uses SIGKILL)

TYPE: bool DEFAULT: False

volumes

Remove anonymous volumes associated with the container

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.remove--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.rename","title":"rename","text":"
rename(container, new_name)\n

Changes the name of a container.

Alias: docker.rename(...)

PARAMETER DESCRIPTION container

The container to rename

TYPE: ValidContainer

new_name

The new name of the container.

TYPE: str

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.rename--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exist.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.restart","title":"restart","text":"
restart(containers, time=None)\n

Restarts one or more container.

Alias: docker.restart(...)

PARAMETER DESCRIPTION containers

One or more containers to restart

TYPE: Union[ValidContainer, List[ValidContainer]]

time

Amount of to wait for stop before killing the container (default 10s). If int, the unit is seconds.

TYPE: Optional[Union[int, timedelta]] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.restart--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.run","title":"run","text":"
run(\n    image,\n    command=[],\n    *,\n    add_hosts=[],\n    blkio_weight=None,\n    blkio_weight_device=[],\n    cap_add=[],\n    cap_drop=[],\n    cgroup_parent=None,\n    cgroupns=None,\n    cidfile=None,\n    cpu_period=None,\n    cpu_quota=None,\n    cpu_rt_period=None,\n    cpu_rt_runtime=None,\n    cpu_shares=None,\n    cpus=None,\n    cpuset_cpus=None,\n    cpuset_mems=None,\n    detach=False,\n    devices=[],\n    device_cgroup_rules=[],\n    device_read_bps=[],\n    device_read_iops=[],\n    device_write_bps=[],\n    device_write_iops=[],\n    content_trust=False,\n    dns=[],\n    dns_options=[],\n    dns_search=[],\n    domainname=None,\n    entrypoint=None,\n    envs={},\n    env_files=[],\n    env_host=False,\n    expose=[],\n    gpus=None,\n    groups_add=[],\n    healthcheck=True,\n    health_cmd=None,\n    health_interval=None,\n    health_retries=None,\n    health_start_period=None,\n    health_timeout=None,\n    hostname=None,\n    init=False,\n    interactive=False,\n    ip=None,\n    ip6=None,\n    ipc=None,\n    isolation=None,\n    kernel_memory=None,\n    labels={},\n    label_files=[],\n    link=[],\n    link_local_ip=[],\n    log_driver=None,\n    log_options=[],\n    mac_address=None,\n    memory=None,\n    memory_reservation=None,\n    memory_swap=None,\n    memory_swappiness=None,\n    mounts=[],\n    name=None,\n    networks=[],\n    network_aliases=[],\n    oom_kill=True,\n    oom_score_adj=None,\n    pid=None,\n    pids_limit=None,\n    platform=None,\n    pod=None,\n    preserve_fds=None,\n    privileged=False,\n    publish=[],\n    publish_all=False,\n    pull=\"missing\",\n    read_only=False,\n    restart=None,\n    remove=False,\n    runtime=None,\n    security_options=[],\n    shm_size=None,\n    sig_proxy=True,\n    stop_signal=None,\n    stop_timeout=None,\n    storage_options=[],\n    stream=False,\n    sysctl={},\n    systemd=None,\n    tmpfs=[],\n    tty=False,\n    tz=None,\n    ulimit=[],\n    user=None,\n    userns=None,\n    uts=None,\n    volumes=[],\n    volume_driver=None,\n    volumes_from=[],\n    workdir=None\n)\n

Runs a container

You can use docker.run or docker.container.run to call this function.

For a deeper dive into the arguments and what they do, visit https://docs.docker.com/engine/reference/run/

If you want to know exactly how to call docker.run() depending on your use case (detach, stream...), take a look at the docker.run() guide.

>>> from python_on_whales import docker\n>>> returned_string = docker.run(\"hello-world\")\n>>> print(returned_string)\n\nHello from Docker!\nThis message shows that your installation appears to be working correctly.\n\nTo generate this message, Docker took the following steps:\n 1. The Docker client contacted the Docker daemon.\n 2. The Docker daemon pulled the \"hello-world\" image from the Docker Hub.\n    (amd64)\n 3. The Docker daemon created a new container from that image which runs the\n    executable that produces the output you are currently reading.\n 4. The Docker daemon streamed that output to the Docker client, which sent it\n    to your terminal.\n\nTo try something more ambitious, you can run an Ubuntu container with:\n $ docker run -it ubuntu bash\n\nShare images, automate workflows, and more with a free Docker ID:\n https://hub.docker.com/\n\nFor more examples and ideas, visit:\n https://docs.docker.com/get-started/\n
>>> from python_on_whales import docker\n>>> result_string = docker.run(\"ubuntu\", [\"ls\", \"/host\"], volumes=[(\"/\", \"/host\", \"ro\")])\n>>> print(result_string)\nbin\nboot\ndev\netc\nhome\ninit\nlib\nlib64\nlost+found\nmedia\nmnt\nopt\nproc\nprojects\nroot\nrun\nsbin\nsnap\nsrv\nsys\ntmp\nusr\nvar\n
PARAMETER DESCRIPTION image

The docker image to use for the container

TYPE: ValidImage

command

List of arguments to provide to the container.

TYPE: List[str] DEFAULT: []

add_hosts

hosts to add in the format of a tuple. For example, add_hosts=[(\"my_host_1\", \"192.168.30.31\"), (\"host2\", \"192.168.80.81\")]

TYPE: List[Tuple[str, str]] DEFAULT: []

blkio_weight

Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)

TYPE: Optional[int] DEFAULT: None

cgroupns

Cgroup namespace mode to use, one of 'host' or 'private'.

TYPE: Optional[str] DEFAULT: None

cpu_period

Limit CPU CFS (Completely Fair Scheduler) period

TYPE: Optional[int] DEFAULT: None

cpu_quota

Limit CPU CFS (Completely Fair Scheduler) quota

TYPE: Optional[int] DEFAULT: None

cpu_rt_period

Limit CPU real-time period in microseconds

TYPE: Optional[int] DEFAULT: None

cpu_rt_runtime

Limit CPU real-time runtime in microseconds

TYPE: Optional[int] DEFAULT: None

cpu_shares

CPU shares (relative weight)

TYPE: Optional[int] DEFAULT: None

cpus

The maximal amount of cpu the container can use. 1 means one cpu core.

TYPE: Optional[float] DEFAULT: None

cpuset_cpus

CPUs in which to allow execution. Must be given as a list.

TYPE: Optional[List[int]] DEFAULT: None

cpuset_mems

MEMs in which to allow execution. Must be given as a list.

TYPE: Optional[List[int]] DEFAULT: None

detach

If False, returns the ouput of the container as a string. If True, returns a python_on_whales.Container object.

TYPE: bool DEFAULT: False

dns_search

Set custom DNS search domains

TYPE: List[str] DEFAULT: []

domainname

Container NIS domain name

TYPE: Optional[str] DEFAULT: None

entrypoint

Overwrite the default ENTRYPOINT of the image

TYPE: Optional[str] DEFAULT: None

envs

Environment variables as a dict. For example: {\"OMP_NUM_THREADS\": 3}

TYPE: Dict[str, str] DEFAULT: {}

env_files

One or a list of env files.

TYPE: Union[ValidPath, List[ValidPath]] DEFAULT: []

env_host

Use host environment inside the container. Only supported with podman.

TYPE: bool DEFAULT: False

gpus

For this to work, you need the Nvidia container runtime The value needed is a str or int. Some examples of valid argument are \"all\" or \"device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a\" or \"device=0,2\". If you want 3 gpus, just write gpus=3.

TYPE: Union[int, str, None] DEFAULT: None

hostname

Container host name

TYPE: Optional[str] DEFAULT: None

interactive

Leave stdin open during the duration of the process to allow communication with the parent process. Currently only works with tty=True for interactive use on the terminal.

TYPE: bool DEFAULT: False

ip

IPv4 address (e.g., 172.30.100.104)

TYPE: Optional[str] DEFAULT: None

ip6

IPv6 address (e.g., 2001:db8::33)

TYPE: Optional[str] DEFAULT: None

ipc

IPC mode to use

TYPE: Optional[str] DEFAULT: None

isolation

Container isolation technology

TYPE: Optional[str] DEFAULT: None

kernel_memory

Kernel memory limit. int represents the number of bytes, but you can use \"4k\" or 2g for example.

TYPE: Union[int, str, None] DEFAULT: None

labels

Set meta data on a container. The labels can be used later when filtering containers with docker.ps(filters='...'). The labels can also be found on each container with the attribute my_container.config.labels.

TYPE: Dict[str, str] DEFAULT: {}

log_driver

Logging driver for the container

TYPE: Optional[str] DEFAULT: None

mac_address

Container MAC address (e.g., \"92:d0:c6:0a:29:33\")

TYPE: Optional[str] DEFAULT: None

memory

Memory limit, valid values are 1024 (ints are bytes) or \"43m\" or \"6g\".

TYPE: Union[int, str, None] DEFAULT: None

memory_reservation

Memory soft limit

TYPE: Union[int, str, None] DEFAULT: None

memory_swap

Swap limit equal to memory plus swap: '-1' to enable unlimited swap.

TYPE: Union[int, str, None] DEFAULT: None

memory_swappiness

Tune container memory swappiness (0 to 100) (default -1)

TYPE: Optional[int] DEFAULT: None

name

The container name. If not provided, one is automatically genrated for you.

TYPE: Optional[str] DEFAULT: None

healthcheck

Set to False to disable container periodic healthcheck.

TYPE: bool DEFAULT: True

oom_kill

Set to False to disable the OOM killer for this container.

TYPE: bool DEFAULT: True

pid

PID namespace to use

TYPE: Optional[str] DEFAULT: None

pids_limit

Tune container pids limit (set -1 for unlimited)

TYPE: Optional[int] DEFAULT: None

platform

Set platform if server is multi-platform capable.

TYPE: Optional[str] DEFAULT: None

pod

Create the container in an existing pod (only supported with podman).

TYPE: Optional[ValidPod] DEFAULT: None

preserve_fds

The number of additional file descriptors to pass through to the container. Only supported by podman.

TYPE: Optional[int] DEFAULT: None

privileged

Give extended privileges to this container.

TYPE: bool DEFAULT: False

publish

Ports to publish, same as the -p argument in the Docker CLI. example are [(8000, 7000) , (\"127.0.0.1:3000\", 2000)] or [(\"127.0.0.1:3000\", 2000, \"udp\")]. You can also use a single entry in the tuple to signify that you want a random free port on the host. For example: publish=[(80,)].

TYPE: List[ValidPortMapping] DEFAULT: []

publish_all

Publish all exposed ports to random ports.

TYPE: bool DEFAULT: False

pull

Pull image before running (\"always\"|\"missing\"|\"never\") (default \"missing\").

TYPE: str DEFAULT: 'missing'

read_only

Mount the container's root filesystem as read only.

TYPE: bool DEFAULT: False

restart

Restart policy to apply when a container exits (default \"no\")

TYPE: Optional[str] DEFAULT: None

remove

Automatically remove the container when it exits.

TYPE: bool DEFAULT: False

runtime

Runtime to use for this container.

TYPE: Optional[str] DEFAULT: None

security_options

Security options

TYPE: List[str] DEFAULT: []

shm_size

Size of /dev/shm. int is for bytes. But you can use \"512m\" or \"4g\" for example.

TYPE: Union[int, str, None] DEFAULT: None

stop_timeout

Signal to stop a container (default \"SIGTERM\")

TYPE: Optional[int] DEFAULT: None

storage_options

Storage driver options for the container

TYPE: List[str] DEFAULT: []

systemd

Whether to run in systemd mode. Only known to apply to Podman, see https://docs.podman.io/en/latest/markdown/podman-run.1.html#systemd-true-false-always

TYPE: Optional[Union[bool, Literal['always']]] DEFAULT: None

tty

Allocate a pseudo-TTY. Allow the process to access your terminal to write on it.

TYPE: bool DEFAULT: False

tz

Set timezone in container, or local to match the host's timezone. See /usr/share/zoneinfo/ for valid timezones. Note: This option is only known to apply to Podman containers.

TYPE: Optional[str] DEFAULT: None

user

Username or UID (format: <name|uid>[:<group|gid>])

TYPE: Optional[str] DEFAULT: None

userns

User namespace to use

TYPE: Optional[str] DEFAULT: None

uts

UTS namespace to use

TYPE: Optional[str] DEFAULT: None

volumes

Bind mount a volume. Some examples: [(\"/\", \"/host\"), (\"/etc/hosts\", \"/etc/hosts\", \"rw\")].

TYPE: Optional[List[VolumeDefinition]] DEFAULT: []

volume_driver

Optional volume driver for the container

TYPE: Optional[str] DEFAULT: None

workdir

The directory in the container where the process will be executed.

TYPE: Optional[ValidPath] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.run--returns","title":"Returns","text":"
The container output as a string if detach is `False` (the default),\nand a `python_on_whales.Container` if detach is `True`.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.start","title":"start","text":"
start(\n    containers,\n    attach=False,\n    interactive=False,\n    stream=False,\n    detach_keys=None,\n)\n

Starts one or more created/stopped containers.

Aliases: docker.start, docker.container.start, python_on_whales.Container.start.

PARAMETER DESCRIPTION containers

One or a list of containers.

TYPE: Union[ValidContainer, List[ValidContainer]]

attach

Attach stdout/stderr and forward signals.

TYPE: bool DEFAULT: False

interactive

Attach stdin (ensure it is open).

TYPE: bool DEFAULT: False

stream

Stream output as a generator.

TYPE: bool DEFAULT: False

detach_keys

Override the key sequence for detaching a container.

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.stats","title":"stats","text":"
stats(containers=None, all=False)\n

Get containers resource usage statistics

Alias: docker.stats(...)

Usage:

from python_on_whales import docker\n\ndocker.run(\"redis\", detach=True)\nprint(docker.stats())\n# [<<class 'python_on_whales.components.container.ContainerStats'> object,\n# attributes are block_read=0, block_write=0, cpu_percentage=0.08,\n# container=e90ae41a5b17,\n# container_id=e90ae41a5b17df998584141692f1e361c485e8d00c37ee21fdc360d3523dd1c1,\n# memory_percentage=0.18, memory_used=11198791, memory_limit=6233071288,\n# container_name=crazy_northcutt, net_upload=696, net_download=0>]\n

The data unit is the byte.

PARAMETER DESCRIPTION all

Get the stats of all containers, not just running ones.

TYPE: bool DEFAULT: False

containers

One or a list of containers.

TYPE: Optional[Union[ValidContainer, List[ValidContainer]]] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.stats--returns","title":"Returns","text":"
A `List[python_on_whales.ContainerStats]`.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.stop","title":"stop","text":"
stop(containers, time=None)\n

Stops one or more running containers

Alias: docker.stop(...)

Aliases: docker.stop, docker.container.stop, python_on_whales.Container.stop.

PARAMETER DESCRIPTION containers

One or a list of containers.

TYPE: Union[ValidContainer, List[ValidContainer]]

time

Seconds to wait for stop before killing a container (default 10)

TYPE: Optional[Union[int, timedelta]] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.stop--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if any of the\ncontainers do not exist.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.top","title":"top","text":"
top()\n

Get the running processes of a container

Alias: docker.top(...)

Not yet implemented

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.unpause","title":"unpause","text":"
unpause(x)\n

Unpause all processes within one or more containers

Alias: docker.unpause(...)

PARAMETER DESCRIPTION x

One or more containers (name, id or python_on_whales.Container object).

TYPE: Union[ValidContainer, List[ValidContainer]]

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.unpause--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if any of the\ncontainers do not exist.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.update","title":"update","text":"
update(\n    x,\n    /,\n    *,\n    blkio_weight=None,\n    cpu_period=None,\n    cpu_quota=None,\n    cpu_rt_period=None,\n    cpu_rt_runtime=None,\n    cpu_shares=None,\n    cpus=None,\n    cpuset_cpus=None,\n    cpuset_mems=None,\n    kernel_memory=None,\n    memory=None,\n    memory_reservation=None,\n    memory_swap=None,\n    pids_limit=None,\n    restart=None,\n)\n

Update configuration of one or more containers

Alias: docker.update(...)

PARAMETER DESCRIPTION x

One or a list of containers to update.

TYPE: Union[ValidContainer, List[ValidContainer]]

blkio_weight

Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)

TYPE: Optional[int] DEFAULT: None

cpu_period

Limit CPU CFS (Completely Fair Scheduler) period

TYPE: Optional[int] DEFAULT: None

cpu_quota

Limit CPU CFS (Completely Fair Scheduler) quota

TYPE: Optional[int] DEFAULT: None

cpu_rt_period

Limit CPU real-time period in microseconds

TYPE: Optional[int] DEFAULT: None

cpu_rt_runtime

Limit CPU real-time runtime in microseconds

TYPE: Optional[int] DEFAULT: None

cpu_shares

CPU shares (relative weight)

TYPE: Optional[int] DEFAULT: None

cpus

The maximal amount of cpu the container can use. 1 means one cpu core.

TYPE: Optional[float] DEFAULT: None

cpuset_cpus

CPUs in which to allow execution. Must be given as a list.

TYPE: Optional[List[int]] DEFAULT: None

cpuset_mems

MEMs in which to allow execution. Must be given as a list.

TYPE: Optional[List[int]] DEFAULT: None

memory

Memory limit, valid values are 1024 (ints are bytes) or \"43m\" or \"6g\".

TYPE: Union[int, str, None] DEFAULT: None

memory_reservation

Memory soft limit

TYPE: Union[int, str, None] DEFAULT: None

memory_swap

Swap limit equal to memory plus swap: '-1' to enable unlimited swap.

TYPE: Union[int, str, None] DEFAULT: None

pids_limit

Tune container pids limit (set -1 for unlimited)

TYPE: Optional[int] DEFAULT: None

restart

Restart policy to apply when a container exits (default \"no\")

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.update--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.wait","title":"wait","text":"
wait(x)\n

Block until one or more containers stop, then returns their exit codes

Alias: docker.wait(...)

PARAMETER DESCRIPTION x

One or a list of containers to wait for.

TYPE: Union[ValidContainer, List[ValidContainer]]

"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.wait--returns","title":"Returns","text":"
An `int` if a single container was passed as argument or a list of ints\nif multiple containers were passed as arguments.\n

Some Examples:

cont = docker.run(\"ubuntu\", [\"bash\", \"-c\", \"sleep 2 && exit 8\"], detach=True)\n\nexit_code = docker.wait(cont)\n\nprint(exit_code)\n# 8\ndocker.container.remove(cont)\n
cont_1 = docker.run(\"ubuntu\", [\"bash\", \"-c\", \"sleep 4 && exit 8\"], detach=True)\ncont_2 = docker.run(\"ubuntu\", [\"bash\", \"-c\", \"sleep 2 && exit 10\"], detach=True)\n\nexit_codes = docker.wait([cont_1, cont_2])\n\nprint(exit_codes)\n# [8, 10]\ndocker.container.remove([cont_1, cont_2])\n
"},{"location":"sub-commands/container/#python_on_whales.components.container.cli_wrapper.ContainerCLI.wait--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.\n
"},{"location":"sub-commands/context/","title":"docker context","text":""},{"location":"sub-commands/context/#how-to-use-docker-contexts","title":"How to use Docker contexts","text":"

Docker contexts allow you to connect to docker daemons other than the local one. This is similar to the -H argument of the Docker command.

Contexts commands allow you to declare, save, list local and remote Docker daemons and Kubernetes endpoints that you have.

An exemple here with python-on-whales:

from python_on_whales import docker, DockerContextConfig\n\nnew_context = docker.context.create(\n    \"my_remote_ssh_server\",\n    docker=DockerContextConfig(host=\"ssh://ubuntu@52.57.163.75\"),\n    description=\"my server ssh with a lot more power\"\n)\nprint(docker.context.list())\n# [python_on_whales.Context(name='default', endpoints={'docker': ContextEndpoint(host='unix:///var/run/docker.sock', skip_tls_verify=False)}),\n# python_on_whales.Context(name='my_remote_ssh_server', endpoints={'docker': ContextEndpoint(host='ssh://ubuntu@52.57.163.75', skip_tls_verify=False)})]\nnew_context.use()\n# it's the same to use docker.context.use(\"my_remote_ssh_server\") or docker.context.use(new_context)\n\nprint(docker.ps()) # will list the containers in the remote server\n# [python_on_whales.Container(id=...), python_on_whales.Container(id=...)]\n# return to the local docker daemon\ndocker.context.use(\"default\")\nprint(docker.ps()) # will list the containers running locally\n# [python_on_whales.Container(id=...)]\n

Note that for this simple use case, it's equivalent to use the -H option of the Docker client like so:

from python_on_whales import DockerClient\n\ndocker = DockerClient(host=\"ssh://ubuntu@52.57.163.75\")\n\nprint(docker.ps())\n
"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI","title":"ContextCLI","text":""},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.create","title":"create","text":"
create(\n    context_name,\n    default_stack_orchestrator=None,\n    description=None,\n    from_=None,\n    docker=None,\n    kubernetes=None,\n)\n

Creates a new context

PARAMETER DESCRIPTION context_name

name of the context to create

TYPE: str

default_stack_orchestrator

Default orchestrator for stack operations to use with this context (swarm|kubernetes|all)

TYPE: Optional[str] DEFAULT: None

description

Description of the context

TYPE: Optional[str] DEFAULT: None

docker

Set the docker endpoint, you can use a dict of a class to specify the options. The class is python_on_whales.DockerContextConfig.

TYPE: Union[Dict[str, Any], DockerContextConfig, None] DEFAULT: None

from_

Create context from a named context

TYPE: Optional[ValidContext] DEFAULT: None

kubernetes

Set the kubernetes endpoint. You can use a dict or a class to specify the options. The class is python_on_whales.KubernetesContextConfig.

TYPE: Union[Dict[str, Any], KubernetesContextConfig, None] DEFAULT: None

"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.inspect","title":"inspect","text":"
inspect(x=None)\n

Returns the context object. If no argument is provided, returns the current context.

"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.list","title":"list","text":"
list()\n

List all Docker contexts available

"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.list--returns","title":"Returns","text":"
`List[python_on_whales.Context]`\n
"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.remove","title":"remove","text":"
remove(x, force=False)\n

Removes one or more contexts

PARAMETER DESCRIPTION x

One or more contexts, empty list means no-op.

TYPE: Union[ValidContext, List[ValidContext]]

force

Force the removal of this context

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.update","title":"update","text":"
update()\n

Not yet implemented

"},{"location":"sub-commands/context/#python_on_whales.components.context.cli_wrapper.ContextCLI.use","title":"use","text":"
use(context)\n

Set the default context

PARAMETER DESCRIPTION context

The context to set as default

TYPE: ValidContext

"},{"location":"sub-commands/image/","title":"docker image","text":""},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI","title":"ImageCLI","text":""},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.exists","title":"exists","text":"
exists(x)\n

Returns True if the image exists. False otherwise.

It's just calling docker.image.inspect(...) and verifies that it doesn't throw a python_on_whales.exceptions.NoSuchImage.

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.exists--returns","title":"Returns","text":"
A `bool`\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.history","title":"history","text":"
history()\n

Not yet implemented

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.import_","title":"import_","text":"
import_(\n    source,\n    tag=None,\n    changes=(),\n    message=None,\n    platform=None,\n)\n

Import the contents from a tarball to create a filesystem image

Alias: docker.import_(...)

PARAMETER DESCRIPTION changes

Apply Dockerfile instruction to the created image

TYPE: Iterable[str] DEFAULT: ()

message

Set commit message for imported image

TYPE: Optional[str] DEFAULT: None

platform

Set platform if server is multi-platform capable

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.inspect","title":"inspect","text":"
inspect(x)\n

Creates a python_on_whales.Image object.

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.inspect--returns","title":"Returns","text":"
`python_on_whales.Image`, or `List[python_on_whales.Image]` if the input\nwas a list of strings.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.inspect--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exists.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.legacy_build","title":"legacy_build","text":"
legacy_build(\n    context_path,\n    add_hosts={},\n    build_args={},\n    cache=True,\n    file=None,\n    labels={},\n    network=None,\n    pull=False,\n    tags=(),\n    target=None,\n)\n

Build a Docker image with the old Docker builder (meaning not using buildx/buildkit)

As the name implies this is a legacy building method. Users are strongly encouraged to use docker.build() instead. The legacy builder will not be available in docker v22.06 and above.

This function also won't run the legacy builder if the environment variable DOCKER_BUILDKIT is set to 1 or if you had run previously docker buildx install from bash or docker.buildx.install() from Python.

Some resources on why moving to buildx/buildkit is necessary:

  • Proposal: make BuildKit the default builder on Linux
  • Deprecated Engine Features: Legacy builder for Linux images

A python_on_whales.Image is returned, even when using multiple tags. That is because it will produce a single image with multiple tags.

PARAMETER DESCRIPTION context_path

The path of the build context. Defaults to the current working directory

TYPE: ValidPath

add_hosts

Hosts to add. add_hosts={\"my_host1\": \"192.168.32.35\"}

TYPE: Mapping[str, str] DEFAULT: {}

build_args

The build arguments. ex build_args={\"PY_VERSION\": \"3.7.8\", \"UBUNTU_VERSION\": \"20.04\"}.

TYPE: Mapping[str, str] DEFAULT: {}

cache

Whether or not to use the cache, defaults to True

TYPE: bool DEFAULT: True

file

The path of the Dockerfile, defaults to context_path/Dockerfile

TYPE: Optional[ValidPath] DEFAULT: None

labels

Mapping of labels to add to the image. labels={\"very-secure\": \"1\", \"needs-gpu\": \"0\"} for example.

TYPE: Mapping[str, str] DEFAULT: {}

network

which network to use when building the Docker image

TYPE: Optional[str] DEFAULT: None

pull

Always attempt to pull a newer version of the image

TYPE: bool DEFAULT: False

tags

Tag or tags to put on the resulting image.

TYPE: Union[str, Iterable[str]] DEFAULT: ()

target

Set the target build stage to build.

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.legacy_build--returns","title":"Returns","text":"
A `python_on_whales.Image`\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.list","title":"list","text":"
list(repository_or_tag=None, filters={}, all=False)\n

Returns the list of Docker images present on the machine.

Alias: docker.images()

Note that each image may have multiple tags.

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Image]` object.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.load","title":"load","text":"
load(input, quiet=False)\n

Loads one or multiple Docker image(s) from a tar or an iterator of bytes.

Alias: docker.load(...)

PARAMETER DESCRIPTION input

Path or input stream to load the images from.

TYPE: Union[ValidPath, bytes, Iterator[bytes]]

quiet

If you don't want to display the progress bars.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.load--returns","title":"Returns","text":"
`None` when using bytes as input. A `List[str]` (list of tags)\n when a path is provided.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.prune","title":"prune","text":"
prune(all=False, filter={})\n

Remove unused images

PARAMETER DESCRIPTION all

Remove all unused images, not just dangling ones

TYPE: bool DEFAULT: False

filter

Provide filter values (e.g. {\"until\": \"<timestamp>\"})

TYPE: Mapping[str, str] DEFAULT: {}

RETURNS DESCRIPTION str

The output of the CLI (the layers removed).

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.pull","title":"pull","text":"
pull(x, quiet=False, platform=None)\n

Pull one or more docker image(s)

Alias: docker.pull(...)

PARAMETER DESCRIPTION x

The image name(s) . Can be a string or a list of strings. In case of list, multithreading is used to pull the images. The progress bars might look strange as multiple processes are drawing on the terminal at the same time.

TYPE: Union[str, Iterable[str]]

quiet

If you don't want to see the progress bars.

TYPE: bool DEFAULT: False

platform

If you want to enforce a platform.

TYPE: Optional[str] DEFAULT: None

RETURNS DESCRIPTION Union[Image, List[Image]]

The Docker image loaded (python_on_whales.Image object).

Union[Image, List[Image]]

If a list was passed as input, then a List[python_on_whales.Image] will

Union[Image, List[Image]]

be returned.

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.push","title":"push","text":"
push(x, quiet=False)\n

Push a tag or a repository to a registry

Alias: docker.push(...)

PARAMETER DESCRIPTION x

Tag(s) or repo(s) to push. Can be a string or an iterable of strings. If it's an iterable, python-on-whales will push all the images with multiple threads. The progress bars might look strange as multiple processes are drawing on the terminal at the same time.

TYPE: Union[str, Iterable[str]]

quiet

If you don't want to see the progress bars.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.push--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exist.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.remove","title":"remove","text":"
remove(x, force=False, prune=True)\n

Remove one or more docker images.

PARAMETER DESCRIPTION x

Single image or iterable of Docker images to remove. You can use tags or python_on_whales.Image objects.

TYPE: Union[ValidImage, Iterable[ValidImage]]

force

Force removal of the image(s).

TYPE: bool DEFAULT: False

prune

Delete untagged parents.

TYPE: bool DEFAULT: True

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.remove--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exist.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.save","title":"save","text":"
save(images, output=None)\n

Save one or more images to a tar archive. Returns a stream if output is None

Alias: docker.save(...)

PARAMETER DESCRIPTION images

Single image or non-empty iterable of images to save.

TYPE: Union[ValidImage, Iterable[ValidImage]]

output

Path of the tar archive to produce. If output is None, a generator of bytes is produced. It can be used to stream those bytes elsewhere, to another Docker daemon for example.

TYPE: Optional[ValidPath] DEFAULT: None

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.save--returns","title":"Returns","text":"
`Optional[Iterator[bytes]]`. If output is a path, nothing is returned.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.save--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exist.\n
"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.save--example","title":"Example","text":"

An example of transfer of an image from a local Docker daemon to a remote Docker daemon. We assume that the remote machine has an ssh access:

from python_on_whales import DockerClient\n\nlocal_docker = DockerClient()\nremote_docker = DockerClient(host=\"ssh://my_user@186.167.32.84\")\n\nimage_name = \"busybox:1\"\nlocal_docker.pull(image_name)\nbytes_iterator = local_docker.image.save(image_name)\n\nremote_docker.image.load(bytes_iterator)\n

Of course the best solution is to use a registry to transfer images, but it's a cool example nonetheless.

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.tag","title":"tag","text":"
tag(source_image, new_tag)\n

Adds a tag to a Docker image.

Alias: docker.tag(...)

PARAMETER DESCRIPTION source_image

The Docker image to tag. You can use a tag to reference it.

TYPE: Union[Image, str]

new_tag

The tag to add to the Docker image.

TYPE: str

"},{"location":"sub-commands/image/#python_on_whales.components.image.cli_wrapper.ImageCLI.tag--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchImage` if the image does not exist.\n
"},{"location":"sub-commands/manifest/","title":"docker manifest","text":""},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI","title":"ManifestCLI","text":""},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.annotate","title":"annotate","text":"
annotate(\n    name,\n    manifest,\n    arch=None,\n    os=None,\n    os_features=None,\n    os_version=None,\n    variant=None,\n)\n

Annotates a Docker manifest list.

PARAMETER DESCRIPTION name

The name of the manifest list

TYPE: str

manifest

The individual manifest to annotate

TYPE: str

arch

The manifest's architecture

TYPE: Optional[str] DEFAULT: None

os

The manifest's operating system

TYPE: Optional[str] DEFAULT: None

os_features

The manifest's operating system features

TYPE: Optional[List[str]] DEFAULT: None

os_version

The manifest's operating system version

TYPE: Optional[str] DEFAULT: None

variant

The manifest's architecture variant

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.create","title":"create","text":"
create(name, manifests, ammend=False, insecure=False)\n

Creates a Docker manifest list.

PARAMETER DESCRIPTION name

The name of the manifest list

TYPE: str

manifests

The list of manifests to add to the manifest list

TYPE: List[str]

"},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.create--returns","title":"Returns","text":"
A `python_on_whales.ManifestList`.\n
"},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns a Docker manifest list object.

"},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.push","title":"push","text":"
push(x, purge=False, quiet=False)\n

Push a manifest list to a repository.

"},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.push--options","title":"Options","text":"
purge: Remove the local manifest list after push\n
"},{"location":"sub-commands/manifest/#python_on_whales.components.manifest.cli_wrapper.ManifestCLI.remove","title":"remove","text":"
remove(manifest_lists)\n

Removes a Docker manifest list or lists.

PARAMETER DESCRIPTION manifest_lists

One or more manifest lists.

TYPE: Union[ValidManifestList, List[ValidManifestList]]

"},{"location":"sub-commands/network/","title":"docker network","text":""},{"location":"sub-commands/network/#python_on_whales.components.network.cli_wrapper.NetworkCLI","title":"NetworkCLI","text":""},{"location":"sub-commands/network/#python_on_whales.components.network.cli_wrapper.NetworkCLI.connect","title":"connect","text":"
connect(\n    network,\n    container,\n    alias=None,\n    driver_options=[],\n    ip=None,\n    ip6=None,\n    links=[],\n)\n

Connect a container to a network

PARAMETER DESCRIPTION network

The network to connect to

TYPE: ValidNetwork

container

The container to connect

TYPE: ValidContainer

alias

Add network-scoped alias for the container

TYPE: Optional[str] DEFAULT: None

driver_options

Driver options for the network

TYPE: List[str] DEFAULT: []

ip

IPv4 address (e.g., \"172.30.100.104\")

TYPE: Optional[str] DEFAULT: None

ip6

IPv6 address (e.g., \"2001:db8::33\")

TYPE: Optional[str] DEFAULT: None

links

Add links to other containers

TYPE: List[ValidContainer] DEFAULT: []

"},{"location":"sub-commands/network/#python_on_whales.components.network.cli_wrapper.NetworkCLI.create","title":"create","text":"
create(\n    name,\n    attachable=False,\n    driver=None,\n    gateway=None,\n    subnet=None,\n    labels={},\n    options=[],\n)\n

Creates a Docker network.

PARAMETER DESCRIPTION name

The name of the network

TYPE: str

"},{"location":"sub-commands/network/#python_on_whales.components.network.cli_wrapper.NetworkCLI.create--returns","title":"Returns","text":"
A `python_on_whales.Network`.\n
"},{"location":"sub-commands/network/#python_on_whales.components.network.cli_wrapper.NetworkCLI.disconnect","title":"disconnect","text":"
disconnect(network, container, force=False)\n

Disconnect a container from a network

PARAMETER DESCRIPTION network

The name of the network.

TYPE: ValidNetwork

container

The container to disconnect.

TYPE: ValidContainer

"},{"location":"sub-commands/network/#python_on_whales.components.network.cli_wrapper.NetworkCLI.remove","title":"remove","text":"
remove(networks)\n

Removes a Docker network

PARAMETER DESCRIPTION networks

One or more networks.

TYPE: Union[ValidNetwork, List[ValidNetwork]]

"},{"location":"sub-commands/node/","title":"docker node","text":""},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI","title":"NodeCLI","text":""},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.demote","title":"demote","text":"
demote(x)\n

Demote one or more nodes from manager in the swarm

PARAMETER DESCRIPTION x

One or a list of nodes.

TYPE: Union[ValidNode, List[ValidNode]]

"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns a python_on_whales.Node object from a string (id or hostname of the node)

PARAMETER DESCRIPTION x

One id or hostname or a list of ids or hostnames

TYPE: Union[str, List[str]]

"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.inspect--returns","title":"Returns","text":"
One or a list of `python_on_whales.Node`\n
"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.list","title":"list","text":"
list()\n

Returns the list of nodes in this swarm.

"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Node]`\n
"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.promote","title":"promote","text":"
promote(x)\n

Promote one or more nodes to manager in the swarm

PARAMETER DESCRIPTION x

One or a list of nodes.

TYPE: Union[ValidNode, List[ValidNode]]

"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.ps","title":"ps","text":"
ps(x=None)\n

Returns the list of swarm tasks running on one or more nodes.

from python_on_whales import docker\n\ntasks = docker.node.ps(\"my-node-name\")\nprint(tasks[0].desired_state)\n# running\n
PARAMETER DESCRIPTION x

One or more nodes (can be id, name or python_on_whales.Node object.). If the argument is not provided, it defaults to the current node. An empty list means an empty list will also be returned.

TYPE: Union[ValidNode, List[ValidNode], None] DEFAULT: None

"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.ps--returns","title":"Returns","text":"
`List[python_on_whales.Task]`\n
"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.remove","title":"remove","text":"
remove(x, force=False)\n

Remove one or more nodes from the swarm

PARAMETER DESCRIPTION x

One node or a list of nodes. You can use the id or the hostname of a node. You can also use a python_on_whales.Node.

TYPE: Union[ValidNode, List[ValidNode]]

force

Force remove a node from the swarm

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/node/#python_on_whales.components.node.cli_wrapper.NodeCLI.update","title":"update","text":"
update(\n    node,\n    availability=None,\n    labels_add={},\n    rm_labels=[],\n    role=None,\n)\n

Updates a Swarm node.

PARAMETER DESCRIPTION node

The node to update, you can use a string or a python_on_whales.Node object.

TYPE: ValidNode

availability

Availability of the node (\"active\"|\"pause\"|\"drain\")

TYPE: Optional[str] DEFAULT: None

labels_add

Remove a node label if exists

TYPE: Dict[str, str] DEFAULT: {}

rm_labels

Labels to remove from the node.

TYPE: List[str] DEFAULT: []

role

Role of the node (\"worker\"|\"manager\")

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/plugin/","title":"docker plugin","text":""},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI","title":"PluginCLI","text":""},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.create","title":"create","text":"
create(plugin_name, plugin_data_directory, compress=False)\n

Create a plugin from a rootfs and configuration.

PARAMETER DESCRIPTION plugin_name

The name you want to give to your plugin

TYPE: str

plugin_data_directory

Must contain config.json and rootfs directory.

TYPE: ValidPath

compress

Compress the context using gzip

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.disable","title":"disable","text":"
disable(plugin, force=False)\n

Disable a plugin

PARAMETER DESCRIPTION plugin

The plugin to disable

TYPE: ValidPlugin

force

Force the disable of an active plugin

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.enable","title":"enable","text":"
enable(plugin, timeout=None)\n

Enable a plugin

PARAMETER DESCRIPTION plugin

The plugin to enable

TYPE: ValidPlugin

timeout

HTTP client timeout (in seconds) (default 30)

TYPE: int DEFAULT: None

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns a python_on_whales.Plugin object from a string (name or id of the plugin)

PARAMETER DESCRIPTION x

One id or hostname or a list of name or ids

TYPE: Union[str, List[str]]

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.inspect--returns","title":"Returns","text":"
One or a list of `python_on_whales.Plugin`\n
"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.install","title":"install","text":"
install(\n    plugin_name,\n    configuration={},\n    alias=None,\n    disable=False,\n    disable_content_trust=True,\n)\n

Installs a Docker plugin

Warning: --grant-all-permissions is enabled, which means the program won't stop to ask you to grant the permissions.

PARAMETER DESCRIPTION plugin_name

The name of the plugin you want to install

TYPE: str

configuration

A dict adding configuration options to the plugin

TYPE: Dict[str, str] DEFAULT: {}

alias

Local name for plugin

TYPE: Optional[str] DEFAULT: None

disable

Do not enable the plugin on install

TYPE: bool DEFAULT: False

disable_content_trust

Skip image verification (default True)

TYPE: bool DEFAULT: True

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.install--returns","title":"Returns","text":"
A `python_on_whales.Plugin`.\n
"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.list","title":"list","text":"
list()\n

Returns a List[python_on_whales.Plugin that are installed on the daemon.

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.push","title":"push","text":"
push(plugin, disable_content_trust=True)\n

Push a plugin to a registry.

PARAMETER DESCRIPTION plugin

The plugin to push

TYPE: ValidPlugin

disable_content_trust

Skip image signing (default True)

TYPE: bool DEFAULT: True

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.remove","title":"remove","text":"
remove(x, force=False)\n

Removes one or more plugins

PARAMETER DESCRIPTION x

One or more plugins to remove.

TYPE: Union[ValidPlugin, List[ValidPlugin]]

force

Force the removal of this plugin.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.set","title":"set","text":"
set(plugin, configuration)\n

Change the settings for a plugin

PARAMETER DESCRIPTION plugin

The plugin that needs its settings changed

TYPE: ValidPlugin

configuration

The new configuration options.

TYPE: Dict[str, str]

"},{"location":"sub-commands/plugin/#python_on_whales.components.plugin.cli_wrapper.PluginCLI.upgrade","title":"upgrade","text":"
upgrade(\n    plugin,\n    remote=None,\n    disable_content_trust=True,\n    skip_remote_check=False,\n)\n

Upgrade a plugin

Warning: --grant-all-permissions is enabled, which means the program won't stop to ask you to grant the permissions.

PARAMETER DESCRIPTION plugin

The plugin to upgrade

TYPE: ValidPlugin

remote

The remote to fetch the upgrade from

TYPE: Optional[str] DEFAULT: None

disable_content_trust

Skip image verification (default True)

TYPE: bool DEFAULT: True

skip_remote_check

Do not check if specified remote plugin matches existing plugin image

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/pod/","title":"podman pod","text":""},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI","title":"PodCLI","text":""},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.create","title":"create","text":"
create(\n    name=None,\n    *,\n    add_hosts=[],\n    cgroup_parent=None,\n    cpus=None,\n    cpuset_cpus=None,\n    devices=[],\n    device_read_bps=[],\n    dns=[],\n    dns_options=[],\n    dns_search=[],\n    exit_policy=None,\n    gidmaps=[],\n    hostname=None,\n    infra=None,\n    infra_command=None,\n    infra_conmon_pidfile=None,\n    infra_image=None,\n    infra_name=None,\n    ip=None,\n    ip6=None,\n    labels={},\n    label_files=[],\n    mac_address=None,\n    memory=None,\n    networks=[],\n    network_aliases=[],\n    no_hosts=False,\n    pid=None,\n    pod_id_file=None,\n    publish=[],\n    replace=False,\n    restart=None,\n    security_options=[],\n    share=[],\n    shm_size=None,\n    subgidname=None,\n    subuidname=None,\n    sysctl={},\n    uidmaps=[],\n    userns=None,\n    uts=None,\n    volumes=[],\n    volumes_from=[]\n)\n

Creates a pod, but does not start it.

Start it then with the .start() method.

PARAMETER DESCRIPTION name

The name to set the pod to. If not specified a name is generated.

TYPE: Optional[str] DEFAULT: None

add_hosts

Add a custom host-to-IP mapping (format 'host:ip'), which adds a line to /etc/hosts. Conflicts with the no_hosts option.

TYPE: List[Tuple[str, str]] DEFAULT: []

cgroup_parent

Path to cgroups under which the cgroup for the pod is created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process.

TYPE: Optional[str] DEFAULT: None

cpus

Set the total number of CPUs delegated to the pod. The default is 0.0 indicating that there is no limit on computation power.

TYPE: Optional[float] DEFAULT: None

cpuset_cpus

CPUs in which to allow execution.

TYPE: Optional[List[int]] DEFAULT: None

devices

List of device names to pass from the host to containers in the pod.

TYPE: List[str] DEFAULT: []

device_read_bps

Limit read rate (in bytes per second) from a device (e.g. device_read_bps=/dev/sda:1mb).

TYPE: List[str] DEFAULT: []

dns

Set custom DNS servers in the /etc/resolv.conf file that is shared between all containers in the pod.

TYPE: List[str] DEFAULT: []

dns_options

Set custom DNS options in the /etc/resolv.conf file that is shared between all containers in the pod.

TYPE: List[str] DEFAULT: []

dns_search

Set custom DNS search domains in the /etc/resolv.conf file that is shared between all containers in the pod.

TYPE: List[str] DEFAULT: []

exit_policy

Set the exit policy of the pod when the last container exits. Supported policies are 'continue' (default) and 'stop'.

TYPE: Optional[str] DEFAULT: None

gidmaps

GID map for the user namespace. Using this flag runs all containers in the pod with user namespace enabled. It conflicts with the --userns and --subgidname flags.

TYPE: List[Tuple[int, int, int]] DEFAULT: []

hostname

Set the pod's hostname.

TYPE: Optional[str] DEFAULT: None

infra

Whether to create an infra container and associate it with the pod. An infra container is a lightweight container used to coordinate the shared kernel namespace of a pod.

TYPE: Optional[bool] DEFAULT: None

infra_command

Specify the command that is run to start the infra container.

TYPE: Optional[str] DEFAULT: None

infra_conmon_pidfile

Write the pid of the infra container's conmon process to a file.

TYPE: Optional[ValidPath] DEFAULT: None

infra_image

The custom image that is used for the infra container.

TYPE: Optional[ValidImage] DEFAULT: None

infra_name

The name that is used for the pod's infra container.

TYPE: Optional[str] DEFAULT: None

ip

Specify a static IPv4 address for the pod, for example 10.88.64.128. This option can only be used if the pod is joined to only a single network - i.e., network=network-name is used at most once - and if the pod is not joining another container's network namespace via network=container:id. The address must be within the network's IP address pool (default 10.88.0.0/16).

TYPE: Optional[str] DEFAULT: None

ip6

Specify a static IPv6 address for the pod, for example fd46:db93:aa76:ac37::10. This option can only be used if the pod is joined to only a single network (see note on the ip argument). The address must be within the network's IPv6 address pool.

TYPE: Optional[str] DEFAULT: None

labels

Add metadata labels to a pod.

TYPE: Dict[str, str] DEFAULT: {}

label_files

Read in a line-delimited file of labels.

TYPE: List[ValidPath] DEFAULT: []

mac_address

Pod network interface MAC address (e.g. 92:d0:c6:0a:29:33). This option can only be used if the pod is joined to only a single network (see note on the ip argument).

TYPE: Optional[str] DEFAULT: None

memory

Memory limit for the pod.

TYPE: Union[int, str, None] DEFAULT: None

networks

Specify networks to use for the pod.

TYPE: List[ValidNetwork] DEFAULT: []

network_aliases

Add network-scoped aliases for the pod, setting the alias for all networks that the container joins.

TYPE: List[str] DEFAULT: []

no_hosts

Do not create /etc/hosts for the pod. This option conflicts with --add-host.

TYPE: bool DEFAULT: False

pid

Set the PID mode for the pod. The default is to create a private PID namespace for the pod.

TYPE: Optional[str] DEFAULT: None

pod_id_file

Write the pod ID to the specified file.

TYPE: Optional[ValidPath] DEFAULT: None

publish

Publish a container's port, or range of ports, within this pod to the host.

TYPE: List[ValidPortMapping] DEFAULT: []

replace

If another pod with the same name already exists, replace and remove it.

TYPE: bool DEFAULT: False

restart

Restart policy for containers in the pod.

TYPE: Optional[str] DEFAULT: None

security_options

Security options (AppArmor or SELinux).

TYPE: List[str] DEFAULT: []

share

Namespaces to share between containers in the pod.

TYPE: List[str] DEFAULT: []

shm_size

Size of /dev/shm.

TYPE: Optional[Union[int, str]] DEFAULT: None

subgidname

Run the container in a new user namespace using the map with name in the /etc/subgid file.

TYPE: Optional[str] DEFAULT: None

subuidname

Run the container in a new user namespace using the map with name in the /etc/subuid file.

TYPE: Optional[str] DEFAULT: None

sysctl

Configure namespaced kernel parameters for all containers in the pod.

TYPE: Dict[str, str] DEFAULT: {}

uidmaps

Run all containers in the pod in a new user namespace using the supplied UID mapping. This option conflicts with the userns and subuidname options.

TYPE: List[Tuple[int, int, int]] DEFAULT: []

userns

Set the user namespace mode for all the containers in a pod.

TYPE: Optional[str] DEFAULT: None

uts

Set the UTS namespace mode for the pod.

TYPE: Optional[str] DEFAULT: None

volumes

Specify volumes passed to all containers in the pod.

TYPE: List[VolumeDefinition] DEFAULT: []

volumes_from

Mount volumes from the specified container(s).

TYPE: List[ValidContainer] DEFAULT: []

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.create--returns","title":"Returns","text":"
A `python_on_whales.Pod` object.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.exists","title":"exists","text":"
exists(pod)\n

Returns True if the pod exists. False otherwise.

It's just calling podman.pod.inspect(...) and verifies that it doesn't throw a python_on_whales.exceptions.NoSuchPod.

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.exists--returns","title":"Returns","text":"
A `bool`\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.inspect","title":"inspect","text":"
inspect(x)\n

Creates a python_on_whales.Pod object.

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.inspect--returns","title":"Returns","text":"
`python_on_whales.Pod`, or `List[python_on_whales.Pod]` if the input\nwas a list of strings.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.inspect--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if one of the pods does not exist.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.kill","title":"kill","text":"
kill(x, /, *, signal=None)\n

Kill pods.

PARAMETER DESCRIPTION x

One or more pods to kill

TYPE: Union[ValidPod, Sequence[ValidPod]]

signal

The signal to send the pods' containers

TYPE: Optional[Union[int, str]] DEFAULT: None

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.kill--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if a pod does not exist.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.list","title":"list","text":"
list(*, filters={})\n

List the pods on the host.

PARAMETER DESCRIPTION filters

Filters to apply when listing pods

TYPE: PodListFilters DEFAULT: {}

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Pod]`\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.logs","title":"logs","text":"
logs(\n    pod,\n    container=None,\n    *,\n    names=False,\n    since=None,\n    tail=None,\n    timestamps=False,\n    until=None,\n    follow=False,\n    stream=False\n)\n

Returns the logs of a pod's containers as a string or an iterator.

PARAMETER DESCRIPTION pod

The pod to get the container logs of

TYPE: ValidPod

container

Filter logs by container

TYPE: Optional[ValidContainer] DEFAULT: None

names

Output container names instead of IDs in the logs

TYPE: bool DEFAULT: False

since

Use a datetime or timedelta to specify the lower date limit for the logs.

TYPE: Union[None, datetime, timedelta] DEFAULT: None

tail

Number of lines to show from the end of the logs (default all)

TYPE: Optional[int] DEFAULT: None

timestamps

Put timestamps next to lines.

TYPE: bool DEFAULT: False

until

Use a datetime or a timedelta to specify the upper date limit for the logs.

TYPE: Union[None, datetime, timedelta] DEFAULT: None

follow

If False (the default), the logs returned are the logs up to the time of the function call. If True, the logs of the container up to the time the container stopped are displayed. Which means that if the container isn't stopped yet, the function will continue until the container is stopped. Which is why it is advised to use the stream option if you use the follow option. Without stream, only a str will be returned, possibly much later in the future. With stream, you'll be able to read the logs in real time.

TYPE: bool DEFAULT: False

stream

Similar to the stream argument of docker.run. This function will then return an iterator that will yield a tuple (source, content) with source being \"stderr\" or \"stdout\". content is the content of the line as bytes. Take a look at the user guide to have an example of the output.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.logs--returns","title":"Returns","text":"
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`\nif `stream=True`.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.logs--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if the container does not exist.\n

If you are a bit confused about follow and stream, here are some use cases.

  • If you want to have the logs up to this point as a str, don't use those args.
  • If you want to stream the output in real time, use follow=True, stream=True
  • If you want the logs up to this point, but you don't want to fit all the logs in memory because they are too big, use stream=True.
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.pause","title":"pause","text":"
pause(x)\n

Pauses one or more pods

PARAMETER DESCRIPTION x

One or more pods to pause

TYPE: Union[ValidPod, Sequence[ValidPod]]

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.pause--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.prune","title":"prune","text":"
prune()\n

Remove pods that are not running.

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.remove","title":"remove","text":"
remove(x, /, *, force=False, ignore=False, time=None)\n

Remove one or more pods.

PARAMETER DESCRIPTION x

Single pod or list of pods to remove.

TYPE: Union[ValidPod, Sequence[ValidPod]]

force

Force removal of the pods

TYPE: bool DEFAULT: False

ignore

Ignore errors when specified pod is missing

TYPE: bool DEFAULT: False

time

Seconds to wait for pod stop before killing the containers

TYPE: Optional[int] DEFAULT: None

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.remove--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if any of the pods do not\nexist and `ignore` was not set.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.restart","title":"restart","text":"
restart(x)\n

Restarts one or more pods

PARAMETER DESCRIPTION x

One or more pods to restart

TYPE: Union[ValidPod, Sequence[ValidPod]]

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.restart--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.start","title":"start","text":"
start(x)\n

Starts one or more pods

PARAMETER DESCRIPTION x

One or more pods to start

TYPE: Union[ValidPod, Sequence[ValidPod]]

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.start--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.stats","title":"stats","text":"
stats(x)\n

Get pods resource usage statistics

The data unit is the byte.

PARAMETER DESCRIPTION x

One or a list of pods

TYPE: Union[ValidPod, Sequence[ValidPod]]

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.stats--returns","title":"Returns","text":"
A `List[python_on_whales.PodStats]`.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.stop","title":"stop","text":"
stop(x, /, *, time=None)\n

Stops one or more pods

PARAMETER DESCRIPTION x

One or more pods to stop

TYPE: Union[ValidPod, Sequence[ValidPod]]

time

Seconds to wait for pods to stop before killing containers

TYPE: Optional[int] DEFAULT: None

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.stop--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.\n
"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.top","title":"top","text":"
top(pod)\n

Get the running processes of a pod

Not yet implemented

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.unpause","title":"unpause","text":"
unpause(x)\n

Unpauses one or more pods

PARAMETER DESCRIPTION x

One or more pods to unpause

TYPE: Union[ValidPod, Sequence[ValidPod]]

"},{"location":"sub-commands/pod/#python_on_whales.components.pod.cli_wrapper.PodCLI.unpause--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchPod` if any pod do not exist.\n
"},{"location":"sub-commands/secret/","title":"docker secret","text":""},{"location":"sub-commands/secret/#python_on_whales.components.secret.cli_wrapper.SecretCLI","title":"SecretCLI","text":""},{"location":"sub-commands/secret/#python_on_whales.components.secret.cli_wrapper.SecretCLI.create","title":"create","text":"
create(\n    name, file, driver=None, labels={}, template_driver=None\n)\n

Creates a python_on_whales.Secret.

"},{"location":"sub-commands/secret/#python_on_whales.components.secret.cli_wrapper.SecretCLI.create--returns","title":"Returns","text":"
A `python_on_whales.Secret` object.\n
"},{"location":"sub-commands/secret/#python_on_whales.components.secret.cli_wrapper.SecretCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns one or more python_on_whales.Secret based on an ID or name.

PARAMETER DESCRIPTION x

One or more IDs/names.

TYPE: Union[str, List[str]]

"},{"location":"sub-commands/secret/#python_on_whales.components.secret.cli_wrapper.SecretCLI.list","title":"list","text":"
list(filters={})\n

Returns all secrets as a List[python_on_whales.Secret].

"},{"location":"sub-commands/secret/#python_on_whales.components.secret.cli_wrapper.SecretCLI.remove","title":"remove","text":"
remove(x)\n

Removes one or more secrets

PARAMETER DESCRIPTION x

One or more secrets. Name, ids or python_on_whales.Secret objects are valid inputs.

TYPE: Union[ValidSecret, List[ValidSecret]]

"},{"location":"sub-commands/service/","title":"docker service","text":""},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI","title":"ServiceCLI","text":""},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.create","title":"create","text":"
create(\n    image,\n    command,\n    cap_add=[],\n    cap_drop=[],\n    constraints=[],\n    detach=False,\n    dns=[],\n    dns_options=[],\n    dns_search=[],\n    endpoint_mode=None,\n    entrypoint=None,\n    envs={},\n    env_files=[],\n    generic_resources=[],\n    groups=[],\n    healthcheck=True,\n    health_cmd=None,\n    health_interval=None,\n    health_retries=None,\n    health_start_period=None,\n    health_timeout=None,\n    hosts={},\n    hostname=None,\n    init=False,\n    isolation=None,\n    labels={},\n    limit_cpu=None,\n    limit_memory=None,\n    limit_pids=None,\n    log_driver=None,\n    network=None,\n    restart_condition=None,\n    restart_max_attempts=None,\n    secrets=[],\n    mounts=[],\n)\n

Creates a Docker swarm service.

Consider using 'docker stack deploy' instead as it's idempotent and easier to read for complex applications. docker stack deploy is basically docker compose for swarm clusters.

PARAMETER DESCRIPTION image

The image to use as the base for the service.

TYPE: str

command

The command to execute in the container(s).

TYPE: Optional[List[str]]

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.exists","title":"exists","text":"
exists(x)\n

Verify that a service exists.

It's just calling docker.service.inspect(...) and verifies that it doesn't throw a python_on_whales.exceptions.NoSuchService.

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.exists--returns","title":"Returns","text":"
A `bool`\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns one or a list of python_on_whales.Service object(s).

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.inspect--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchService` if one of the services\ndoesn't exists.\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.list","title":"list","text":"
list(filters={})\n

Returns the list of services

PARAMETER DESCRIPTION filters

If you want to filter the results based on a given condition. For example, docker.service.list(filters=dict(label=\"my_label=hello\")).

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Services]`\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.logs","title":"logs","text":"
logs(\n    service,\n    details=False,\n    since=None,\n    tail=None,\n    timestamps=False,\n    follow=False,\n    raw=False,\n    task_ids=True,\n    resolve=True,\n    truncate=True,\n    stream=False,\n)\n

Returns the logs of a service as a string or an iterator.

PARAMETER DESCRIPTION service

The service to get the logs of

TYPE: ValidService

details

Show extra details provided to logs

TYPE: bool DEFAULT: False

since

Use a datetime or timedelta to specify the lower date limit for the logs.

TYPE: Union[None, datetime, timedelta] DEFAULT: None

tail

Number of lines to show from the end of the logs (default all)

TYPE: Optional[int] DEFAULT: None

timestamps

Put timestamps next to lines.

TYPE: bool DEFAULT: False

follow

If False (the default), the logs returned are the logs up to the time of the function call. If True, the logs of the container up to the time the service is stopped (removed) are displayed. Which is why you must use the stream option if you use the follow option. Without stream, only a str will be returned, possibly much later in the future (maybe never if the service is never removed). So this option is not possible (You'll get an error if you use follow and not stream). With stream, you'll be able to read the logs in real time and stop whenever you need.

TYPE: bool DEFAULT: False

stream

Similar to the stream argument of docker.run(). This function will then returns and iterator that will yield a tuple (source, content) with source being \"stderr\" or \"stdout\". content is the content of the line as bytes. Take a look at the user guide to have an example of the output.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.logs--returns","title":"Returns","text":"
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`\nif `stream=True`.\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.logs--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchService` if the service does not exists.\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.ps","title":"ps","text":"
ps(x)\n

Returns the list of swarm tasks associated with this service.

You can pass multiple services at once at this function.

from python_on_whales import docker\n\ntasks = docker.service.ps(\"my-service-name\")\nprint(tasks[0].desired_state)\n# running\n
PARAMETER DESCRIPTION x

One or more services (can be id, name or python_on_whales.Service object.)

TYPE: Union[ValidService, List[ValidService]]

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.ps--returns","title":"Returns","text":"
`List[python_on_whales.Task]`\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.ps--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchService` if one of the services\ndoesn't exist.\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.remove","title":"remove","text":"
remove(services)\n

Removes a service

PARAMETER DESCRIPTION services

One or a list of services to remove.

TYPE: Union[ValidService, List[ValidService]]

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.remove--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchService` if one of the services\ndoesn't exist.\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.rollback","title":"rollback","text":"
rollback()\n

Not yet implemented

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.scale","title":"scale","text":"
scale(new_scales, detach=False)\n

Scale one or more services.

PARAMETER DESCRIPTION new_scales

Mapping between services and the desired scales. For example you can provide new_scale={\"service1\": 4, \"service2\": 8}

TYPE: Dict[ValidService, int]

detach

If True, does not wait for the services to converge and return immediately.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.scale--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchService` if one of the services\ndoesn't exists.\n
"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.update","title":"update","text":"
update(\n    service,\n    detach=False,\n    force=False,\n    image=None,\n    with_registry_authentication=False,\n    quiet=False,\n    replicas=None,\n)\n

Update a service

More options coming soon

PARAMETER DESCRIPTION service

The service to update

TYPE: ValidService

detach

Exit immediately instead of waiting for the service to converge

TYPE: bool DEFAULT: False

force

Force update even if no changes require it

TYPE: bool DEFAULT: False

image

Service image tag

TYPE: Optional[str] DEFAULT: None

with_registry_authentication

Send registry authentication details to swarm agents

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/service/#python_on_whales.components.service.cli_wrapper.ServiceCLI.update--raises","title":"Raises","text":"
`python_on_whales.exceptions.NoSuchService` if the service doesn't exists.\n
"},{"location":"sub-commands/stack/","title":"docker stack","text":""},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI","title":"StackCLI","text":""},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.deploy","title":"deploy","text":"
deploy(\n    name,\n    compose_files=[],\n    orchestrator=None,\n    prune=False,\n    resolve_image=\"always\",\n    with_registry_auth=False,\n    env_files=[],\n    variables={},\n)\n

Deploys a stack.

PARAMETER DESCRIPTION name

The name of the stack to deploy. Mandatory.

TYPE: str

compose_files

One or more docker-compose files. If there are more than one, they will be fused together.

TYPE: Union[ValidPath, List[ValidPath]] DEFAULT: []

orchestrator

The orchestrator to use, `\"swarm\" or \"kubernetes\" or \"all\".

TYPE: Optional[str] DEFAULT: None

prune

Prune services that are no longer referenced

TYPE: bool DEFAULT: False

resolve_image

Query the registry to resolve image digest and supported platforms \"always\"|\"changed\"|\"never\" (default \"always\"). Note that if the registry cannot be queried when using \"always\", it's going to try to use images present locally on the nodes.

TYPE: str DEFAULT: 'always'

with_registry_auth

Send registry authentication details to Swarm agents. Required if you need to run docker login to pull the docker images in your stack.

TYPE: bool DEFAULT: False

env_files

Similar to .env files in docker-compose. Loads variables from .env files. If both env_files and variables are used, variables have priority. This behavior is similar to the one you would experience with compose.

TYPE: List[ValidPath] DEFAULT: []

variables

A dict dictating by what to replace the variables declared in the docker-compose files. In the docker CLI, you would use environment variables for this.

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.deploy--returns","title":"Returns","text":"
A `python_on_whales.Stack` object.\n
"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.list","title":"list","text":"
list()\n

Returns a list of python_on_whales.Stack

"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.list--returns","title":"Returns","text":"
A `List[python_on_whales.Stack]`.\n
"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.ps","title":"ps","text":"
ps(x)\n

Returns the list of swarm tasks in this stack.

from python_on_whales import docker\n\ntasks = docker.stack.ps(\"my-stack\")\nprint(tasks[0].desired_state)\n# running\n
PARAMETER DESCRIPTION x

A stack . It can be name or a python_on_whales.Stack object.

TYPE: ValidStack

"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.ps--returns","title":"Returns","text":"
`List[python_on_whales.Task]`\n
"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.remove","title":"remove","text":"
remove(x)\n

Removes one or more stacks.

PARAMETER DESCRIPTION x

One or more stacks, empty list means nothing will be done.

TYPE: Union[ValidStack, List[ValidStack]]

"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.services","title":"services","text":"
services(stack)\n

List the services present in the stack.

PARAMETER DESCRIPTION stack

A docker stack or the name of a stack.

TYPE: ValidStack

"},{"location":"sub-commands/stack/#python_on_whales.components.stack.cli_wrapper.StackCLI.services--returns","title":"Returns","text":"
A `List[python_on_whales.Stack]`\n
"},{"location":"sub-commands/swarm/","title":"docker swarm","text":""},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI","title":"SwarmCLI","text":""},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.ca","title":"ca","text":"
ca(\n    ca_certificate=None,\n    ca_key=None,\n    certificate_expiry=None,\n    detach=False,\n    external_ca=None,\n    rotate=False,\n)\n

Get and rotate the root CA

PARAMETER DESCRIPTION ca_certificate

Path to the PEM-formatted root CA certificate to use for the new cluster

TYPE: Optional[ValidPath] DEFAULT: None

ca_key

Path to the PEM-formatted root CA key to use for the new cluster

TYPE: Optional[ValidPath] DEFAULT: None

certificate_expiry

Validity period for node certificates

TYPE: Union[int, timedelta, None] DEFAULT: None

detach

Exit immediately instead of waiting for the root rotation to converge. The function will return None.

TYPE: bool DEFAULT: False

external_ca

Specifications of one or more certificate signing endpoints

TYPE: Optional[str] DEFAULT: None

rotate

Rotate the swarm CA - if no certificate or key are provided, new ones will be generated.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.init","title":"init","text":"
init(\n    advertise_address=None,\n    autolock=False,\n    availability=\"active\",\n    data_path_address=None,\n    data_path_port=None,\n    listen_address=None,\n)\n

Initialize a Swarm.

If you need the token to join the new swarm from another node, use the docker.swarm.join_token function.

A example of how to initialize the whole swarm without leaving the manager if the manager has ssh access to the workers:

from python_on_whales import docker, DockerClient\n\nworker_docker = DockerClient(host=\"ssh://worker_linux_user@worker_hostname\")\n# Here the docker variable is connected to the local daemon\n# worker_docker is a connected to the Docker daemon of the\n# worker through ssh, useful to control it without login to the machine\n# manually.\ndocker.swarm.init()\nmy_token = docker.swarm.join_token(\"worker\")  # you can set manager too\nworker_docker.swarm.join(\"manager_hostname:2377\", token=my_token)\n
PARAMETER DESCRIPTION advertise_address

Advertised address (format: <ip|interface>[:port])

TYPE: Optional[str] DEFAULT: None

autolock

Enable manager autolocking (requiring an unlock key to start a stopped manager)

TYPE: bool DEFAULT: False

availability

Availability of the node (\"active\"|\"pause\"|\"drain\")

TYPE: str DEFAULT: 'active'

data_path_address

Address or interface to use for data path traffic (format is <ip|interface>)

TYPE: Optional[str] DEFAULT: None

listen_address

address upon which the node listens for inbound swarm manager traffic (format: <ip|interface>[:port])

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.join","title":"join","text":"
join(\n    manager_address,\n    advertise_address=None,\n    availability=\"active\",\n    data_path_address=None,\n    listen_address=None,\n    token=None,\n)\n

Joins a swarm

PARAMETER DESCRIPTION manager_address

The address of the swarm manager in the format \"{ip}:{port}\"

TYPE: str

advertise_address

Advertised address (format: [:port])

TYPE: Optional[str] DEFAULT: None

availability

Availability of the node (\"active\"|\"pause\"|\"drain\")

TYPE: str DEFAULT: 'active'

data_path_address

Address or interface to use for data path traffic (format: )

TYPE: Optional[str] DEFAULT: None

listen_address

Listen address (format: [:port]) (default 0.0.0.0:2377)

TYPE: Optional[str] DEFAULT: None

token

Token for entry into the swarm, will determine if the node enters the swarm as a manager or a worker.

TYPE: Optional[str] DEFAULT: None

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.join_token","title":"join_token","text":"
join_token(node_type, rotate=False)\n

Obtains a token to join the swarm

This token can then be used with docker.swarm.join(\"manager:2377\", token=my_token).

PARAMETER DESCRIPTION node_type

\"manager\" or \"worker\"

TYPE: str

rotate

Rotate join token

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.leave","title":"leave","text":"
leave(force=False)\n

Leave the swarm

PARAMETER DESCRIPTION force

Force this node to leave the swarm, ignoring warnings

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.unlock","title":"unlock","text":"
unlock(key)\n

Unlock a swarm after the --autolock parameter was used and the daemon restarted.

PARAMETER DESCRIPTION key

The key to unlock the swarm. The key can be obtained on any manager with docker.swarm.unlock_key().

TYPE: str

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.unlock_key","title":"unlock_key","text":"
unlock_key(rotate=False)\n

Gives you the key needed to unlock the swarm after a manager daemon reboot.

PARAMETER DESCRIPTION rotate

Rotate the unlock key.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/swarm/#python_on_whales.components.swarm.cli_wrapper.SwarmCLI.update","title":"update","text":"
update(\n    autolock=None,\n    cert_expiry=None,\n    dispatcher_heartbeat=None,\n    external_ca=None,\n    max_snapshots=None,\n    snapshot_interval=None,\n    task_history_limit=None,\n)\n

Update the swarm configuration

PARAMETER DESCRIPTION autolock

Change manager autolocking setting

TYPE: Optional[bool] DEFAULT: None

cert_expiry

Validity period for node certificates, default is datetime.timedelta(days=90). If int, it's a number of seconds.

TYPE: Optional[timedelta] DEFAULT: None

dispatcher_heartbeat

Dispatcher heartbeat period.

TYPE: Optional[timedelta] DEFAULT: None

external_ca

Specifications of one or more certificate signing endpoints

TYPE: Optional[str] DEFAULT: None

max_snapshots

Number of additional Raft snapshots to retain

TYPE: Optional[int] DEFAULT: None

snapshot_interval

Number of log entries between Raft snapshots (default 10000)

TYPE: Optional[int] DEFAULT: None

task_history_limit

Task history retention limit (default 5)

TYPE: Optional[int] DEFAULT: None

"},{"location":"sub-commands/system/","title":"docker system","text":""},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI","title":"SystemCLI","text":""},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI.disk_free","title":"disk_free","text":"
disk_free()\n

Give information about the disk usage of the Docker daemon.

Returns a python_on_whales.DiskFreeResult object.

from python_on_whales import docker\ndisk_free_result = docker.system.disk_free()\nprint(disk_free_result.images.active)  #int\nprint(disk_free_result.containers.reclaimable)  # int, number of bytes\nprint(disk_free_result.volumes.reclaimable_percent)  # float\nprint(disk_free_result.build_cache.total_count)  # int\nprint(disk_free_result.build_cache.size)  # int, number of bytes\n...\n

Note that the number are not 100% accurate because the docker CLI doesn't provide the exact numbers.

Maybe in a future implementation, we can provide exact numbers.

Verbose mode is not yet implemented.

"},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI.events","title":"events","text":"
events(since=None, until=None, filters={})\n

Return docker events information up to the current point in time.

If until is not specified, then the iterator returned is infinite. For example

from python_on_whales import docker\nfrom datetime import datetime, timedelta\n\n\nfor event in docker.system.events():\n    print(\"new event!\")\n    print(event)\n    # this will never end, that's ok if you want to monitor something\n    # for a long time. You can also use 'break' in the for loop if needed.\n\nfor event in docker.system.events(until=datetime.now() - timedelta(seconds=30)):\n    print(\"some past event\")\n    print(event)\n    # this loop will end, unlike the previous one\n\nfor event in docker.system.events(until=datetime.now() + timedelta(seconds=30)):\n    print(\"some past event\")\n    print(event)\n    # this loop will end in 30 seconds, even if there are no events at all\n\nevents = list(docker.system.events(filters={\"container\": \"mycontainer\"}, until=datetime.now()))\n# the list of all events concerning the container \"mycontainer\"\n
PARAMETER DESCRIPTION since

Show all events created since timestamp

TYPE: Union[None, datetime, timedelta] DEFAULT: None

until

Stream events until this timestamp

TYPE: Union[None, datetime, timedelta] DEFAULT: None

filters

See the Docker documentation page about filtering .

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI.events--returns","title":"Returns","text":"
A iterator which will yield DockerEvent objects from stdout/stderr\n

reference page for system events

"},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI.info","title":"info","text":"
info()\n

Returns diverse information about the Docker client and daemon.

"},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI.info--returns","title":"Returns","text":"
A `python_on_whales.SystemInfo` object\n

As an example

from python_on_whales import docker\n\ninfo = docker.system.info()\nprint(info.images)\n# 40\nprint(info.plugins.volume)\n# [\"local\"}\n...\n

You can find all attributes available by looking up the reference page for system info.

"},{"location":"sub-commands/system/#python_on_whales.components.system.cli_wrapper.SystemCLI.prune","title":"prune","text":"
prune(all=False, volumes=False, filters={})\n

Remove unused docker data

PARAMETER DESCRIPTION all

Remove all unused images not just dangling ones

TYPE: bool DEFAULT: False

volumes

Prune volumes

TYPE: bool DEFAULT: False

filters

See the Docker documentation page about filtering . For example, filters=dict(until=\"24h\").

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/task/","title":"docker task","text":""},{"location":"sub-commands/task/#python_on_whales.components.task.cli_wrapper.TaskCLI","title":"TaskCLI","text":""},{"location":"sub-commands/task/#python_on_whales.components.task.cli_wrapper.TaskCLI.inspect","title":"inspect","text":"
inspect(x)\n

Returns a python_on_whales.Task object from its ID.

"},{"location":"sub-commands/task/#python_on_whales.components.task.cli_wrapper.TaskCLI.list","title":"list","text":"
list()\n

Returns all tasks in the swarm

"},{"location":"sub-commands/task/#python_on_whales.components.task.cli_wrapper.TaskCLI.list--returns","title":"Returns","text":"
`List[python_on_whales.Task]`\n
"},{"location":"sub-commands/task/#python_on_whales.components.task.cli_wrapper.TaskCLI.logs","title":"logs","text":"
logs()\n

Not Yet implemented

"},{"location":"sub-commands/trust/","title":"docker trust","text":""},{"location":"sub-commands/trust/#python_on_whales.components.trust.cli_wrapper.TrustCLI","title":"TrustCLI","text":""},{"location":"sub-commands/trust/#python_on_whales.components.trust.cli_wrapper.TrustCLI.inspect","title":"inspect","text":"
inspect()\n

Not yet implemented

"},{"location":"sub-commands/trust/#python_on_whales.components.trust.cli_wrapper.TrustCLI.revoke","title":"revoke","text":"
revoke()\n

Not yet implemented

"},{"location":"sub-commands/trust/#python_on_whales.components.trust.cli_wrapper.TrustCLI.sign","title":"sign","text":"
sign()\n

Not yet implemented

"},{"location":"sub-commands/volume/","title":"docker volume","text":""},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI","title":"VolumeCLI","text":""},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.clone","title":"clone","text":"
clone(\n    source,\n    new_volume_name=None,\n    driver=None,\n    labels={},\n    options={},\n)\n

Clone a volume.

PARAMETER DESCRIPTION source

The volume to clone

TYPE: ValidVolume

new_volume_name

The new volume name. If not given, a random name is chosen.

TYPE: Optional[str] DEFAULT: None

driver

Specify volume driver name (default \"local\")

TYPE: Optional[str] DEFAULT: None

labels

Set metadata for a volume

TYPE: Dict[str, str] DEFAULT: {}

options

Set driver specific options

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.clone--returns","title":"Returns","text":"
A `python_on_whales.Volume`, the new volume.\n
"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.copy","title":"copy","text":"
copy(source, destination)\n

Copy files/folders between a volume and the local filesystem.

PARAMETER DESCRIPTION source

If source is a directory/file inside a Docker volume, a tuple (my_volume, path_in_volume) must be provided. The volume can be a python_on_whales.Volume or a volume name as str. The path can be a pathlib.Path or a str. If source is a local directory, a pathlib.Path or str should be provided. End the source path with /. if you want to copy the directory content in another directory.

TYPE: Union[ValidPath, VolumePath]

destination

Same as source.

TYPE: Union[ValidPath, VolumePath]

"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.create","title":"create","text":"
create(\n    volume_name=None, driver=None, labels={}, options={}\n)\n

Creates a volume

PARAMETER DESCRIPTION volume_name

The volume name, if not provided, a long random string will be used instead.

TYPE: Optional[str] DEFAULT: None

driver

Specify volume driver name (default \"local\")

TYPE: Optional[str] DEFAULT: None

labels

Set metadata for a volume

TYPE: Dict[str, str] DEFAULT: {}

options

Set driver specific options

TYPE: Dict[str, str] DEFAULT: {}

"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.exists","title":"exists","text":"
exists(x)\n

Returns True if the volume exists. False otherwise.

It's just calling docker.volume.inspect(...) and verifies that it doesn't throw a python_on_whales.exceptions.NoSuchVolume.

"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.exists--returns","title":"Returns","text":"
A `bool`\n
"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.list","title":"list","text":"
list(filters={})\n

List volumes

PARAMETER DESCRIPTION filters

See the Docker documentation page about filtering . An example filters=dict(dangling=1, driver=\"local\").

TYPE: Dict[str, Union[str, int]] DEFAULT: {}

"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.list--returns","title":"Returns","text":"
`List[python_on_whales.Volume]`\n
"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.prune","title":"prune","text":"
prune(filters={}, all=False)\n

Remove volumes

PARAMETER DESCRIPTION filters

See the Docker documentation page about filtering . An example filters=dict(dangling=1, driver=\"local\").

TYPE: Dict[str, Union[str, int]] DEFAULT: {}

all

Remove all unused volumes, not just anonymous ones.

TYPE: bool DEFAULT: False

"},{"location":"sub-commands/volume/#python_on_whales.components.volume.cli_wrapper.VolumeCLI.remove","title":"remove","text":"
remove(x)\n

Removes one or more volumes

PARAMETER DESCRIPTION x

A volume or a list of volumes. An empty list as argument means nothing is done.

TYPE: Union[ValidVolume, List[ValidVolume]]

"},{"location":"user_guide/docker_run/","title":"The different ways of using docker.run()","text":""},{"location":"user_guide/docker_run/#simple-call","title":"Simple call","text":"
from python_on_whales import docker\n\nstdout_as_str = docker.run(\"hello-world\")\nprint(stdout_as_str)\n\n# Hello from Docker!\n# This message shows that your installation appears to be working correctly.\n# ...\n

This is the simplest way. The function docker.run(...) returns only when the container is done and the output (stdout) is returned all at once in a single string.

This is very practical for simple use cases, but not so much when you have a container that needs to run for a very long time for example, as you don't get the output in real time.

"},{"location":"user_guide/docker_run/#detach-the-container","title":"Detach the container","text":"
from python_on_whales import docker\nfrom redis import Redis\n\nredis_container = docker.run(\"redis\", detach=True, publish=[(6379, 6379)])\n# the container is up and listening on port 6379\n\nredis_client = Redis()\nredis_client.set(\"hello\", \"world\")\nprint(redis_client.get(\"hello\"))\n# b'world'\n

This is a very simple way to start a container in the background. It will continue running until the process inside exits. It's useful when running servers for example, because they should never stop.

"},{"location":"user_guide/docker_run/#detach-with-the-context-manager","title":"Detach with the context manager","text":"
from python_on_whales import docker\nfrom redis import Redis\n\nwith docker.run(\"redis\", detach=True, publish=[(6379, 6379)]) as redis_container:\n    # the container is up and listening on port 6379\n    redis_client = Redis()\n    redis_client.set(\"hello\", \"world\")\n    print(redis_client.get(\"hello\"))\n    # b'world'\n\nprint(\"The container is now stopped and removed because we're outside the context manager\")\nprint(redis_container.state.running)  # will raise an error with the message \"no such container\"\n

Using the context manager is quite useful when you need the container running in the background but you need to know exactly for how long it will live.

For example in unit tests, you might need a redis server to execute a function. You can then have the redis container running only during this specific unit test.

This is also better than calling manually redis_container.remove(). Why? For the same reason it's better to do with open(...) as f: than f = open(...). If an exception occurs in the context manager block, the container is still removed.

"},{"location":"user_guide/docker_run/#stream-the-output","title":"Stream the output","text":"
from python_on_whales import docker\n\noutput_generator = docker.run(\"busybox\", [\"ping\", \"-c\", \"50\", \"www.google.com\"], stream=True, name=\"box\")\n\nfor stream_type, stream_content in output_generator:\n    print(f\"Stream type: {stream_type}, stream content: {stream_content}\")\n\n# Stream type: stdout, stream content: b'PING www.google.com (142.250.74.228): 56 data bytes\\n'\n# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=0 ttl=119 time=18.350 ms\\n'\n# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=1 ttl=119 time=18.386 ms\\n'\n# ...\n# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=48 ttl=119 time=18.494 ms\\n'\n# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=49 ttl=119 time=18.260 ms\\n'\n# Stream type: stdout, stream content: b'\\n'\n# Stream type: stdout, stream content: b'--- www.google.com ping statistics ---\\n'\n# Stream type: stdout, stream content: b'50 packets transmitted, 50 packets received, 0% packet loss\\n'\n# Stream type: stdout, stream content: b'round-trip min/avg/max = 17.547/18.075/18.508 ms\\n'\n\n# when the generator is done and we're out of the loop\n# it means the container has finished running.\nprint(docker.container.inspect(\"box\").state.running)\n# False\n

This is very useful for long running processes. For example if you need the output of a container that will stay up for a very long time.

"},{"location":"user_guide/exceptions/","title":"Capturing exceptions","text":""},{"location":"user_guide/exceptions/#exception-classes","title":"Exception classes","text":"

Exceptions raised will be an instance of DockerException, or a child class for more specific errors.

Those are the child classes:

  • NoSuchContainer
  • NoSuchImage
  • NoSuchService
  • NotASwarmManager
  • NoSuchVolume

All exceptions will have these 4 attributes:

  • docker_command: the docker command used internally, as a list of strings.
  • return_code: the exit code docker client exited with, as an int
  • stdout: the content that docker wrote to stdout, as a string, or None
  • stderr: the content that docker wrote to stderr, as a string, or None
"},{"location":"user_guide/exceptions/#example","title":"Example","text":"
import logging\nfrom python_on_whales import DockerClient\nfrom python_on_whales.exceptions import DockerException\n\nclient = DockerClient(compose_files=[\"/tmp/docker-compose.yml\"])\ntry:\n    client.execute(\"my-service\", [\"arg1\", \"arg2\"])\nexcept DockerException as e:\n    print(f\"Exit code {e.return_code} while running {e.docker_command}\")\n
"},{"location":"user_guide/generic_resources/","title":"Docker Swarm generic resources","text":"

There are two kind of generic resources, discreet and named.

Both are declared in /etc/docker/daemon.json and both are accessible in your containers as environment variables.

"},{"location":"user_guide/generic_resources/#named-resources","title":"Named resources","text":"

Named resources should be used when you have a small number of things you want accessed. The best example is gpu devices. Each gpu has a UUID, which can be the name of this resources. Actually you could also use an index, and this index would have to be the \"name\" of the gpu.

Since we want to show they're generic, let's take something else than GPUs for this example.

Let's say you have 5 hamsters connected to your node, making an app run:

They are named Robert, Lucie, Annie, James and Stacy.

You'll define one service that needs one hamster and one that needs three. We'll call them my_light_service and my_heavy_service.

Let's declare the hamsters in the /etc/docker/daemon.json. If this file doesn't exist on your system, you can create it.

Mine looks like this, note that you don't need the insecure registries part:

{\n    \"insecure-registries\": [\"127.0.0.1:5000\"],\n    \"node-generic-resources\": [\n        \"hamster=Robert\",\n        \"hamster=Lucie\",\n        \"hamster=Annie\",\n        \"hamster=James\",\n        \"hamster=Stacy\"\n    ]\n}\n

Restart your Docker daemon with sudo service docker restart.

Then create a Docker swarm: docker swarm init

The hamster are declared, up and ready to go! You can check they're here with docker node ls and docker node inspect.

"},{"location":"user_guide/generic_resources/#creating-services-with-the-cli","title":"Creating services with the CLI","text":"

It's time to create services and hit those hamsters!

First we'll create the services with the CLI and then with the command line.

$ docker service create --generic-resource \"hamster=1\" --name my_light_service ubuntu bash -c \"env && sleep infinity\"\n$ docker service create --generic-resource \"hamster=3\" --name my_heavy_service ubuntu bash -c \"env && sleep infinity\"\n

We have one replica for the light and heavy service. They use 4 hamster. Let's try to use moooooooore!

$ docker service scale -d my_light_service=10 my_heavy_service=10\n$ docker service ls\nID                  NAME                MODE                REPLICAS            IMAGE               PORTS\ntt436bxjtdn7        my_heavy_service    replicated          1/10                 ubuntu:latest\nksiq5x0bxch1        my_light_service    replicated          2/10                 ubuntu:latest\n

Remember, we only have 5 hamsters, and 3 are needed for the heavy service and one for the light service. Hence here 2 * 1 + 1 * 3 = 5 ! This is what we wanted. So how does each container knows which hamster to use?

We asked each container to print the environment variables and sleep for infinity env && sleep infinity. Let's take a look with docker logs:

$ docker ps\nCONTAINER ID IMAGE          COMMAND                NAMES\n1e8932f5a985 ubuntu:latest  \"bash -c 'env && sle\u2026\" my_light_service.4.shys2wwxz7jjfjg2g2e0xl1sw\n0a5c4ddd303a ubuntu:latest  \"bash -c 'env && sle\u2026\" my_heavy_service.1.p39satddgf6j1uhspdiohcyzh\ne2872006cc97 ubuntu:latest  \"bash -c 'env && sle\u2026\" my_light_service.1.bbo0fbi5d5e2zdwozgbse8x57\n\n$ docker logs my_light_service.4.shys2wwxz7jjfjg2g2e0xl1sw\nDOCKER_RESOURCE_HAMSTER=Stacy\nHOSTNAME=1e8932f5a985\n\n$ docker logs my_heavy_service.1.p39satddgf6j1uhspdiohcyzh\nDOCKER_RESOURCE_HAMSTER=Lucie,Annie,James\nHOSTNAME=0a5c4ddd303a\n\n$ docker logs my_light_service.1.bbo0fbi5d5e2zdwozgbse8x57\nDOCKER_RESOURCE_HAMSTER=Robert\nHOSTNAME=e2872006cc97\n

So we can see that each container is aware of it's hamster with an environment variable. The process running in the container can grab it and then use the correct hamster without making two containers use the same hamster.

"},{"location":"user_guide/generic_resources/#using-hamsters-with-docker-stack","title":"Using hamsters with Docker stack","text":"

Here is a docker-compose.yml that will declare the services exactly like we did in the CLI:

version: \"3.8\"\n\nservices:\n  my_light_service:\n    command:\n      - bash\n      - -c\n      - env && sleep infinity\n    image: ubuntu\n    deploy:\n      replicas: 10\n      resources:\n        reservations:\n          generic_resources:\n            - discrete_resource_spec:\n                kind: 'hamster'\n                value: 1\n\n  my_heavy_service:\n    command:\n      - bash\n      - -c\n      - env && sleep infinity\n    image: ubuntu\n    deploy:\n      replicas: 10\n      resources:\n        reservations:\n          generic_resources:\n            - discrete_resource_spec:\n                kind: 'hamster'\n                value: 3\n
$ docker stack deploy -c docker-compose.yml my_stack_using_hamsters\nCreating network my_stack_using_hamsters_default\nCreating service my_stack_using_hamsters_my_heavy_service\nCreating service my_stack_using_hamsters_my_light_service\n\n$ docker service ls\nID              NAME                                       MODE        REPLICAS  IMAGE \nnlhwfnz0d1cx    my_stack_using_hamsters_my_heavy_service   replicated  1/10      ubuntu:latest\nc77tv3czzfw2    my_stack_using_hamsters_my_light_service   replicated  2/10      ubuntu:latest\n
"},{"location":"user_guide/generic_resources/#how-does-that-fit-with-nvidia-gpus","title":"How does that fit with Nvidia GPUs?","text":"

Well, if you remember, the Nvidia runtime uses environment variables in the container to know which gpu to use.

By modifying the /etc/nvidia-container-runtime/config.toml, and setting swarm-resource = \"DOCKER_RESOURCE_GPU\", it indicates the nvidia-docker runtime that it should watch for this environment variable when deciding which gpu to use. Make the nvidia-docker runtime the default one for this node, replace hamster by gpu and you're good to go as long as you used UUID as your hamster's names.

A more in depth guide can be found here.

"},{"location":"user_guide/generic_resources/#discreet-resources","title":"Discreet resources","text":"

TODO (just put \"node-generic-resources\": [\"hamster=100\"] in the daemon.json, there are too many hamsters to give them names).

"},{"location":"user_guide/running_python_on_whales_inside_a_container/","title":"Running python-on-whales inside a container","text":"

To follow this example, you just need Docker installed, and nothing else!

"},{"location":"user_guide/running_python_on_whales_inside_a_container/#the-use-case","title":"The use case","text":"

Sometimes you don't want to install Python on your system, but you still would like to use python-on-whales to handle most of the Docker logic.

You can then run python-on-whales inside a Docker container. For simplicity, we let the container access the Docker daemon of the host.

Let's give you the code example, and we'll explain afterwards where is the magic.

"},{"location":"user_guide/running_python_on_whales_inside_a_container/#example","title":"Example","text":"

We want to run this small Python script. It uses python-on-whales. We'll call it main.py

# main.py\nfrom python_on_whales import docker\n\nprint(\"We are going to run the hello world docker container\")\n\noutput = docker.run(\"hello-world\")\n\nprint(\"Here is the output:\")\nprint(output)\n\nprint(f\"buildx version: {docker.buildx.version()}\")\nprint(f\"compose version: {docker.compose.version()}\")\n

Next to this main.py, make a Dockerfile.

# Dockerfile\nFROM python:3.9\n\nRUN pip install python-on-whales\nRUN python-on-whales download-cli\n\n# install docker buildx, this step is optional\nRUN mkdir -p ~/.docker/cli-plugins/\nRUN wget https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64 -O ~/.docker/cli-plugins/docker-buildx\nRUN chmod a+x  ~/.docker/cli-plugins/docker-buildx\n\n# install docker compose, this step is optional\nRUN mkdir -p ~/.docker/cli-plugins/\nRUN wget https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-linux-x86_64 -O ~/.docker/cli-plugins/docker-compose\nRUN chmod a+x  ~/.docker/cli-plugins/docker-compose\n\nCOPY ./main.py /main.py\nCMD python /main.py\n

We're all set! Let's run this Python script, without having Python installed on the system!

docker build -t image-with-python-on-whales .\ndocker run -v /var/run/docker.sock:/var/run/docker.sock image-with-python-on-whales\n

You should see this output:

We are going to run the hello world docker container\nHere is the output:\n\nHello from Docker!\nThis message shows that your installation appears to be working correctly.\n\nTo generate this message, Docker took the following steps:\n 1. The Docker client contacted the Docker daemon.\n 2. The Docker daemon pulled the \"hello-world\" image from the Docker Hub.\n    (amd64)\n 3. The Docker daemon created a new container from that image which runs the\n    executable that produces the output you are currently reading.\n 4. The Docker daemon streamed that output to the Docker client, which sent it\n    to your terminal.\n\nTo try something more ambitious, you can run an Ubuntu container with:\n $ docker run -it ubuntu bash\n\nShare images, automate workflows, and more with a free Docker ID:\n https://hub.docker.com/\n\nFor more examples and ideas, visit:\n https://docs.docker.com/get-started/\n\nbuildx version: github.com/docker/buildx v0.6.3 266c0eac611d64fcc0c72d80206aa364e826758d\ncompose version: Docker Compose version v2.0.0-rc.2\n
"},{"location":"user_guide/running_python_on_whales_inside_a_container/#how-does-it-work","title":"How does it work?","text":"

The main magic here is the sharing of the docker socket between the host and the container. This is done with the -v /var/run/docker.sock:/var/run/docker.sock.

With this option, the container can have access to the docker API. But it still needs the binary client in Go. Download it in the dockerfile with python-no-whales download-cli. You can then optionally install buildx and compose.

Then you're good to go! Simple as that.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..d2b506e6 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,193 @@ + + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + + None + 2024-07-19 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..f4e799df4abcc8e92445eb1cdc4e84c1c6a32e24 GIT binary patch literal 219 zcmb2|=HTFrot4J)zc{lbH8-(9uOc^x;q6&pz9s_!)(3l+E8KN%oT0I7%3Sa8ss=W# z2@c&pqI>uLIa{Fl@nidYV}8_8s16?6`yx|3YYOu%ayx$BPMRm#U}sT z-yA1q=PEunxcB?v!Tw1bH>J&viqi~!RlQz*Q$Xow!J5fBO8+MwXk=#Rld&jxfMERR Tn9qO7ua5EiRo-{Mg%}tB?Y(7; literal 0 HcmV?d00001 diff --git a/sub-commands/buildx/index.html b/sub-commands/buildx/index.html new file mode 100644 index 00000000..a91ae459 --- /dev/null +++ b/sub-commands/buildx/index.html @@ -0,0 +1,2892 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker buildx - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ BuildxCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ bake + + +

+
bake(
+    targets=[],
+    builder=None,
+    files=[],
+    load=False,
+    cache=True,
+    print=False,
+    progress="auto",
+    pull=False,
+    push=False,
+    set={},
+    variables={},
+    stream_logs=False,
+)
+
+ +
+ +

Bake is similar to make, it allows you to build things declared in a file.

+

For example it allows you to build multiple docker image in parallel.

+

The CLI docs is here +and it contains a lot more information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
targets +
+

Targets or groups of targets to build.

+
+

+ + TYPE: + Union[str, List[str]] + + + DEFAULT: + [] + +

+
builder +
+

The builder to use.

+
+

+ + TYPE: + Optional[ValidBuilder] + + + DEFAULT: + None + +

+
files +
+

Build definition file(s)

+
+

+ + TYPE: + Union[ValidPath, List[ValidPath]] + + + DEFAULT: + [] + +

+
load +
+

Shorthand for set=["*.output=type=docker"]

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
cache +
+

Whether to use the cache or not.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
print +
+

Do nothing, just returns the config.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
progress +
+

Set type of progress output ("auto", "plain", "tty", +or False). Use plain to keep the container output on screen

+
+

+ + TYPE: + Literal['auto', 'plain', 'tty', False] + + + DEFAULT: + 'auto' + +

+
pull +
+

Always try to pull the newer version of the image

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
push +
+

Shorthand for set=["*.output=type=registry"]

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
set +
+

A list of overrides in the form "targetpattern.key=value".

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
variables +
+

A dict containing the values of the variables defined in the +hcl file. See https://github.com/docker/buildx#hcl-variables-and-functions

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
The configuration used for the bake (files merged + override with
+the arguments used in the function). It's the loaded json you would
+obtain by running `docker buildx bake --print --load my_target` if
+your command was `docker buildx bake --load my_target`. Some example here.
+
+
from python_on_whales import docker
+
+# returns the config used and runs the builds
+config = docker.buildx.bake(["my_target1", "my_target2"], load=True)
+assert config == {
+    "target": {
+        "my_target1": {
+            "context": "./",
+            "dockerfile": "Dockerfile",
+            "tags": ["pretty_image1:1.0.0"],
+            "target": "out1",
+            "output": ["type=docker"]
+        },
+        "my_target2": {
+            "context": "./",
+            "dockerfile": "Dockerfile",
+            "tags": ["pretty_image2:1.0.0"],
+            "target": "out2",
+            "output": ["type=docker"]
+        }
+    }
+}
+
+# returns the config only, doesn't run the builds
+config = docker.buildx.bake(["my_target1", "my_target2"], load=True, print=True)
+
+ +
+ +
+ +
+ + +

+ build + + +

+
build(
+    context_path,
+    add_hosts={},
+    allow=[],
+    attest=None,
+    build_args={},
+    build_contexts={},
+    builder=None,
+    cache=True,
+    cache_from=None,
+    cache_to=None,
+    file=None,
+    labels={},
+    load=False,
+    network=None,
+    output={},
+    platforms=None,
+    progress="auto",
+    provenance=None,
+    pull=False,
+    push=False,
+    sbom=None,
+    secrets=[],
+    ssh=None,
+    tags=[],
+    target=None,
+    stream_logs=False,
+)
+
+ +
+ +

Build a Docker image with builkit as backend.

+

Alias: docker.build(...)

+

A python_on_whales.Image is returned, even when using multiple tags. +That is because it will produce a single image with multiple tags. +If no image is loaded into the Docker daemon (if push=True for ex), +then None is returned.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
context_path +
+

The path of the build context.

+
+

+ + TYPE: + ValidPath + +

+
add_hosts +
+

Hosts to add. add_hosts={"my_host1": "192.168.32.35"}

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
allow +
+

List of extra privileges. +Eg allow=["network.host", "security.insecure"]

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
attest +
+

Attestation parameters. Eg attest={"type": "sbom", "generator": "my_image"}

+
+

+ + TYPE: + Optional[Dict[str, str]] + + + DEFAULT: + None + +

+
build_args +
+

The build arguments. +ex build_args={"PY_VERSION": "3.7.8", "UBUNTU_VERSION": "20.04"}.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
build_contexts +
+

Additional build contexts. +build_contexts={[name]: [value], ...} +Supports local directories, git repositories, HTTP URL to a tarball, a docker +image defined with a docker-image:// prefix, and the oci-layout:// protocol. +ex build_contexts={"project2": "../path/to/project2/src", "qumu-src": "https://github.com/qemu/qemu.git"}.

+
+

+ + TYPE: + Dict[str, Union[str, ValidPath]] + + + DEFAULT: + {} + +

+
builder +
+

Specify which builder to use.

+
+

+ + TYPE: + Optional[ValidBuilder] + + + DEFAULT: + None + +

+
cache +
+

Whether or not to use the cache

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
cache_from +
+

Works only with the container driver. Loads the cache +(if needed) from a registry cache_from="user/app:cache" or +a directory on the client cache_from="type=local,src=path/to/dir". +It's also possible to use a dict or list of dict form for this +argument. e.g. +cache_from=dict(type="local", src="path/to/dir")

+
+

+ + TYPE: + Union[str, Dict[str, str], List[Dict[str, str]], None] + + + DEFAULT: + None + +

+
cache_to +
+

Works only with the container driver. Sends the resulting +docker cache either to a registry cache_to="user/app:cache", +or to a local directory cache_to="type=local,dest=path/to/dir". +It's also possible to use a dict form for this argument. e.g. +cache_to=dict(type="local", dest="path/to/dir", mode="max")

+
+

+ + TYPE: + Union[str, Dict[str, str], None] + + + DEFAULT: + None + +

+
file +
+

The path of the Dockerfile

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
labels +
+

Dict of labels to add to the image. +labels={"very-secure": "1", "needs-gpu": "0"} for example.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
load +
+

Shortcut for output=dict(type="docker") If True, +docker.buildx.build will return a python_on_whales.Image.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
network +
+

which network to use when building the Docker image

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
output +
+

Output destination +(format: output={"type": "local", "dest": "path"} +Possible output types are +["local", "tar", "oci", "docker", "image", "registry"]. +See this link +for more details about each exporter.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
platforms +
+

List of target platforms when building the image. Ex: +platforms=["linux/amd64", "linux/arm64"]

+
+

+ + TYPE: + Optional[List[str]] + + + DEFAULT: + None + +

+
progress +
+

Set type of progress output (auto, plain, tty, or False). +Use plain to keep the container output on screen

+
+

+ + TYPE: + Literal['auto', 'plain', 'tty', False] + + + DEFAULT: + 'auto' + +

+
provenance +
+

Shortand for attest={"type": "provenance"}. +Eg provenance=True or provenance=dict(mode="max"). provenance=False might be needed +if you are having the +issue Default image output from buildx v0.10 cannot run on Google Cloud Run or AWS Lambda

+
+

+ + TYPE: + Union[bool, Dict[str, str], None] + + + DEFAULT: + None + +

+
pull +
+

Always attempt to pull a newer version of the image

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
push +
+

Shorthand for output=dict(type="registry").

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
sbom +
+

Shorthand for attest={"type": "sbom"}. Eg sbom=True.

+
+

+ + TYPE: + Union[bool, Dict[str, str], None] + + + DEFAULT: + None + +

+
secrets +
+

One or more secrets passed as string(s). For example +secrets="id=aws,src=/home/my_user/.aws/credentials"

+
+

+ + TYPE: + Union[str, List[str]] + + + DEFAULT: + [] + +

+
ssh +
+

SSH agent socket or keys to expose to the build +(format is default|<id>[=<socket>|<key>[,<key>]] as a string)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
tags +
+

Tag or tags to put on the resulting image.

+
+

+ + TYPE: + Union[str, List[str]] + + + DEFAULT: + [] + +

+
target +
+

Set the target build stage to build.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
stream_logs +
+

If True this function will return an iterator of strings. +You can then read the logs as they arrive.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
A `python_on_whales.Image` if a Docker image is loaded
+in the daemon after the build (the default behavior when
+calling `docker.build(...)`). Otherwise, `None`.
+
+ +
+ +
+ +
+ + +

+ create + + +

+
create(
+    context_or_endpoint=None,
+    buildkitd_flags=None,
+    config=None,
+    platforms=None,
+    driver=None,
+    driver_options={},
+    name=None,
+    use=False,
+)
+
+ +
+ +

Create a new builder instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
context_or_endpoint +
+ +
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
buildkitd_flags +
+

Flags for buildkitd daemon

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
config +
+

BuildKit config file

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
platforms +
+

Comma-separated list of platforms of the form OS/architecture/variant. Ex: +platforms=["linux/amd64", "linux/arm64"]

+
+

+ + TYPE: + Optional[List[str]] + + + DEFAULT: + None + +

+
driver +
+

Driver to use (available: [kubernetes docker docker-container])

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
driver_options +
+

Options for the driver. +e.g driver_options=dict(network="host")

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
name +
+

Builder instance name

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
use +
+

Set the current builder instance to this builder

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
A `python_on_whales.Builder` object.
+
+ +
+ +
+ +
+ + +

+ disk_usage + + +

+
disk_usage()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x=None)
+
+ +
+ +

Returns a builder instance from the name.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

If None (the default), returns the current builder. If a string is provided, +the builder that has this name is returned.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+

Returns

+
A `python_on_whales.Builder` object.
+
+ +
+ +
+ +
+ + +

+ is_installed + + +

+
is_installed()
+
+ +
+ +

Returns True if docker buildx is installed and working.

+

If it's not installed, head +to the installation page +and follow the instructions.

+ +
+ +
+ +
+ + +

+ list + + +

+
list()
+
+ +
+ +

Returns the list of python_on_whales.Builder available.

+ +
+ +
+ +
+ + +

+ prune + + +

+
prune(all=False, filters={}, stream_logs=False)
+
+ +
+ +

Remove build cache on the current builder.

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
all +
+

Remove all cache, not just dangling layers

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
filters +
+

Filters to use, for example filters=dict(until="24h")

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
stream_logs +
+

If True this function will return an iterator of strings. +You can then read the logs as they arrive. If False (the default value), then +the function returns None, but when it returns, then the prune operation has already been +done.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(builder)
+
+ +
+ +

Remove a builder

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
builder +
+

The builder to remove

+
+

+ + TYPE: + Union[Builder, str] + +

+
+ +
+ +
+ +
+ + +

+ stop + + +

+
stop(builder)
+
+ +
+ +

Stop the builder instance

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
builder +
+

The builder to stop. If None (the default value), +the current builder is stopped.

+
+

+ + TYPE: + Optional[ValidBuilder] + +

+
+ +
+ +
+ +
+ + +

+ use + + +

+
use(builder, default=False, global_=False)
+
+ +
+ +

Set the current builder instance

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
builder +
+

The builder to use

+
+

+ + TYPE: + Union[Builder, str] + +

+
default +
+

Set builder as default for the current context

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
global_ +
+

Builder will be used even when changing contexts

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ version + + +

+
version()
+
+ +
+ +

Returns the docker buildx version as a string.

+
from python_on_whales import docker
+
+version = docker.buildx.version()
+print(version)
+# "github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2"
+
+ +
+ +
+ + + +
+ +
+ +
+ +
+ + + +

+ ImagetoolsCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(
+    sources=[],
+    tags=[],
+    append=False,
+    files=[],
+    dry_run=False,
+    builder=None,
+)
+
+ +
+ +

Create a new manifest list based on source manifests. +The source manifests can be manifest lists or single platform distribution manifests and +must already exist in the registry where the new manifest is created. +If only one source is specified, create performs a carbon copy.

+

The CLI docs is here +and it contains a lot more information.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
sources +
+

The sources manifest to create, change

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
append +
+

Append to existing manifest

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
dry_run +
+

Show final image instead of pushing

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
files +
+

Read source descriptor from file

+
+

+ + TYPE: + List[Union[str, Path]] + + + DEFAULT: + [] + +

+
builder +
+

The builder to use.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(name)
+
+ +
+ +

Returns the manifest of a Docker image in a registry without pulling it

+ +
+ +
+ + + +
+ +
+ +

Notes about the transition between the legacy builder and buildx

+

Users are encouraged to use buildx in Python-on-whales through the +docker.build() function.

+

Buildx is the next gen Docker builder and a transition is underway to make +the docker build shell command use buildx. Python-on-whales has had an opinionated +answer on the matter as docker.build() will always use buildx. This is because Python-on-whales was created +during the transition and doesn't have an existing user codebase to support.

+

The legacy builder is still available by calling docker.legacy_build(), but note that

+
    +
  • It won't work if you use Docker 22.06 or above
  • +
  • It won't work if you used docker.buildx.install() or docker buildx install previously
  • +
  • It won't work if you had set the environment variable DOCKER_BUILDKIT to 1
  • +
+

Some resources on the matter:

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/compose/index.html b/sub-commands/compose/index.html new file mode 100644 index 00000000..db4d0b97 --- /dev/null +++ b/sub-commands/compose/index.html @@ -0,0 +1,4201 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker compose - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Some notes about the compose functions

+

Behind the scenes, +the Go implementation of Docker compose +is called a.k.a. Compose v2, not the Python implementation.

+

You can verify that docker compose is installed by running

+
docker compose --help
+
+

Be careful! it's different from docker-compose --help! Notice the - between 'docker' and 'compose'. +Compose v2 has no - in the command.

+

If that doesn't work, then install the cli plugin. +it's just a single binary to download.

+

The Go implementation of compose is still experimental, so take the appropriate precautions.

+

If you don't need to set any project-wide options, like the project name or +the compose file path, you can just import docker and start working.

+
from python_on_whales import docker
+
+docker.compose.build()
+docker.compose.up()
+...
+docker.compose.down()
+
+

Otherwise, you have to define your project-wide options only once, when creating the Docker client.

+
from python_on_whales import DockerClient
+
+docker = DockerClient(compose_files=["./my-compose-file.yml"])
+
+docker.compose.build()
+docker.compose.up()
+...
+docker.compose.down()
+
+

You have multiple compose options available (like profiles, env_files, project name) when creating the Docker client. You can check them out +in the DockerClient documentation.

+

About docker.compose.images().

+

The Docker command line has a docker compose images command. Python-on-whales doesn't have +an equivalent because it's trivial to do so with existing functions.

+
images = [docker.image.inspect(container.image) for container in docker.compose.ps()]
+
+
    +
  • docker.compose.ps() returns the list of all containers in the compose stack.
  • +
  • container.image gives you the id of the Docker image of the container as a str.
  • +
  • docker.image.inspect() gives you a python_on_whales.Image from a str.
  • +
+ + +
+ + + +

+ ComposeCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ build + + +

+
build(
+    services=None,
+    build_args={},
+    cache=True,
+    progress=None,
+    pull=False,
+    quiet=False,
+    ssh=None,
+    stream_logs=False,
+)
+
+ +
+ +

Build services declared in a yaml compose file.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The services to build (as list of strings). +If None (default), all services are built. +An empty list means that nothing will be built.

+
+

+ + TYPE: + Union[List[str], str, None] + + + DEFAULT: + None + +

+
build_args +
+

Set build-time variables for services. For example + build_args={"PY_VERSION": "3.7.8", "UBUNTU_VERSION": "20.04"}.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
cache +
+

Set to False if you don't want to use the cache to build your images

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
progress +
+

Set type of progress output (auto, tty, plain, quiet) (default "auto")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
pull +
+

Set to True to always attempt to pull a newer version of the +image (in the FROM statements for example).

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
quiet +
+

Don't print anything

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
ssh +
+

Set SSH authentications used when building service images. +(use 'default' for using your default SSH Agent)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
stream_logs +
+

If False this function returns None. If True, this +function returns an Iterable of Tuple[str, bytes] where the first element +is the type of log ("stdin" or "stdout"). The second element is the log itself, +as bytes, you'll need to call .decode() if you want the logs as str. +See the streaming guide if you are +not familiar with the streaming of logs in Python-on-whales.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ config + + +

+
config(return_json=False)
+
+ +
+ +

Returns the configuration of the compose stack for further inspection.

+

For example

+
from python_on_whales import docker
+project_config = docker.compose.config()
+print(project_config.services["my_first_service"].image)
+"redis"
+
+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
return_json +
+

If False, a ComposeConfig object will be returned, and you +'ll be able to take advantage of your IDE autocompletion. If you want the +full json output, you may use return_json. In this case, you'll get +lists and dicts corresponding to the json response, unmodified. +It may be useful if you just want to print the config or want to access +a field that was not in the ComposeConfig class.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
A `ComposeConfig` object if `return_json` is `False`, and a `dict` otherwise.
+
+ +
+ +
+ +
+ + +

+ create + + +

+
create(
+    services=None,
+    build=False,
+    force_recreate=False,
+    no_build=False,
+    no_recreate=False,
+    stream_logs=False,
+)
+
+ +
+ +

Creates containers for a service.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The name of the services for which the containers will +be created. The default None means that the containers for all +services will be created. A single string means we will create the +container for a single service. A list of string means we will create +the containers for each service in the list. An empty list means nothing +will be created, the function call is then a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
build +
+

Build images before starting containers.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
force_recreate +
+

Recreate containers even if their configuration and +image haven't changed.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
no_build +
+

Don't build an image, even if it's missing.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
no_recreate +
+

If containers already exist, don't recreate them. +Incompatible with force_recreate=True.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
stream_logs +
+

If False this function returns None. If True, this +function returns an Iterable of Tuple[str, bytes] where the first element +is the type of log ("stdin" or "stdout"). The second element is the log itself, +as bytes, you'll need to call .decode() if you want the logs as str. +See the streaming guide if you are +not familiar with the streaming of logs in Python-on-whales.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ down + + +

+
down(
+    services=None,
+    remove_orphans=False,
+    remove_images=None,
+    timeout=None,
+    volumes=False,
+    quiet=False,
+    stream_logs=False,
+)
+
+ +
+ +

Stops and removes the containers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The services to stop. If None (default), all services are +stopped. If an empty list is provided, the function call does nothing, it's +a no-op.

+
+

+ + TYPE: + Union[List[str], str, None] + + + DEFAULT: + None + +

+
remove_orphans +
+

Remove containers for services not defined in +the Compose file.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
remove_images +
+

Remove images used by services. +"local" remove only images that don't have a custom +tag. Possible values are "local" and "all".

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
timeout +
+

Specify a shutdown timeout in seconds (default 10).

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
volumes +
+

Remove named volumes declared in the +volumes section of the Compose file and anonymous +volumes attached to containers.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
quiet +
+

If False, send to stderr and stdout the progress spinners with +the messages. If True, do not display anything.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ execute + + +

+
execute(
+    service,
+    command,
+    detach=False,
+    envs={},
+    index=1,
+    tty=True,
+    privileged=False,
+    user=None,
+    workdir=None,
+)
+
+ +
+ +

Execute a command in a running container.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
service +
+

The name of the service.

+
+

+ + TYPE: + str + +

+
command +
+

The command to execute.

+
+

+ + TYPE: + List[str] + +

+
detach +
+

If True, detach from the container after the command exits. In this case, + nothing is returned by the function. By default, the execute command returns only when the + command has finished running, and the function will raise an exception DockerException if the command + exits with a non-zero exit code. If False, the command is executed and the stdout is returned.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
envs +
+

A dictionary of environment variables to set in the container.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
index +
+

The index of the container to execute the command in (default 1) if there are multiple containers for this service.

+
+

+ + TYPE: + int + + + DEFAULT: + 1 + +

+
tty +
+

If True, allocate a pseudo-TTY. Use False to get the output of the command.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
privileged +
+

If True, run the command in privileged mode.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
user +
+

The username to use inside the container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
workdir +
+

The working directory inside the container.

+
+

+ + TYPE: + Union[str, Path, None] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ is_installed + + +

+
is_installed()
+
+ +
+ +

Returns True if docker compose (the one written in Go) +is installed and working.

+ +
+ +
+ +
+ + +

+ kill + + +

+
kill(services=None, signal=None)
+
+ +
+ +

Kills the container(s) of a service

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

One or more service(s) to kill. The default (None) is to kill all services. +A string means the call will kill one single service. A list of service names can +be provided to kill multiple services in one function call. +An empty list means that no services are going to be killed, the function is then +a no-op.

+
+

+ + TYPE: + Union[str, List[str]] + + + DEFAULT: + None + +

+
signal +
+

the signal to send to the container. Default is "SIGKILL"

+
+

+ + TYPE: + Optional[Union[int, str]] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ logs + + +

+
logs(
+    services=[],
+    tail=None,
+    follow=False,
+    no_log_prefix=False,
+    timestamps=False,
+    since=None,
+    until=None,
+    stream=False,
+)
+
+ +
+ +

View output from containers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

One or more service(s) to view

+
+

+ + TYPE: + Union[str, List[str]] + + + DEFAULT: + [] + +

+
tail +
+

Number of lines to show from the end of the logs for each container. (default "all")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
follow +
+

Follow log output WARNING: With this +option, docker.compose.logs() will not return at all. Use it exclusively with +stream=True. You can loop on the logs but the loop will never end.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
no_log_prefix +
+

Don't print prefix in logs

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
timestamps +
+

Show timestamps

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
since +
+

Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
until +
+

Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
stream +
+

Similar to the stream argument of docker.run(). +This function will then return and iterator that will yield a +tuple (source, content) with source being "stderr" or +"stdout". content is the content of the line as bytes. +Take a look at the user guide +to have an example of the output.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`
+if `stream=True`.
+
+ +
+ +
+ +
+ + +

+ ls + + +

+
ls(all=False, filters={})
+
+ +
+ +

Returns a list of docker compose projects

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
all +
+

Results include all stopped compose projects.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
filters +
+

Filter results based on conditions provided.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
A `List[python_on_whales.ComposeProject]`
+
+ +
+ +
+ +
+ + +

+ pause + + +

+
pause(services=None)
+
+ +
+ +

Pause one or more services

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

None (the default) means pause all containers of all +compose services. A string means that the call will pause the container +of a specific service. A list of string means the call will pause +the containers of all the services specified. So if an empty list +is provided, then this function call is a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ port + + +

+
port(service, private_port, index=1, protocol='tcp')
+
+ +
+ +

Returns the public port for a port binding.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
service +
+

The name of the service.

+
+

+ + TYPE: + str + +

+
private_port +
+

The private port.

+
+

+ + TYPE: + Union[str, int] + +

+
index +
+

Index of the container if service has multiple replicas (default 1)

+
+

+ + TYPE: + int + + + DEFAULT: + 1 + +

+
protocol +
+

tcp or udp (default "tcp").

+
+

+ + TYPE: + str + + + DEFAULT: + 'tcp' + +

+
+

Returns

+
tuple with (host, port). If port is unknown, then host and port are None.
+
+ +
+ +
+ +
+ + +

+ ps + + +

+
ps(services=None, all=False)
+
+ +
+ +

Returns the containers that were created by the current project.

+

Returns

+
A `List[python_on_whales.Container]`
+
+ +
+ +
+ +
+ + +

+ pull + + +

+
pull(
+    services=None,
+    ignore_pull_failures=False,
+    include_deps=False,
+    quiet=False,
+    stream_logs=False,
+)
+
+ +
+ +

Pull service images

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The list of services to select. Only the images of those +services will be pulled. If no services are specified (None) (the default +behavior) all images of all services are pulled. +If an empty list is provided, then the function call is a no-op.

+
+

+ + TYPE: + Union[List[str], str, None] + + + DEFAULT: + None + +

+
ignore_pull_failures +
+

Pull what it can and ignores images with pull failures

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
include_deps +
+

Also pull services declared as dependencies

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
quiet +
+

By default, the progress bars are printed in stdout and stderr (both). +To disable all output, use quiet=True

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
stream_logs +
+

If False this function returns None. If True, this +function returns an Iterable of Tuple[str, bytes] where the first element +is the type of log ("stdin" or "stdout"). The second element is the log itself, +as bytes, you'll need to call .decode() if you want the logs as str. +See the streaming guide if you are +not familiar with the streaming of logs in Python-on-whales.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ push + + +

+
push(services=None)
+
+ +
+ +

Push service images

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The list of services to select. Only the images of those +services will be pushed. If no services are specified (None, the default +behavior) all images of all services are pushed. +If an empty list is provided, then the function call is a no-op.

+
+

+ + TYPE: + Optional[List[str]] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ restart + + +

+
restart(services=None, timeout=None)
+
+ +
+ +

Restart containers

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The names of one or more services to restart (str or list of str). +If the argument is not specified, services is None and all services are restarted. +If services is an empty list, then the function call is a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
timeout +
+

The shutdown timeout (int are interpreted as seconds). +None means the CLI default value (10s). +See the docker stop docs +for more details about this argument.

+
+

+ + TYPE: + Union[int, timedelta, None] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ rm + + +

+
rm(services=None, stop=False, volumes=False)
+
+ +
+ +

Removes stopped service containers

+

By default, anonymous volumes attached to containers will not be removed. You +can override this with volumes=True.

+

Any data which is not in a volume will be lost.

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The names of one or more services to remove (str or list of str). +If None (the default) then all services are removed. +If an empty list is provided, this function call is a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
stop +
+

Stop the containers, if required, before removing

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
volumes +
+

Remove any anonymous volumes attached to containers

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ run + + +

+
run(
+    service,
+    command=[],
+    build=False,
+    detach=False,
+    labels={},
+    name=None,
+    tty=True,
+    stream=False,
+    dependencies=True,
+    publish=[],
+    remove=False,
+    service_ports=False,
+    use_aliases=False,
+    user=None,
+    workdir=None,
+)
+
+ +
+ +

Run a one-off command on a service.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
service +
+

The name of the service.

+
+

+ + TYPE: + str + +

+
command +
+

The command to execute.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
detach +
+

if True, returns immediately with the Container. + If False, returns the command stdout as string.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
labels +
+

Add or override labels

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
name +
+

Assign a name to the container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
dependencies +
+

Also start linked services.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
publish +
+

Publish a container's port(s) to the host.

+
+

+ + TYPE: + List[ValidPortMapping] + + + DEFAULT: + [] + +

+
service_ports +
+

Enable service's ports and map them to the host.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
remove +
+

Automatically remove the container when it exits.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
use_aliases +
+

Use the service's network aliases in the connected network(s).

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
tty +
+

Allocate a pseudo-TTY. Allow the process to access your terminal +to write on it.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
stream +
+

Similar to docker.run(..., stream=True).

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
user +
+

Username or UID, format: "<name|uid>[:<group|gid>]"

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
workdir +
+

Working directory inside the container

+
+

+ + TYPE: + Union[None, str, Path] + + + DEFAULT: + None + +

+
+ + + + + + + + + + + + + + + +
RETURNSDESCRIPTION
+ + Union[str, Container, Iterable[Tuple[str, bytes]]] + + +
+

Optional[str]

+
+
+ +
+ +
+ +
+ + +

+ start + + +

+
start(services=None, stream_logs=False)
+
+ +
+ +

Start the specified services.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The names of one or more services to start. +If None (the default), it means all services will start. +If an empty list is provided, this function call is a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
stream_logs +
+

If False this function returns None. If True, this +function returns an Iterable of Tuple[str, bytes] where the first element +is the type of log ("stdin" or "stdout"). The second element is the log itself, +as bytes, you'll need to call .decode() if you want the logs as str. +See the streaming guide if you are +not familiar with the streaming of logs in Python-on-whales.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ stop + + +

+
stop(services=None, timeout=None, stream_logs=False)
+
+ +
+ +

Stop services

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The names of one or more services to stop (str or list of str). +If None (the default), it means all services will stop. +If an empty list is provided, this function call is a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
timeout +
+

Number of seconds or timedelta (will be converted to seconds). +Specify a shutdown timeout. Default is 10s.

+
+

+ + TYPE: + Union[int, timedelta, None] + + + DEFAULT: + None + +

+
stream_logs +
+

If False this function returns None. If True, this +function returns an Iterable of Tuple[str, bytes] where the first element +is the type of log ("stdin" or "stdout"). The second element is the log itself, +as bytes, you'll need to call .decode() if you want the logs as str. +See the streaming guide if you are +not familiar with the streaming of logs in Python-on-whales.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ top + + +

+
top()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ unpause + + +

+
unpause(services=None)
+
+ +
+ +

Unpause one or more services

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

One or more service to unpause. +If None (the default), all services are unpaused. +If services is an empty list, the function call does nothing, +it's a no-op.

+
+

+ + TYPE: + Union[str, List[str], None] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ up + + +

+
up(
+    services=None,
+    build=False,
+    detach=False,
+    abort_on_container_exit=False,
+    scales={},
+    attach_dependencies=False,
+    force_recreate=False,
+    recreate=True,
+    no_build=False,
+    remove_orphans=False,
+    renew_anon_volumes=False,
+    color=True,
+    log_prefix=True,
+    start=True,
+    quiet=False,
+    wait=False,
+    no_attach_services=None,
+    pull=None,
+    stream_logs=False,
+    wait_timeout=None,
+)
+
+ +
+ +

Start the containers.

+

Reading the logs of the containers is not yet implemented.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

The services to start. If None (default), all services are +started. If an empty list is provided, the function call does nothing, it's +a no-op.

+
+

+ + TYPE: + Union[List[str], str, None] + + + DEFAULT: + None + +

+
build +
+

If True, build the docker images before starting the containers +even if a docker image with this name already exists. +If False (the default), build only the docker images that do not already +exist.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
detach +
+

If True, run the containers in the background. If False this +function returns only when all containers have stopped. +Incompatible with abort_on_container_exit=True.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
abort_on_container_exit +
+

If True stops all containers if any container was +stopped. Incompatible with detach=True.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
scales +
+

Scale SERVICE to NUM instances. Overrides +the scale setting in the Compose file if present. For example: +scales={"my_service": 2, "my_other_service": 5}.

+
+

+ + TYPE: + Dict[str, int] + + + DEFAULT: + {} + +

+
attach_dependencies +
+

Attach to dependent containers.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
force_recreate +
+

Recreate containers even if their configuration and image +haven't changed.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
recreate +
+

Recreate the containers if already exist. +recreate=False and force_recreate=True are incompatible.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
no_build +
+

Don't build an image, even if it's missing.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
remove_orphans +
+

Remove containers for services not defined in the Compose file.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
renew_anon_volumes +
+

Recreate anonymous volumes instead of retrieving +data from the previous containers.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
color +
+

If False, it will produce monochrome output.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
log_prefix +
+

If False, will not display the prefix in the logs.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
start +
+

Start the service after creating them.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
quiet +
+

By default, some progress bars and logs are sent to stderr and stdout. +Set quiet=True to avoid having any output.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
wait +
+

Wait for services to be running|healthy. Implies detached mode.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
no_attach_services +
+

The services not to attach to.

+
+

+ + TYPE: + Union[List[str], str, None] + + + DEFAULT: + None + +

+
pull +
+

Pull image before running (“always”|”missing”|”never”).

+
+

+ + TYPE: + Literal['always', 'missing', 'never', None] + + + DEFAULT: + None + +

+
stream_logs +
+

If False this function returns None. If True, this +function returns an Iterable of Tuple[str, bytes] where the first element +is the type of log ("stdin" or "stdout"). The second element is the log itself, +as bytes, you'll need to call .decode() if you want the logs as str. +See the streaming guide if you are +not familiar with the streaming of logs in Python-on-whales.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
wait_timeout +
+

Maximum duration to wait for the project to be running|healthy

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ version + + +

+
version()
+
+ +
+ +

Returns the version of docker compose as a str.

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/config/index.html b/sub-commands/config/index.html new file mode 100644 index 00000000..a1c032e1 --- /dev/null +++ b/sub-commands/config/index.html @@ -0,0 +1,1361 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker config - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ ConfigCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(name, file, labels={}, template_driver=None)
+
+ +
+ +

Create a config from a file

+

See the docker docs +for more information about swarm configs.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
name +
+

The config name.

+
+

+ + TYPE: + str + +

+
file +
+

Tbe file to be used as config.

+
+

+ + TYPE: + Union[str, Path] + +

+
labels +
+

The labels to add to the config

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
template_driver +
+

The template driver

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+

Returns

+
A `python_on_whales.Config` object.
+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns a python_on_whales.Config object based on its name or id.

+

Argument

+
x: An id or name or a list of ids/names.
+
+

Returns

+
A `python_on_whales.Config` if a string was passed as argument. A
+`List[python_on_whales.Config]` if a list of strings was passed as argument.
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(filters={})
+
+ +
+ +

List all config available in the swarm.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
filters +
+

If you want to filter the results based on a given condition. +For example, docker.config.list(filters=dict(label="my_label=hello")).

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
A `List[python_on_whales.Config]`.
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x)
+
+ +
+ +

Remove one or more configs.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or a list of configs. Valid values are the id of the config or +a python_on_whales.Config object. +An empty list means the function call does nothing.

+
+

+ + TYPE: + Union[ValidConfig, List[ValidConfig]] + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/container/index.html b/sub-commands/container/index.html new file mode 100644 index 00000000..77a57d02 --- /dev/null +++ b/sub-commands/container/index.html @@ -0,0 +1,5599 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker container - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ ContainerCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ attach + + +

+
attach(
+    container, detach_keys=None, stdin=True, sig_proxy=True
+)
+
+ +
+ +

Attach local standard input, output, and error streams to a running container

+

Alias: docker.attach(...)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The running container to attach to

+
+

+ + TYPE: + ValidContainer + +

+
detach_keys +
+

Override the key sequence for detaching a container

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
stdin +
+

Attach STDIN

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
sig_proxy +
+

Proxy all received signals to the process (default true)

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ commit + + +

+
commit(
+    container,
+    tag=None,
+    author=None,
+    message=None,
+    pause=True,
+)
+
+ +
+ +

Create a new image from a container's changes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The container to create the image from

+
+

+ + TYPE: + ValidContainer + +

+
tag +
+

tag to apply on the image produced

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
author +
+

Author (e.g., "John Hannibal Smith hannibal@a-team.com")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
message +
+

Commit message

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
pause +
+

Pause container during commit

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
+ +
+ +
+ +
+ + +

+ copy + + +

+
copy(source, destination)
+
+ +
+ +

Copy files/folders between a container and the local filesystem

+

Alias: docker.copy(...)

+
from python_on_whales import docker
+
+docker.run("ubuntu", ["sleep", "infinity"], name="dodo", remove=True, detach=True)
+
+docker.copy("/tmp/my_local_file.txt", ("dodo", "/path/in/container.txt"))
+docker.copy(("dodo", "/path/in/container.txt"), "/tmp/my_local_file2.txt")
+
+

Doesn't yet support sending or receiving iterators of Python bytes.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
source +
+

Local path or tuple. When using a tuple, the first element +of the tuple is the container, the second element is the path in +the container. ex: source=("my-container", "/usr/bin/something").

+
+

+ + TYPE: + Union[ValidPath, ContainerPath] + +

+
destination +
+

Local path or tuple. When using a tuple, the first element +of the tuple is the container, the second element is the path in +the container. ex: source=("my-container", "/usr/bin/something").

+
+

+ + TYPE: + Union[ValidPath, ContainerPath] + +

+
+ +
+ +
+ +
+ + +

+ create + + +

+
create(
+    image,
+    command=[],
+    *,
+    add_hosts=[],
+    blkio_weight=None,
+    blkio_weight_device=[],
+    cap_add=[],
+    cap_drop=[],
+    cgroup_parent=None,
+    cgroupns=None,
+    cidfile=None,
+    cpu_period=None,
+    cpu_quota=None,
+    cpu_rt_period=None,
+    cpu_rt_runtime=None,
+    cpu_shares=None,
+    cpus=None,
+    cpuset_cpus=None,
+    cpuset_mems=None,
+    detach=False,
+    devices=[],
+    device_cgroup_rules=[],
+    device_read_bps=[],
+    device_read_iops=[],
+    device_write_bps=[],
+    device_write_iops=[],
+    content_trust=False,
+    dns=[],
+    dns_options=[],
+    dns_search=[],
+    domainname=None,
+    entrypoint=None,
+    envs={},
+    env_files=[],
+    env_host=False,
+    expose=[],
+    gpus=None,
+    groups_add=[],
+    healthcheck=True,
+    health_cmd=None,
+    health_interval=None,
+    health_retries=None,
+    health_start_period=None,
+    health_timeout=None,
+    hostname=None,
+    init=False,
+    interactive=False,
+    ip=None,
+    ip6=None,
+    ipc=None,
+    isolation=None,
+    kernel_memory=None,
+    labels={},
+    label_files=[],
+    link=[],
+    link_local_ip=[],
+    log_driver=None,
+    log_options=[],
+    mac_address=None,
+    memory=None,
+    memory_reservation=None,
+    memory_swap=None,
+    memory_swappiness=None,
+    mounts=[],
+    name=None,
+    networks=[],
+    network_aliases=[],
+    oom_kill=True,
+    oom_score_adj=None,
+    pid=None,
+    pids_limit=None,
+    platform=None,
+    pod=None,
+    privileged=False,
+    publish=[],
+    publish_all=False,
+    pull="missing",
+    read_only=False,
+    restart=None,
+    remove=False,
+    runtime=None,
+    security_options=[],
+    shm_size=None,
+    sig_proxy=True,
+    stop_signal=None,
+    stop_timeout=None,
+    storage_options=[],
+    sysctl={},
+    systemd=None,
+    tmpfs=[],
+    tty=False,
+    tz=None,
+    ulimit=[],
+    user=None,
+    userns=None,
+    uts=None,
+    volumes=[],
+    volume_driver=None,
+    volumes_from=[],
+    workdir=None
+)
+
+ +
+ +

Creates a container, but does not start it.

+

Alias: docker.create(...)

+

Start it then with the .start() method.

+

It might be useful if you want to delay the start of a container, +to do some preparations beforehand. For example, it's common to do this +workflow: docker create -> docker cp -> docker start to put files +in the container before starting.

+

There is no detach argument since it's a runtime option.

+

The arguments are the same as docker.run.

+ +
+ +
+ +
+ + +

+ diff + + +

+
diff(container)
+
+ +
+ +

List all the files modified, added or deleted since the container started.

+

Alias: docker.diff(...)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The container to inspect

+
+

+ + TYPE: + ValidContainer + +

+
+

Returns

+
`Dict[str, str]` Something like
+`{"/some_path": "A", "/some_file": "M", "/tmp": "D"}` for example.
+
+ +
+ +
+ +
+ + +

+ execute + + +

+
execute(
+    container,
+    command,
+    detach=False,
+    envs={},
+    env_files=[],
+    interactive=False,
+    privileged=False,
+    tty=False,
+    user=None,
+    workdir=None,
+    stream=False,
+    detach_keys=None,
+    preserve_fds=None,
+)
+
+ +
+ +

Execute a command inside a container

+

Alias: docker.execute(...)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The container to execute the command in.

+
+

+ + TYPE: + ValidContainer + +

+
command +
+

The command to execute.

+
+

+ + TYPE: + List[str] + +

+
detach +
+

if True, returns immediately with None. If False, +returns the command stdout as string.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
envs +
+

Set environment variables

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
env_files +
+

Read one or more files of environment variables

+
+

+ + TYPE: + Union[ValidPath, List[ValidPath]] + + + DEFAULT: + [] + +

+
interactive +
+

Leave stdin open during the duration of the process +to allow communication with the parent process. +Currently only works with tty=True for interactive use +on the terminal.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
preserve_fds +
+

The number of additional file descriptors to pass +through to the container. Only supported by podman.

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
privileged +
+

Give extended privileges to the container.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
tty +
+

Allocate a pseudo-TTY. Allow the process to access your terminal +to write on it.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
user +
+

Username or UID, format: "<name|uid>[:<group|gid>]"

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
workdir +
+

Working directory inside the container

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
stream +
+

Similar to docker.run(..., stream=True).

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
detach_keys +
+

Override the key sequence for detaching a container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ + + + + + + + + + + + + + + +
RETURNSDESCRIPTION
+ + Union[None, str, Iterable[Tuple[str, bytes]]] + + +
+

Optional[str]

+
+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ exists + + +

+
exists(x)
+
+ +
+ +

Returns True if the container exists. False otherwise.

+

It's just calling docker.container.inspect(...) and verifies that it doesn't throw + a python_on_whales.exceptions.NoSuchContainer.

+

Returns

+
A `bool`
+
+ +
+ +
+ +
+ + +

+ export + + +

+
export(container, output)
+
+ +
+ +

Export a container's filesystem as a tar archive

+

Alias: docker.export(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The container to export.

+
+

+ + TYPE: + ValidContainer + +

+
output +
+

The path of the output tar archive. Returning a generator of bytes +is not yet implemented.

+
+

+ + TYPE: + ValidPath + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns a container object from a name or ID.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

A container name or ID, or a list of container names +and/or IDs

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
+ + + + + + + + + + + + + + + + + + + +
RETURNSDESCRIPTION
+ + Union[Container, List[Container]] + + +
+

A python_on_whales.Container object or a list of those

+
+
+ + Union[Container, List[Container]] + + +
+

if a list of IDs was passed as input.

+
+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ kill + + +

+
kill(containers, signal=None)
+
+ +
+ +

Kill one or more containers.

+

Alias: docker.kill(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
containers +
+

One or more containers to kill

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
signal +
+

The signal to send the container

+
+

+ + TYPE: + Optional[Union[int, str]] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if any of the
+containers do not exist.
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(all=False, filters={})
+
+ +
+ +

List the containers on the host.

+

Alias: docker.ps(...)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
all +
+

If True, also returns containers that are not running.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
A `List[python_on_whales.Container]`
+
+ +
+ +
+ +
+ + +

+ logs + + +

+
logs(
+    container,
+    *,
+    details=False,
+    since=None,
+    tail=None,
+    timestamps=False,
+    until=None,
+    follow=False,
+    stream=False
+)
+
+ +
+ +

Returns the logs of a container as a string or an iterator.

+

Alias: docker.logs(...)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The container to get the logs of

+
+

+ + TYPE: + ValidContainer + +

+
details +
+

Show extra details provided to logs

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
since +
+

Use a datetime or timedelta to specify the lower +date limit for the logs.

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
tail +
+

Number of lines to show from the end of the logs (default all)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
timestamps +
+

Put timestamps next to lines.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
until +
+

Use a datetime or a timedelta to specify the upper date +limit for the logs.

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
follow +
+

If False (the default), the logs returned are the logs up to the time +of the function call. If True, the logs of the container up to the time the +container stopped are displayed. Which means that if the container isn't stopped +yet, the function will continue until the container is stopped. +Which is why it is advised to use the stream option if you use the follow option. +Without stream, only a str will be returned, possibly much later in the +future. With stream, you'll be able to read the logs in real time.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
stream +
+

Similar to the stream argument of docker.run. +This function will then return an iterator that will yield a +tuple (source, content) with source being "stderr" or +"stdout". content is the content of the line as bytes. +Take a look at the user guide +to have an example of the output.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`
+if `stream=True`.
+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exist.
+
+

If you are a bit confused about follow and stream, here are some use cases.

+
    +
  • If you want to have the logs up to this point as a str, don't use those args.
  • +
  • If you want to stream the output in real time, use follow=True, stream=True
  • +
  • If you want the logs up to this point, but you don't want to fit all the logs +in memory because they are too big, use stream=True.
  • +
+ +
+ +
+ +
+ + +

+ pause + + +

+
pause(containers)
+
+ +
+ +

Pauses one or more containers

+

Alias: docker.pause(...)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
containers +
+

One or more containers to pause

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ prune + + +

+
prune(filters={}, stream_logs=False)
+
+ +
+ +

Remove containers that are not running.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
filters +
+

Filters as strings or list of strings

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
stream_logs +
+

If True this function will return an iterator of strings. +You can then read the logs as they arrive. If False (the default value), then +the function returns None, but when it returns, then the prune operation has already been +done.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(containers, *, force=False, volumes=False)
+
+ +
+ +

Removes a container

+

Alias: docker.remove(...)

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
containers +
+

One or more containers.

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
force +
+

Force the removal of a running container (uses SIGKILL)

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
volumes +
+

Remove anonymous volumes associated with the container

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ rename + + +

+
rename(container, new_name)
+
+ +
+ +

Changes the name of a container.

+

Alias: docker.rename(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
container +
+

The container to rename

+
+

+ + TYPE: + ValidContainer + +

+
new_name +
+

The new name of the container.

+
+

+ + TYPE: + str + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exist.
+
+ +
+ +
+ +
+ + +

+ restart + + +

+
restart(containers, time=None)
+
+ +
+ +

Restarts one or more container.

+

Alias: docker.restart(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
containers +
+

One or more containers to restart

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
time +
+

Amount of to wait for stop before killing the container (default 10s). +If int, the unit is seconds.

+
+

+ + TYPE: + Optional[Union[int, timedelta]] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ run + + +

+
run(
+    image,
+    command=[],
+    *,
+    add_hosts=[],
+    blkio_weight=None,
+    blkio_weight_device=[],
+    cap_add=[],
+    cap_drop=[],
+    cgroup_parent=None,
+    cgroupns=None,
+    cidfile=None,
+    cpu_period=None,
+    cpu_quota=None,
+    cpu_rt_period=None,
+    cpu_rt_runtime=None,
+    cpu_shares=None,
+    cpus=None,
+    cpuset_cpus=None,
+    cpuset_mems=None,
+    detach=False,
+    devices=[],
+    device_cgroup_rules=[],
+    device_read_bps=[],
+    device_read_iops=[],
+    device_write_bps=[],
+    device_write_iops=[],
+    content_trust=False,
+    dns=[],
+    dns_options=[],
+    dns_search=[],
+    domainname=None,
+    entrypoint=None,
+    envs={},
+    env_files=[],
+    env_host=False,
+    expose=[],
+    gpus=None,
+    groups_add=[],
+    healthcheck=True,
+    health_cmd=None,
+    health_interval=None,
+    health_retries=None,
+    health_start_period=None,
+    health_timeout=None,
+    hostname=None,
+    init=False,
+    interactive=False,
+    ip=None,
+    ip6=None,
+    ipc=None,
+    isolation=None,
+    kernel_memory=None,
+    labels={},
+    label_files=[],
+    link=[],
+    link_local_ip=[],
+    log_driver=None,
+    log_options=[],
+    mac_address=None,
+    memory=None,
+    memory_reservation=None,
+    memory_swap=None,
+    memory_swappiness=None,
+    mounts=[],
+    name=None,
+    networks=[],
+    network_aliases=[],
+    oom_kill=True,
+    oom_score_adj=None,
+    pid=None,
+    pids_limit=None,
+    platform=None,
+    pod=None,
+    preserve_fds=None,
+    privileged=False,
+    publish=[],
+    publish_all=False,
+    pull="missing",
+    read_only=False,
+    restart=None,
+    remove=False,
+    runtime=None,
+    security_options=[],
+    shm_size=None,
+    sig_proxy=True,
+    stop_signal=None,
+    stop_timeout=None,
+    storage_options=[],
+    stream=False,
+    sysctl={},
+    systemd=None,
+    tmpfs=[],
+    tty=False,
+    tz=None,
+    ulimit=[],
+    user=None,
+    userns=None,
+    uts=None,
+    volumes=[],
+    volume_driver=None,
+    volumes_from=[],
+    workdir=None
+)
+
+ +
+ +

Runs a container

+

You can use docker.run or docker.container.run to call this function.

+

For a deeper dive into the arguments and what they do, visit +https://docs.docker.com/engine/reference/run/

+

If you want to know exactly how to call docker.run() depending on your +use case (detach, stream...), take a look at +the docker.run() guide.

+
>>> from python_on_whales import docker
+>>> returned_string = docker.run("hello-world")
+>>> print(returned_string)
+
+Hello from Docker!
+This message shows that your installation appears to be working correctly.
+
+To generate this message, Docker took the following steps:
+ 1. The Docker client contacted the Docker daemon.
+ 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
+    (amd64)
+ 3. The Docker daemon created a new container from that image which runs the
+    executable that produces the output you are currently reading.
+ 4. The Docker daemon streamed that output to the Docker client, which sent it
+    to your terminal.
+
+To try something more ambitious, you can run an Ubuntu container with:
+ $ docker run -it ubuntu bash
+
+Share images, automate workflows, and more with a free Docker ID:
+ https://hub.docker.com/
+
+For more examples and ideas, visit:
+ https://docs.docker.com/get-started/
+
+
>>> from python_on_whales import docker
+>>> result_string = docker.run("ubuntu", ["ls", "/host"], volumes=[("/", "/host", "ro")])
+>>> print(result_string)
+bin
+boot
+dev
+etc
+home
+init
+lib
+lib64
+lost+found
+media
+mnt
+opt
+proc
+projects
+root
+run
+sbin
+snap
+srv
+sys
+tmp
+usr
+var
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
image +
+

The docker image to use for the container

+
+

+ + TYPE: + ValidImage + +

+
command +
+

List of arguments to provide to the container.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
add_hosts +
+

hosts to add in the format of a tuple. For example, +add_hosts=[("my_host_1", "192.168.30.31"), ("host2", "192.168.80.81")]

+
+

+ + TYPE: + List[Tuple[str, str]] + + + DEFAULT: + [] + +

+
blkio_weight +
+

Block IO (relative weight), between 10 and 1000, +or 0 to disable (default 0)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cgroupns +
+

Cgroup namespace mode to use, one of 'host' or 'private'.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
cpu_period +
+

Limit CPU CFS (Completely Fair Scheduler) period

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_quota +
+

Limit CPU CFS (Completely Fair Scheduler) quota

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_rt_period +
+

Limit CPU real-time period in microseconds

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_rt_runtime +
+

Limit CPU real-time runtime in microseconds

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_shares +
+

CPU shares (relative weight)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpus +
+

The maximal amount of cpu the container can use. +1 means one cpu core.

+
+

+ + TYPE: + Optional[float] + + + DEFAULT: + None + +

+
cpuset_cpus +
+

CPUs in which to allow execution. Must be given as a list.

+
+

+ + TYPE: + Optional[List[int]] + + + DEFAULT: + None + +

+
cpuset_mems +
+

MEMs in which to allow execution. Must be given as a list.

+
+

+ + TYPE: + Optional[List[int]] + + + DEFAULT: + None + +

+
detach +
+

If False, returns the ouput of the container as a string. +If True, returns a python_on_whales.Container object.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
dns_search +
+

Set custom DNS search domains

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
domainname +
+

Container NIS domain name

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
entrypoint +
+

Overwrite the default ENTRYPOINT of the image

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
envs +
+

Environment variables as a dict. +For example: {"OMP_NUM_THREADS": 3}

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
env_files +
+

One or a list of env files.

+
+

+ + TYPE: + Union[ValidPath, List[ValidPath]] + + + DEFAULT: + [] + +

+
env_host +
+

Use host environment inside the container. Only supported +with podman.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
gpus +
+

For this to work, you need the +Nvidia container runtime +The value needed is a str or int. Some examples of valid argument +are "all" or "device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a" or +"device=0,2". If you want 3 gpus, just write gpus=3.

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
hostname +
+

Container host name

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
interactive +
+

Leave stdin open during the duration of the process +to allow communication with the parent process. +Currently only works with tty=True for interactive use +on the terminal.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
ip +
+

IPv4 address (e.g., 172.30.100.104)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
ip6 +
+

IPv6 address (e.g., 2001:db8::33)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
ipc +
+

IPC mode to use

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
isolation +
+

Container isolation technology

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
kernel_memory +
+

Kernel memory limit. int represents the number of bytes, +but you can use "4k" or 2g for example.

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
labels +
+

Set meta data on a container. The labels can be used later when filtering +containers with docker.ps(filters='...'). The labels can also be found on +each container with the attribute my_container.config.labels.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
log_driver +
+

Logging driver for the container

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
mac_address +
+

Container MAC address (e.g., "92:d0:c6:0a:29:33")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
memory +
+

Memory limit, valid values are 1024 (ints are bytes) or +"43m" or "6g".

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
memory_reservation +
+

Memory soft limit

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
memory_swap +
+

Swap limit equal to memory plus swap: '-1' +to enable unlimited swap.

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
memory_swappiness +
+

Tune container memory swappiness (0 to 100) (default -1)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
name +
+

The container name. If not provided, one is automatically genrated for +you.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
healthcheck +
+

Set to False to disable container periodic healthcheck.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
oom_kill +
+

Set to False to disable the OOM killer for this container.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
pid +
+

PID namespace to use

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
pids_limit +
+

Tune container pids limit (set -1 for unlimited)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
platform +
+

Set platform if server is multi-platform capable.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
pod +
+

Create the container in an existing pod (only supported with podman).

+
+

+ + TYPE: + Optional[ValidPod] + + + DEFAULT: + None + +

+
preserve_fds +
+

The number of additional file descriptors to pass +through to the container. Only supported by podman.

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
privileged +
+

Give extended privileges to this container.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
publish +
+

Ports to publish, same as the -p argument in the Docker CLI. +example are [(8000, 7000) , ("127.0.0.1:3000", 2000)] or +[("127.0.0.1:3000", 2000, "udp")]. You can also use a single entry in +the tuple to signify that you want a random free port on the host. For example: +publish=[(80,)].

+
+

+ + TYPE: + List[ValidPortMapping] + + + DEFAULT: + [] + +

+
publish_all +
+

Publish all exposed ports to random ports.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
pull +
+

Pull image before running ("always"|"missing"|"never") (default "missing").

+
+

+ + TYPE: + str + + + DEFAULT: + 'missing' + +

+
read_only +
+

Mount the container's root filesystem as read only.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
restart +
+

Restart policy to apply when a container exits (default "no")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
remove +
+

Automatically remove the container when it exits.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
runtime +
+

Runtime to use for this container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
security_options +
+

Security options

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
shm_size +
+

Size of /dev/shm. int is for bytes. But you can use "512m" or +"4g" for example.

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
stop_timeout +
+

Signal to stop a container (default "SIGTERM")

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
storage_options +
+

Storage driver options for the container

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
systemd +
+

Whether to run in systemd mode. Only known to apply to Podman, see +https://docs.podman.io/en/latest/markdown/podman-run.1.html#systemd-true-false-always

+
+

+ + TYPE: + Optional[Union[bool, Literal['always']]] + + + DEFAULT: + None + +

+
tty +
+

Allocate a pseudo-TTY. Allow the process to access your terminal +to write on it.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
tz +
+

Set timezone in container, or local to match the host's timezone. +See /usr/share/zoneinfo/ for valid timezones. +Note: This option is only known to apply to Podman containers.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
user +
+

Username or UID (format: <name|uid>[:<group|gid>])

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
userns +
+

User namespace to use

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
uts +
+

UTS namespace to use

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
volumes +
+

Bind mount a volume. Some examples: +[("/", "/host"), ("/etc/hosts", "/etc/hosts", "rw")].

+
+

+ + TYPE: + Optional[List[VolumeDefinition]] + + + DEFAULT: + [] + +

+
volume_driver +
+

Optional volume driver for the container

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
workdir +
+

The directory in the container where the process will be executed.

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
+

Returns

+
The container output as a string if detach is `False` (the default),
+and a `python_on_whales.Container` if detach is `True`.
+
+ +
+ +
+ +
+ + +

+ start + + +

+
start(
+    containers,
+    attach=False,
+    interactive=False,
+    stream=False,
+    detach_keys=None,
+)
+
+ +
+ +

Starts one or more created/stopped containers.

+

Aliases: docker.start, docker.container.start, +python_on_whales.Container.start.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
containers +
+

One or a list of containers.

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
attach +
+

Attach stdout/stderr and forward signals.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
interactive +
+

Attach stdin (ensure it is open).

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
stream +
+

Stream output as a generator.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
detach_keys +
+

Override the key sequence for detaching a container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ stats + + +

+
stats(containers=None, all=False)
+
+ +
+ +

Get containers resource usage statistics

+

Alias: docker.stats(...)

+

Usage:

+
from python_on_whales import docker
+
+docker.run("redis", detach=True)
+print(docker.stats())
+# [<<class 'python_on_whales.components.container.ContainerStats'> object,
+# attributes are block_read=0, block_write=0, cpu_percentage=0.08,
+# container=e90ae41a5b17,
+# container_id=e90ae41a5b17df998584141692f1e361c485e8d00c37ee21fdc360d3523dd1c1,
+# memory_percentage=0.18, memory_used=11198791, memory_limit=6233071288,
+# container_name=crazy_northcutt, net_upload=696, net_download=0>]
+
+

The data unit is the byte.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
all +
+

Get the stats of all containers, not just running ones.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
containers +
+

One or a list of containers.

+
+

+ + TYPE: + Optional[Union[ValidContainer, List[ValidContainer]]] + + + DEFAULT: + None + +

+
+

Returns

+
A `List[python_on_whales.ContainerStats]`.
+
+ +
+ +
+ +
+ + +

+ stop + + +

+
stop(containers, time=None)
+
+ +
+ +

Stops one or more running containers

+

Alias: docker.stop(...)

+

Aliases: docker.stop, docker.container.stop, +python_on_whales.Container.stop.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
containers +
+

One or a list of containers.

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
time +
+

Seconds to wait for stop before killing a container (default 10)

+
+

+ + TYPE: + Optional[Union[int, timedelta]] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if any of the
+containers do not exist.
+
+ +
+ +
+ +
+ + +

+ top + + +

+
top()
+
+ +
+ +

Get the running processes of a container

+

Alias: docker.top(...)

+

Not yet implemented

+ +
+ +
+ +
+ + +

+ unpause + + +

+
unpause(x)
+
+ +
+ +

Unpause all processes within one or more containers

+

Alias: docker.unpause(...)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more containers (name, id or python_on_whales.Container object).

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if any of the
+containers do not exist.
+
+ +
+ +
+ +
+ + +

+ update + + +

+
update(
+    x,
+    /,
+    *,
+    blkio_weight=None,
+    cpu_period=None,
+    cpu_quota=None,
+    cpu_rt_period=None,
+    cpu_rt_runtime=None,
+    cpu_shares=None,
+    cpus=None,
+    cpuset_cpus=None,
+    cpuset_mems=None,
+    kernel_memory=None,
+    memory=None,
+    memory_reservation=None,
+    memory_swap=None,
+    pids_limit=None,
+    restart=None,
+)
+
+ +
+ +

Update configuration of one or more containers

+

Alias: docker.update(...)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or a list of containers to update.

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
blkio_weight +
+

Block IO (relative weight), between 10 and 1000, +or 0 to disable (default 0)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_period +
+

Limit CPU CFS (Completely Fair Scheduler) period

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_quota +
+

Limit CPU CFS (Completely Fair Scheduler) quota

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_rt_period +
+

Limit CPU real-time period in microseconds

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_rt_runtime +
+

Limit CPU real-time runtime in microseconds

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpu_shares +
+

CPU shares (relative weight)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
cpus +
+

The maximal amount of cpu the container can use. +1 means one cpu core.

+
+

+ + TYPE: + Optional[float] + + + DEFAULT: + None + +

+
cpuset_cpus +
+

CPUs in which to allow execution. Must be given as a list.

+
+

+ + TYPE: + Optional[List[int]] + + + DEFAULT: + None + +

+
cpuset_mems +
+

MEMs in which to allow execution. Must be given as a list.

+
+

+ + TYPE: + Optional[List[int]] + + + DEFAULT: + None + +

+
memory +
+

Memory limit, valid values are 1024 (ints are bytes) or +"43m" or "6g".

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
memory_reservation +
+

Memory soft limit

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
memory_swap +
+

Swap limit equal to memory plus swap: '-1' +to enable unlimited swap.

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
pids_limit +
+

Tune container pids limit (set -1 for unlimited)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
restart +
+

Restart policy to apply when a container exits (default "no")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ +
+ + +

+ wait + + +

+
wait(x)
+
+ +
+ +

Block until one or more containers stop, then returns their exit codes

+

Alias: docker.wait(...)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or a list of containers to wait for.

+
+

+ + TYPE: + Union[ValidContainer, List[ValidContainer]] + +

+
+

Returns

+
An `int` if a single container was passed as argument or a list of ints
+if multiple containers were passed as arguments.
+
+

Some Examples:

+
cont = docker.run("ubuntu", ["bash", "-c", "sleep 2 && exit 8"], detach=True)
+
+exit_code = docker.wait(cont)
+
+print(exit_code)
+# 8
+docker.container.remove(cont)
+
+
cont_1 = docker.run("ubuntu", ["bash", "-c", "sleep 4 && exit 8"], detach=True)
+cont_2 = docker.run("ubuntu", ["bash", "-c", "sleep 2 && exit 10"], detach=True)
+
+exit_codes = docker.wait([cont_1, cont_2])
+
+print(exit_codes)
+# [8, 10]
+docker.container.remove([cont_1, cont_2])
+
+

Raises

+
`python_on_whales.exceptions.NoSuchContainer` if the container does not exists.
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/context/index.html b/sub-commands/context/index.html new file mode 100644 index 00000000..6468fd2e --- /dev/null +++ b/sub-commands/context/index.html @@ -0,0 +1,1477 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker context - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

How to use Docker contexts

+

Docker contexts allow you to connect to docker daemons other than the local one. This is similar to the -H argument of the Docker command.

+

Contexts commands allow you to declare, save, list local and remote Docker daemons and Kubernetes endpoints that you have.

+

An exemple here with python-on-whales:

+
from python_on_whales import docker, DockerContextConfig
+
+new_context = docker.context.create(
+    "my_remote_ssh_server",
+    docker=DockerContextConfig(host="ssh://ubuntu@52.57.163.75"),
+    description="my server ssh with a lot more power"
+)
+print(docker.context.list())
+# [python_on_whales.Context(name='default', endpoints={'docker': ContextEndpoint(host='unix:///var/run/docker.sock', skip_tls_verify=False)}),
+# python_on_whales.Context(name='my_remote_ssh_server', endpoints={'docker': ContextEndpoint(host='ssh://ubuntu@52.57.163.75', skip_tls_verify=False)})]
+new_context.use()
+# it's the same to use docker.context.use("my_remote_ssh_server") or docker.context.use(new_context)
+
+print(docker.ps()) # will list the containers in the remote server
+# [python_on_whales.Container(id=...), python_on_whales.Container(id=...)]
+# return to the local docker daemon
+docker.context.use("default")
+print(docker.ps()) # will list the containers running locally
+# [python_on_whales.Container(id=...)]
+
+

Note that for this simple use case, it's equivalent to use the -H option of the Docker client like so:

+
from python_on_whales import DockerClient
+
+docker = DockerClient(host="ssh://ubuntu@52.57.163.75")
+
+print(docker.ps())
+
+ + +
+ + + +

+ ContextCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(
+    context_name,
+    default_stack_orchestrator=None,
+    description=None,
+    from_=None,
+    docker=None,
+    kubernetes=None,
+)
+
+ +
+ +

Creates a new context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
context_name +
+

name of the context to create

+
+

+ + TYPE: + str + +

+
default_stack_orchestrator +
+

Default orchestrator for stack operations to use with this context (swarm|kubernetes|all)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
description +
+

Description of the context

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
docker +
+

Set the docker endpoint, you can use a dict of a class to +specify the options. The class is python_on_whales.DockerContextConfig.

+
+

+ + TYPE: + Union[Dict[str, Any], DockerContextConfig, None] + + + DEFAULT: + None + +

+
from_ +
+

Create context from a named context

+
+

+ + TYPE: + Optional[ValidContext] + + + DEFAULT: + None + +

+
kubernetes +
+

Set the kubernetes endpoint. You can use a dict or a class to specify the options. The class +is python_on_whales.KubernetesContextConfig.

+
+

+ + TYPE: + Union[Dict[str, Any], KubernetesContextConfig, None] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x=None)
+
+ +
+ +

Returns the context object. If no argument is provided, returns the +current context.

+ +
+ +
+ +
+ + +

+ list + + +

+
list()
+
+ +
+ +

List all Docker contexts available

+

Returns

+
`List[python_on_whales.Context]`
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x, force=False)
+
+ +
+ +

Removes one or more contexts

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more contexts, empty list means no-op.

+
+

+ + TYPE: + Union[ValidContext, List[ValidContext]] + +

+
force +
+

Force the removal of this context

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ update + + +

+
update()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ use + + +

+
use(context)
+
+ +
+ +

Set the default context

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
context +
+

The context to set as default

+
+

+ + TYPE: + ValidContext + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/image/index.html b/sub-commands/image/index.html new file mode 100644 index 00000000..d9888cb7 --- /dev/null +++ b/sub-commands/image/index.html @@ -0,0 +1,2463 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker image - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ ImageCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ exists + + +

+
exists(x)
+
+ +
+ +

Returns True if the image exists. False otherwise.

+

It's just calling docker.image.inspect(...) and verifies that it doesn't throw + a python_on_whales.exceptions.NoSuchImage.

+

Returns

+
A `bool`
+
+ +
+ +
+ +
+ + +

+ history + + +

+
history()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ import_ + + +

+
import_(
+    source,
+    tag=None,
+    changes=(),
+    message=None,
+    platform=None,
+)
+
+ +
+ +

Import the contents from a tarball to create a filesystem image

+

Alias: docker.import_(...)

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
changes +
+

Apply Dockerfile instruction to the created image

+
+

+ + TYPE: + Iterable[str] + + + DEFAULT: + () + +

+
message +
+

Set commit message for imported image

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
platform +
+

Set platform if server is multi-platform capable

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Creates a python_on_whales.Image object.

+

Returns

+
`python_on_whales.Image`, or `List[python_on_whales.Image]` if the input
+was a list of strings.
+
+

Raises

+
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exists.
+
+ +
+ +
+ +
+ + +

+ legacy_build + + +

+
legacy_build(
+    context_path,
+    add_hosts={},
+    build_args={},
+    cache=True,
+    file=None,
+    labels={},
+    network=None,
+    pull=False,
+    tags=(),
+    target=None,
+)
+
+ +
+ +

Build a Docker image with the old Docker builder (meaning not using buildx/buildkit)

+

As the name implies this is a legacy building method. Users are strongly encouraged to use +docker.build() instead. The legacy builder will not be available in docker v22.06 and above.

+

This function also won't run the legacy builder if the environment variable +DOCKER_BUILDKIT is set to 1 or if you had run previously docker buildx install from bash +or docker.buildx.install() from Python.

+

Some resources on why moving to buildx/buildkit is necessary:

+ +

A python_on_whales.Image is returned, even when using multiple tags. +That is because it will produce a single image with multiple tags.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
context_path +
+

The path of the build context. Defaults to the current working directory

+
+

+ + TYPE: + ValidPath + +

+
add_hosts +
+

Hosts to add. add_hosts={"my_host1": "192.168.32.35"}

+
+

+ + TYPE: + Mapping[str, str] + + + DEFAULT: + {} + +

+
build_args +
+

The build arguments. +ex build_args={"PY_VERSION": "3.7.8", "UBUNTU_VERSION": "20.04"}.

+
+

+ + TYPE: + Mapping[str, str] + + + DEFAULT: + {} + +

+
cache +
+

Whether or not to use the cache, defaults to True

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
file +
+

The path of the Dockerfile, defaults to context_path/Dockerfile

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
labels +
+

Mapping of labels to add to the image. +labels={"very-secure": "1", "needs-gpu": "0"} for example.

+
+

+ + TYPE: + Mapping[str, str] + + + DEFAULT: + {} + +

+
network +
+

which network to use when building the Docker image

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
pull +
+

Always attempt to pull a newer version of the image

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
tags +
+

Tag or tags to put on the resulting image.

+
+

+ + TYPE: + Union[str, Iterable[str]] + + + DEFAULT: + () + +

+
target +
+

Set the target build stage to build.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+

Returns

+
A `python_on_whales.Image`
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(repository_or_tag=None, filters={}, all=False)
+
+ +
+ +

Returns the list of Docker images present on the machine.

+

Alias: docker.images()

+

Note that each image may have multiple tags.

+

Returns

+
A `List[python_on_whales.Image]` object.
+
+ +
+ +
+ +
+ + +

+ load + + +

+
load(input, quiet=False)
+
+ +
+ +

Loads one or multiple Docker image(s) from a tar or an iterator of bytes.

+

Alias: docker.load(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
input +
+

Path or input stream to load the images from.

+
+

+ + TYPE: + Union[ValidPath, bytes, Iterator[bytes]] + +

+
quiet +
+

If you don't want to display the progress bars.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
`None` when using bytes as input. A `List[str]` (list of tags)
+ when a path is provided.
+
+ +
+ +
+ +
+ + +

+ prune + + +

+
prune(all=False, filter={})
+
+ +
+ +

Remove unused images

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
all +
+

Remove all unused images, not just dangling ones

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
filter +
+

Provide filter values (e.g. {"until": "<timestamp>"})

+
+

+ + TYPE: + Mapping[str, str] + + + DEFAULT: + {} + +

+
+ + + + + + + + + + + + + + + +
RETURNSDESCRIPTION
+ + str + + +
+

The output of the CLI (the layers removed).

+
+
+ +
+ +
+ +
+ + +

+ pull + + +

+
pull(x, quiet=False, platform=None)
+
+ +
+ +

Pull one or more docker image(s)

+

Alias: docker.pull(...)

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

The image name(s) . Can be a string or a list of strings. In case of +list, multithreading is used to pull the images. +The progress bars might look strange as multiple +processes are drawing on the terminal at the same time.

+
+

+ + TYPE: + Union[str, Iterable[str]] + +

+
quiet +
+

If you don't want to see the progress bars.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
platform +
+

If you want to enforce a platform.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ + + + + + + + + + + + + + + + + + + + + + + +
RETURNSDESCRIPTION
+ + Union[Image, List[Image]] + + +
+

The Docker image loaded (python_on_whales.Image object).

+
+
+ + Union[Image, List[Image]] + + +
+

If a list was passed as input, then a List[python_on_whales.Image] will

+
+
+ + Union[Image, List[Image]] + + +
+

be returned.

+
+
+ +
+ +
+ +
+ + +

+ push + + +

+
push(x, quiet=False)
+
+ +
+ +

Push a tag or a repository to a registry

+

Alias: docker.push(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

Tag(s) or repo(s) to push. Can be a string or an iterable of strings. +If it's an iterable, python-on-whales will push all the images with +multiple threads. The progress bars might look strange as multiple +processes are drawing on the terminal at the same time.

+
+

+ + TYPE: + Union[str, Iterable[str]] + +

+
quiet +
+

If you don't want to see the progress bars.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exist.
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x, force=False, prune=True)
+
+ +
+ +

Remove one or more docker images.

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

Single image or iterable of Docker images to remove. You can use tags or +python_on_whales.Image objects.

+
+

+ + TYPE: + Union[ValidImage, Iterable[ValidImage]] + +

+
force +
+

Force removal of the image(s).

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
prune +
+

Delete untagged parents.

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exist.
+
+ +
+ +
+ +
+ + +

+ save + + +

+
save(images, output=None)
+
+ +
+ +

Save one or more images to a tar archive. Returns a stream if output is None

+

Alias: docker.save(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
images +
+

Single image or non-empty iterable of images to save.

+
+

+ + TYPE: + Union[ValidImage, Iterable[ValidImage]] + +

+
output +
+

Path of the tar archive to produce. If output is None, a generator +of bytes is produced. It can be used to stream those bytes elsewhere, +to another Docker daemon for example.

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
+

Returns

+
`Optional[Iterator[bytes]]`. If output is a path, nothing is returned.
+
+

Raises

+
`python_on_whales.exceptions.NoSuchImage` if one of the images does not exist.
+
+

Example

+

An example of transfer of an image from a local Docker daemon to a remote Docker +daemon. We assume that the remote machine has an ssh access:

+
from python_on_whales import DockerClient
+
+local_docker = DockerClient()
+remote_docker = DockerClient(host="ssh://my_user@186.167.32.84")
+
+image_name = "busybox:1"
+local_docker.pull(image_name)
+bytes_iterator = local_docker.image.save(image_name)
+
+remote_docker.image.load(bytes_iterator)
+
+

Of course the best solution is to use a registry to transfer images, but +it's a cool example nonetheless.

+ +
+ +
+ +
+ + +

+ tag + + +

+
tag(source_image, new_tag)
+
+ +
+ +

Adds a tag to a Docker image.

+

Alias: docker.tag(...)

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
source_image +
+

The Docker image to tag. You can use a tag to reference it.

+
+

+ + TYPE: + Union[Image, str] + +

+
new_tag +
+

The tag to add to the Docker image.

+
+

+ + TYPE: + str + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchImage` if the image does not exist.
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/manifest/index.html b/sub-commands/manifest/index.html new file mode 100644 index 00000000..68f8266c --- /dev/null +++ b/sub-commands/manifest/index.html @@ -0,0 +1,1414 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker manifest - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ ManifestCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ annotate + + +

+
annotate(
+    name,
+    manifest,
+    arch=None,
+    os=None,
+    os_features=None,
+    os_version=None,
+    variant=None,
+)
+
+ +
+ +

Annotates a Docker manifest list.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
name +
+

The name of the manifest list

+
+

+ + TYPE: + str + +

+
manifest +
+

The individual manifest to annotate

+
+

+ + TYPE: + str + +

+
arch +
+

The manifest's architecture

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
os +
+

The manifest's operating system

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
os_features +
+

The manifest's operating system features

+
+

+ + TYPE: + Optional[List[str]] + + + DEFAULT: + None + +

+
os_version +
+

The manifest's operating system version

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
variant +
+

The manifest's architecture variant

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ create + + +

+
create(name, manifests, ammend=False, insecure=False)
+
+ +
+ +

Creates a Docker manifest list.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
name +
+

The name of the manifest list

+
+

+ + TYPE: + str + +

+
manifests +
+

The list of manifests to add to the manifest list

+
+

+ + TYPE: + List[str] + +

+
+

Returns

+
A `python_on_whales.ManifestList`.
+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns a Docker manifest list object.

+ +
+ +
+ +
+ + +

+ push + + +

+
push(x, purge=False, quiet=False)
+
+ +
+ +

Push a manifest list to a repository.

+

Options

+
purge: Remove the local manifest list after push
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(manifest_lists)
+
+ +
+ +

Removes a Docker manifest list or lists.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
manifest_lists +
+

One or more manifest lists.

+
+

+ + TYPE: + Union[ValidManifestList, List[ValidManifestList]] + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/network/index.html b/sub-commands/network/index.html new file mode 100644 index 00000000..b695ebad --- /dev/null +++ b/sub-commands/network/index.html @@ -0,0 +1,1386 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker network - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ NetworkCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ connect + + +

+
connect(
+    network,
+    container,
+    alias=None,
+    driver_options=[],
+    ip=None,
+    ip6=None,
+    links=[],
+)
+
+ +
+ +

Connect a container to a network

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
network +
+

The network to connect to

+
+

+ + TYPE: + ValidNetwork + +

+
container +
+

The container to connect

+
+

+ + TYPE: + ValidContainer + +

+
alias +
+

Add network-scoped alias for the container

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
driver_options +
+

Driver options for the network

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
ip +
+

IPv4 address (e.g., "172.30.100.104")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
ip6 +
+

IPv6 address (e.g., "2001:db8::33")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
links +
+

Add links to other containers

+
+

+ + TYPE: + List[ValidContainer] + + + DEFAULT: + [] + +

+
+ +
+ +
+ +
+ + +

+ create + + +

+
create(
+    name,
+    attachable=False,
+    driver=None,
+    gateway=None,
+    subnet=None,
+    labels={},
+    options=[],
+)
+
+ +
+ +

Creates a Docker network.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
name +
+

The name of the network

+
+

+ + TYPE: + str + +

+
+

Returns

+
A `python_on_whales.Network`.
+
+ +
+ +
+ +
+ + +

+ disconnect + + +

+
disconnect(network, container, force=False)
+
+ +
+ +

Disconnect a container from a network

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
network +
+

The name of the network.

+
+

+ + TYPE: + ValidNetwork + +

+
container +
+

The container to disconnect.

+
+

+ + TYPE: + ValidContainer + +

+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(networks)
+
+ +
+ +

Removes a Docker network

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
networks +
+

One or more networks.

+
+

+ + TYPE: + Union[ValidNetwork, List[ValidNetwork]] + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/node/index.html b/sub-commands/node/index.html new file mode 100644 index 00000000..140d3e3f --- /dev/null +++ b/sub-commands/node/index.html @@ -0,0 +1,1572 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker node - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ NodeCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ demote + + +

+
demote(x)
+
+ +
+ +

Demote one or more nodes from manager in the swarm

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or a list of nodes.

+
+

+ + TYPE: + Union[ValidNode, List[ValidNode]] + +

+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns a python_on_whales.Node object from a string +(id or hostname of the node)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One id or hostname or a list of ids or hostnames

+
+

+ + TYPE: + Union[str, List[str]] + +

+
+

Returns

+
One or a list of `python_on_whales.Node`
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list()
+
+ +
+ +

Returns the list of nodes in this swarm.

+

Returns

+
A `List[python_on_whales.Node]`
+
+ +
+ +
+ +
+ + +

+ promote + + +

+
promote(x)
+
+ +
+ +

Promote one or more nodes to manager in the swarm

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or a list of nodes.

+
+

+ + TYPE: + Union[ValidNode, List[ValidNode]] + +

+
+ +
+ +
+ +
+ + +

+ ps + + +

+
ps(x=None)
+
+ +
+ +

Returns the list of swarm tasks running on one or more nodes.

+
from python_on_whales import docker
+
+tasks = docker.node.ps("my-node-name")
+print(tasks[0].desired_state)
+# running
+
+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more nodes (can be id, name or python_on_whales.Node object.). +If the argument is not provided, it defaults to the current node. +An empty list means an empty list will also be returned.

+
+

+ + TYPE: + Union[ValidNode, List[ValidNode], None] + + + DEFAULT: + None + +

+
+

Returns

+
`List[python_on_whales.Task]`
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x, force=False)
+
+ +
+ +

Remove one or more nodes from the swarm

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One node or a list of nodes. You can use the id or the hostname of a node. +You can also use a python_on_whales.Node.

+
+

+ + TYPE: + Union[ValidNode, List[ValidNode]] + +

+
force +
+

Force remove a node from the swarm

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ update + + +

+
update(
+    node,
+    availability=None,
+    labels_add={},
+    rm_labels=[],
+    role=None,
+)
+
+ +
+ +

Updates a Swarm node.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
node +
+

The node to update, you can use a string or a python_on_whales.Node +object.

+
+

+ + TYPE: + ValidNode + +

+
availability +
+

Availability of the node ("active"|"pause"|"drain")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
labels_add +
+

Remove a node label if exists

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
rm_labels +
+

Labels to remove from the node.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
role +
+

Role of the node ("worker"|"manager")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/plugin/index.html b/sub-commands/plugin/index.html new file mode 100644 index 00000000..07d883bf --- /dev/null +++ b/sub-commands/plugin/index.html @@ -0,0 +1,1870 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker plugin - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ PluginCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(plugin_name, plugin_data_directory, compress=False)
+
+ +
+ +

Create a plugin from a rootfs and configuration.

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin_name +
+

The name you want to give to your plugin

+
+

+ + TYPE: + str + +

+
plugin_data_directory +
+

Must contain config.json and rootfs directory.

+
+

+ + TYPE: + ValidPath + +

+
compress +
+

Compress the context using gzip

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ disable + + +

+
disable(plugin, force=False)
+
+ +
+ +

Disable a plugin

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin +
+

The plugin to disable

+
+

+ + TYPE: + ValidPlugin + +

+
force +
+

Force the disable of an active plugin

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ enable + + +

+
enable(plugin, timeout=None)
+
+ +
+ +

Enable a plugin

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin +
+

The plugin to enable

+
+

+ + TYPE: + ValidPlugin + +

+
timeout +
+

HTTP client timeout (in seconds) (default 30)

+
+

+ + TYPE: + int + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns a python_on_whales.Plugin object from a string +(name or id of the plugin)

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One id or hostname or a list of name or ids

+
+

+ + TYPE: + Union[str, List[str]] + +

+
+

Returns

+
One or a list of `python_on_whales.Plugin`
+
+ +
+ +
+ +
+ + +

+ install + + +

+
install(
+    plugin_name,
+    configuration={},
+    alias=None,
+    disable=False,
+    disable_content_trust=True,
+)
+
+ +
+ +

Installs a Docker plugin

+

Warning: --grant-all-permissions is enabled, which means the program won't +stop to ask you to grant the permissions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin_name +
+

The name of the plugin you want to install

+
+

+ + TYPE: + str + +

+
configuration +
+

A dict adding configuration options to the plugin

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
alias +
+

Local name for plugin

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
disable +
+

Do not enable the plugin on install

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
disable_content_trust +
+

Skip image verification (default True)

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
+

Returns

+
A `python_on_whales.Plugin`.
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list()
+
+ +
+ +

Returns a List[python_on_whales.Plugin that are installed on the daemon.

+ +
+ +
+ +
+ + +

+ push + + +

+
push(plugin, disable_content_trust=True)
+
+ +
+ +

Push a plugin to a registry.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin +
+

The plugin to push

+
+

+ + TYPE: + ValidPlugin + +

+
disable_content_trust +
+

Skip image signing (default True)

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x, force=False)
+
+ +
+ +

Removes one or more plugins

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more plugins to remove.

+
+

+ + TYPE: + Union[ValidPlugin, List[ValidPlugin]] + +

+
force +
+

Force the removal of this plugin.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ set + + +

+
set(plugin, configuration)
+
+ +
+ +

Change the settings for a plugin

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin +
+

The plugin that needs its settings changed

+
+

+ + TYPE: + ValidPlugin + +

+
configuration +
+

The new configuration options.

+
+

+ + TYPE: + Dict[str, str] + +

+
+ +
+ +
+ +
+ + +

+ upgrade + + +

+
upgrade(
+    plugin,
+    remote=None,
+    disable_content_trust=True,
+    skip_remote_check=False,
+)
+
+ +
+ +

Upgrade a plugin

+

Warning: --grant-all-permissions is enabled, which means the program won't +stop to ask you to grant the permissions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
plugin +
+

The plugin to upgrade

+
+

+ + TYPE: + ValidPlugin + +

+
remote +
+

The remote to fetch the upgrade from

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
disable_content_trust +
+

Skip image verification (default True)

+
+

+ + TYPE: + bool + + + DEFAULT: + True + +

+
skip_remote_check +
+

Do not check if specified remote plugin matches +existing plugin image

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/pod/index.html b/sub-commands/pod/index.html new file mode 100644 index 00000000..035a3f18 --- /dev/null +++ b/sub-commands/pod/index.html @@ -0,0 +1,3299 @@ + + + + + + + + + + + + + + + + + + + + + + + + podman pod - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ PodCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(
+    name=None,
+    *,
+    add_hosts=[],
+    cgroup_parent=None,
+    cpus=None,
+    cpuset_cpus=None,
+    devices=[],
+    device_read_bps=[],
+    dns=[],
+    dns_options=[],
+    dns_search=[],
+    exit_policy=None,
+    gidmaps=[],
+    hostname=None,
+    infra=None,
+    infra_command=None,
+    infra_conmon_pidfile=None,
+    infra_image=None,
+    infra_name=None,
+    ip=None,
+    ip6=None,
+    labels={},
+    label_files=[],
+    mac_address=None,
+    memory=None,
+    networks=[],
+    network_aliases=[],
+    no_hosts=False,
+    pid=None,
+    pod_id_file=None,
+    publish=[],
+    replace=False,
+    restart=None,
+    security_options=[],
+    share=[],
+    shm_size=None,
+    subgidname=None,
+    subuidname=None,
+    sysctl={},
+    uidmaps=[],
+    userns=None,
+    uts=None,
+    volumes=[],
+    volumes_from=[]
+)
+
+ +
+ +

Creates a pod, but does not start it.

+

Start it then with the .start() method.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
name +
+

The name to set the pod to. If not specified a name is +generated.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
add_hosts +
+

Add a custom host-to-IP mapping (format 'host:ip'), which +adds a line to /etc/hosts. Conflicts with the no_hosts option.

+
+

+ + TYPE: + List[Tuple[str, str]] + + + DEFAULT: + [] + +

+
cgroup_parent +
+

Path to cgroups under which the cgroup for the pod is +created. If the path is not absolute, the path is considered to +be relative to the cgroups path of the init process.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
cpus +
+

Set the total number of CPUs delegated to the pod. The default +is 0.0 indicating that there is no limit on computation power.

+
+

+ + TYPE: + Optional[float] + + + DEFAULT: + None + +

+
cpuset_cpus +
+

CPUs in which to allow execution.

+
+

+ + TYPE: + Optional[List[int]] + + + DEFAULT: + None + +

+
devices +
+

List of device names to pass from the host to containers +in the pod.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
device_read_bps +
+

Limit read rate (in bytes per second) from a device +(e.g. device_read_bps=/dev/sda:1mb).

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
dns +
+

Set custom DNS servers in the /etc/resolv.conf file that is +shared between all containers in the pod.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
dns_options +
+

Set custom DNS options in the /etc/resolv.conf file +that is shared between all containers in the pod.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
dns_search +
+

Set custom DNS search domains in the /etc/resolv.conf +file that is shared between all containers in the pod.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
exit_policy +
+

Set the exit policy of the pod when the last container +exits. Supported policies are 'continue' (default) and 'stop'.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
gidmaps +
+

GID map for the user namespace. Using this flag runs all +containers in the pod with user namespace enabled. It conflicts +with the --userns and --subgidname flags.

+
+

+ + TYPE: + List[Tuple[int, int, int]] + + + DEFAULT: + [] + +

+
hostname +
+

Set the pod's hostname.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
infra +
+

Whether to create an infra container and associate it with +the pod. An infra container is a lightweight container used to +coordinate the shared kernel namespace of a pod.

+
+

+ + TYPE: + Optional[bool] + + + DEFAULT: + None + +

+
infra_command +
+

Specify the command that is run to start the infra +container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
infra_conmon_pidfile +
+

Write the pid of the infra container's conmon +process to a file.

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
infra_image +
+

The custom image that is used for the infra container.

+
+

+ + TYPE: + Optional[ValidImage] + + + DEFAULT: + None + +

+
infra_name +
+

The name that is used for the pod's infra container.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
ip +
+

Specify a static IPv4 address for the pod, for example +10.88.64.128. This option can only be used if the pod is joined +to only a single network - i.e., network=network-name is used at +most once - and if the pod is not joining another container's +network namespace via network=container:id. The address must be +within the network's IP address pool (default 10.88.0.0/16).

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
ip6 +
+

Specify a static IPv6 address for the pod, for example +fd46:db93:aa76:ac37::10. This option can only be used if the pod is +joined to only a single network (see note on the ip argument). +The address must be within the network's IPv6 address pool.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
labels +
+

Add metadata labels to a pod.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
label_files +
+

Read in a line-delimited file of labels.

+
+

+ + TYPE: + List[ValidPath] + + + DEFAULT: + [] + +

+
mac_address +
+

Pod network interface MAC address +(e.g. 92:d0:c6:0a:29:33). This option can only be used if the +pod is joined to only a single network (see note on the ip +argument).

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
memory +
+

Memory limit for the pod.

+
+

+ + TYPE: + Union[int, str, None] + + + DEFAULT: + None + +

+
networks +
+

Specify networks to use for the pod.

+
+

+ + TYPE: + List[ValidNetwork] + + + DEFAULT: + [] + +

+
network_aliases +
+

Add network-scoped aliases for the pod, setting the +alias for all networks that the container joins.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
no_hosts +
+

Do not create /etc/hosts for the pod. This option +conflicts with --add-host.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
pid +
+

Set the PID mode for the pod. The default is to create a +private PID namespace for the pod.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
pod_id_file +
+

Write the pod ID to the specified file.

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
publish +
+

Publish a container's port, or range of ports, within this +pod to the host.

+
+

+ + TYPE: + List[ValidPortMapping] + + + DEFAULT: + [] + +

+
replace +
+

If another pod with the same name already exists, replace +and remove it.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
restart +
+

Restart policy for containers in the pod.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
security_options +
+

Security options (AppArmor or SELinux).

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
share +
+

Namespaces to share between containers in the pod.

+
+

+ + TYPE: + List[str] + + + DEFAULT: + [] + +

+
shm_size +
+

Size of /dev/shm.

+
+

+ + TYPE: + Optional[Union[int, str]] + + + DEFAULT: + None + +

+
subgidname +
+

Run the container in a new user namespace using the map +with name in the /etc/subgid file.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
subuidname +
+

Run the container in a new user namespace using the map +with name in the /etc/subuid file.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
sysctl +
+

Configure namespaced kernel parameters for all containers in +the pod.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
uidmaps +
+

Run all containers in the pod in a new user namespace using +the supplied UID mapping. This option conflicts with the userns +and subuidname options.

+
+

+ + TYPE: + List[Tuple[int, int, int]] + + + DEFAULT: + [] + +

+
userns +
+

Set the user namespace mode for all the containers in a pod.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
uts +
+

Set the UTS namespace mode for the pod.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
volumes +
+

Specify volumes passed to all containers in the pod.

+
+

+ + TYPE: + List[VolumeDefinition] + + + DEFAULT: + [] + +

+
volumes_from +
+

Mount volumes from the specified container(s).

+
+

+ + TYPE: + List[ValidContainer] + + + DEFAULT: + [] + +

+
+

Returns

+
A `python_on_whales.Pod` object.
+
+ +
+ +
+ +
+ + +

+ exists + + +

+
exists(pod)
+
+ +
+ +

Returns True if the pod exists. False otherwise.

+

It's just calling podman.pod.inspect(...) and verifies that it doesn't throw + a python_on_whales.exceptions.NoSuchPod.

+

Returns

+
A `bool`
+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Creates a python_on_whales.Pod object.

+

Returns

+
`python_on_whales.Pod`, or `List[python_on_whales.Pod]` if the input
+was a list of strings.
+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if one of the pods does not exist.
+
+ +
+ +
+ +
+ + +

+ kill + + +

+
kill(x, /, *, signal=None)
+
+ +
+ +

Kill pods.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more pods to kill

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
signal +
+

The signal to send the pods' containers

+
+

+ + TYPE: + Optional[Union[int, str]] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if a pod does not exist.
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(*, filters={})
+
+ +
+ +

List the pods on the host.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
filters +
+

Filters to apply when listing pods

+
+

+ + TYPE: + PodListFilters + + + DEFAULT: + {} + +

+
+

Returns

+
A `List[python_on_whales.Pod]`
+
+ +
+ +
+ +
+ + +

+ logs + + +

+
logs(
+    pod,
+    container=None,
+    *,
+    names=False,
+    since=None,
+    tail=None,
+    timestamps=False,
+    until=None,
+    follow=False,
+    stream=False
+)
+
+ +
+ +

Returns the logs of a pod's containers as a string or an iterator.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
pod +
+

The pod to get the container logs of

+
+

+ + TYPE: + ValidPod + +

+
container +
+

Filter logs by container

+
+

+ + TYPE: + Optional[ValidContainer] + + + DEFAULT: + None + +

+
names +
+

Output container names instead of IDs in the logs

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
since +
+

Use a datetime or timedelta to specify the lower +date limit for the logs.

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
tail +
+

Number of lines to show from the end of the logs (default all)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
timestamps +
+

Put timestamps next to lines.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
until +
+

Use a datetime or a timedelta to specify the upper date +limit for the logs.

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
follow +
+

If False (the default), the logs returned are the logs up to the time +of the function call. If True, the logs of the container up to the time the +container stopped are displayed. Which means that if the container isn't stopped +yet, the function will continue until the container is stopped. +Which is why it is advised to use the stream option if you use the follow option. +Without stream, only a str will be returned, possibly much later in the +future. With stream, you'll be able to read the logs in real time.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
stream +
+

Similar to the stream argument of docker.run. +This function will then return an iterator that will yield a +tuple (source, content) with source being "stderr" or +"stdout". content is the content of the line as bytes. +Take a look at the user guide +to have an example of the output.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`
+if `stream=True`.
+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if the container does not exist.
+
+

If you are a bit confused about follow and stream, here are some use cases.

+
    +
  • If you want to have the logs up to this point as a str, don't use those args.
  • +
  • If you want to stream the output in real time, use follow=True, stream=True
  • +
  • If you want the logs up to this point, but you don't want to fit all the logs +in memory because they are too big, use stream=True.
  • +
+ +
+ +
+ +
+ + +

+ pause + + +

+
pause(x)
+
+ +
+ +

Pauses one or more pods

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more pods to pause

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.
+
+ +
+ +
+ +
+ + +

+ prune + + +

+
prune()
+
+ +
+ +

Remove pods that are not running.

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x, /, *, force=False, ignore=False, time=None)
+
+ +
+ +

Remove one or more pods.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

Single pod or list of pods to remove.

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
force +
+

Force removal of the pods

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
ignore +
+

Ignore errors when specified pod is missing

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
time +
+

Seconds to wait for pod stop before killing the containers

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if any of the pods do not
+exist and `ignore` was not set.
+
+ +
+ +
+ +
+ + +

+ restart + + +

+
restart(x)
+
+ +
+ +

Restarts one or more pods

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more pods to restart

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.
+
+ +
+ +
+ +
+ + +

+ start + + +

+
start(x)
+
+ +
+ +

Starts one or more pods

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more pods to start

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.
+
+ +
+ +
+ +
+ + +

+ stats + + +

+
stats(x)
+
+ +
+ +

Get pods resource usage statistics

+

The data unit is the byte.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or a list of pods

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
+

Returns

+
A `List[python_on_whales.PodStats]`.
+
+ +
+ +
+ +
+ + +

+ stop + + +

+
stop(x, /, *, time=None)
+
+ +
+ +

Stops one or more pods

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more pods to stop

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
time +
+

Seconds to wait for pods to stop before killing containers

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if any pods does not exist.
+
+ +
+ +
+ +
+ + +

+ top + + +

+
top(pod)
+
+ +
+ +

Get the running processes of a pod

+

Not yet implemented

+ +
+ +
+ +
+ + +

+ unpause + + +

+
unpause(x)
+
+ +
+ +

Unpauses one or more pods

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more pods to unpause

+
+

+ + TYPE: + Union[ValidPod, Sequence[ValidPod]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchPod` if any pod do not exist.
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/secret/index.html b/sub-commands/secret/index.html new file mode 100644 index 00000000..9206388f --- /dev/null +++ b/sub-commands/secret/index.html @@ -0,0 +1,1203 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker secret - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ SecretCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(
+    name, file, driver=None, labels={}, template_driver=None
+)
+
+ +
+ +

Creates a python_on_whales.Secret.

+

Returns

+
A `python_on_whales.Secret` object.
+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns one or more python_on_whales.Secret based on an ID or name.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more IDs/names.

+
+

+ + TYPE: + Union[str, List[str]] + +

+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(filters={})
+
+ +
+ +

Returns all secrets as a List[python_on_whales.Secret].

+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x)
+
+ +
+ +

Removes one or more secrets

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more secrets. +Name, ids or python_on_whales.Secret objects are valid inputs.

+
+

+ + TYPE: + Union[ValidSecret, List[ValidSecret]] + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/service/index.html b/sub-commands/service/index.html new file mode 100644 index 00000000..e803a74e --- /dev/null +++ b/sub-commands/service/index.html @@ -0,0 +1,2073 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker service - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ ServiceCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ create + + +

+
create(
+    image,
+    command,
+    cap_add=[],
+    cap_drop=[],
+    constraints=[],
+    detach=False,
+    dns=[],
+    dns_options=[],
+    dns_search=[],
+    endpoint_mode=None,
+    entrypoint=None,
+    envs={},
+    env_files=[],
+    generic_resources=[],
+    groups=[],
+    healthcheck=True,
+    health_cmd=None,
+    health_interval=None,
+    health_retries=None,
+    health_start_period=None,
+    health_timeout=None,
+    hosts={},
+    hostname=None,
+    init=False,
+    isolation=None,
+    labels={},
+    limit_cpu=None,
+    limit_memory=None,
+    limit_pids=None,
+    log_driver=None,
+    network=None,
+    restart_condition=None,
+    restart_max_attempts=None,
+    secrets=[],
+    mounts=[],
+)
+
+ +
+ +

Creates a Docker swarm service.

+

Consider using 'docker stack deploy' instead as it's idempotent and +easier to read for complex applications. +docker stack deploy is basically docker compose for swarm clusters.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
image +
+

The image to use as the base for the service.

+
+

+ + TYPE: + str + +

+
command +
+

The command to execute in the container(s).

+
+

+ + TYPE: + Optional[List[str]] + +

+
+ +
+ +
+ +
+ + +

+ exists + + +

+
exists(x)
+
+ +
+ +

Verify that a service exists.

+

It's just calling docker.service.inspect(...) and verifies that it doesn't throw + a python_on_whales.exceptions.NoSuchService.

+

Returns

+
A `bool`
+
+ +
+ +
+ +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns one or a list of python_on_whales.Service object(s).

+

Raises

+
`python_on_whales.exceptions.NoSuchService` if one of the services
+doesn't exists.
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(filters={})
+
+ +
+ +

Returns the list of services

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
filters +
+

If you want to filter the results based on a given condition. +For example, docker.service.list(filters=dict(label="my_label=hello")).

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
A `List[python_on_whales.Services]`
+
+ +
+ +
+ +
+ + +

+ logs + + +

+
logs(
+    service,
+    details=False,
+    since=None,
+    tail=None,
+    timestamps=False,
+    follow=False,
+    raw=False,
+    task_ids=True,
+    resolve=True,
+    truncate=True,
+    stream=False,
+)
+
+ +
+ +

Returns the logs of a service as a string or an iterator.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
service +
+

The service to get the logs of

+
+

+ + TYPE: + ValidService + +

+
details +
+

Show extra details provided to logs

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
since +
+

Use a datetime or timedelta to specify the lower +date limit for the logs.

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
tail +
+

Number of lines to show from the end of the logs (default all)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
timestamps +
+

Put timestamps next to lines.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
follow +
+

If False (the default), the logs returned are the logs up to the time +of the function call. If True, the logs of the container up to the time the +service is stopped (removed) are displayed. +Which is why you must use the stream option if you use the follow option. +Without stream, only a str will be returned, possibly much later in the +future (maybe never if the service is never removed). So this option is not +possible (You'll get an error if you use follow and not stream). +With stream, you'll be able to read the logs in real time and stop +whenever you need.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
stream +
+

Similar to the stream argument of docker.run(). +This function will then returns and iterator that will yield a +tuple (source, content) with source being "stderr" or +"stdout". content is the content of the line as bytes. +Take a look at the user guide +to have an example of the output.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Returns

+
`str` if `stream=False` (the default), `Iterable[Tuple[str, bytes]]`
+if `stream=True`.
+
+

Raises

+
`python_on_whales.exceptions.NoSuchService` if the service does not exists.
+
+ +
+ +
+ +
+ + +

+ ps + + +

+
ps(x)
+
+ +
+ +

Returns the list of swarm tasks associated with this service.

+

You can pass multiple services at once at this function.

+
from python_on_whales import docker
+
+tasks = docker.service.ps("my-service-name")
+print(tasks[0].desired_state)
+# running
+
+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more services (can be id, name or python_on_whales.Service object.)

+
+

+ + TYPE: + Union[ValidService, List[ValidService]] + +

+
+

Returns

+
`List[python_on_whales.Task]`
+
+

Raises

+
`python_on_whales.exceptions.NoSuchService` if one of the services
+doesn't exist.
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(services)
+
+ +
+ +

Removes a service

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
services +
+

One or a list of services to remove.

+
+

+ + TYPE: + Union[ValidService, List[ValidService]] + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchService` if one of the services
+doesn't exist.
+
+ +
+ +
+ +
+ + +

+ rollback + + +

+
rollback()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ scale + + +

+
scale(new_scales, detach=False)
+
+ +
+ +

Scale one or more services.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
new_scales +
+

Mapping between services and the desired scales. For example +you can provide new_scale={"service1": 4, "service2": 8}

+
+

+ + TYPE: + Dict[ValidService, int] + +

+
detach +
+

If True, does not wait for the services to converge and return +immediately.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchService` if one of the services
+doesn't exists.
+
+ +
+ +
+ +
+ + +

+ update + + +

+
update(
+    service,
+    detach=False,
+    force=False,
+    image=None,
+    with_registry_authentication=False,
+    quiet=False,
+    replicas=None,
+)
+
+ +
+ +

Update a service

+

More options coming soon

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
service +
+

The service to update

+
+

+ + TYPE: + ValidService + +

+
detach +
+

Exit immediately instead of waiting for the service to converge

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
force +
+

Force update even if no changes require it

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
image +
+

Service image tag

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
with_registry_authentication +
+

Send registry authentication details +to swarm agents

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+

Raises

+
`python_on_whales.exceptions.NoSuchService` if the service doesn't exists.
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/stack/index.html b/sub-commands/stack/index.html new file mode 100644 index 00000000..72c73e60 --- /dev/null +++ b/sub-commands/stack/index.html @@ -0,0 +1,1524 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker stack - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ StackCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ deploy + + +

+
deploy(
+    name,
+    compose_files=[],
+    orchestrator=None,
+    prune=False,
+    resolve_image="always",
+    with_registry_auth=False,
+    env_files=[],
+    variables={},
+)
+
+ +
+ +

Deploys a stack.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
name +
+

The name of the stack to deploy. Mandatory.

+
+

+ + TYPE: + str + +

+
compose_files +
+

One or more docker-compose files. If there are more than +one, they will be fused together.

+
+

+ + TYPE: + Union[ValidPath, List[ValidPath]] + + + DEFAULT: + [] + +

+
orchestrator +
+

The orchestrator to use, `"swarm" or "kubernetes" or "all".

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
prune +
+

Prune services that are no longer referenced

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
resolve_image +
+

Query the registry to resolve image digest +and supported platforms "always"|"changed"|"never" (default "always"). +Note that if the registry cannot be queried when using "always", it's +going to try to use images present locally on the nodes.

+
+

+ + TYPE: + str + + + DEFAULT: + 'always' + +

+
with_registry_auth +
+

Send registry authentication details to Swarm agents. +Required if you need to run docker login to pull the docker images +in your stack.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
env_files +
+

Similar to .env files in docker-compose. Loads variables from +.env files. If both env_files and variables are used, variables +have priority. This behavior is similar to the one you would experience with +compose.

+
+

+ + TYPE: + List[ValidPath] + + + DEFAULT: + [] + +

+
variables +
+

A dict dictating by what to replace the variables declared in +the docker-compose files. In the docker CLI, you would use +environment variables for this.

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
A `python_on_whales.Stack` object.
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list()
+
+ +
+ +

Returns a list of python_on_whales.Stack

+

Returns

+
A `List[python_on_whales.Stack]`.
+
+ +
+ +
+ +
+ + +

+ ps + + +

+
ps(x)
+
+ +
+ +

Returns the list of swarm tasks in this stack.

+
from python_on_whales import docker
+
+tasks = docker.stack.ps("my-stack")
+print(tasks[0].desired_state)
+# running
+
+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

A stack . It can be name or a python_on_whales.Stack object.

+
+

+ + TYPE: + ValidStack + +

+
+

Returns

+
`List[python_on_whales.Task]`
+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x)
+
+ +
+ +

Removes one or more stacks.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

One or more stacks, empty list means nothing will be done.

+
+

+ + TYPE: + Union[ValidStack, List[ValidStack]] + +

+
+ +
+ +
+ +
+ + +

+ services + + +

+
services(stack)
+
+ +
+ +

List the services present in the stack.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
stack +
+

A docker stack or the name of a stack.

+
+

+ + TYPE: + ValidStack + +

+
+

Returns

+
A `List[python_on_whales.Stack]`
+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/swarm/index.html b/sub-commands/swarm/index.html new file mode 100644 index 00000000..c69af55f --- /dev/null +++ b/sub-commands/swarm/index.html @@ -0,0 +1,1917 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker swarm - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ SwarmCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ ca + + +

+
ca(
+    ca_certificate=None,
+    ca_key=None,
+    certificate_expiry=None,
+    detach=False,
+    external_ca=None,
+    rotate=False,
+)
+
+ +
+ +

Get and rotate the root CA

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
ca_certificate +
+

Path to the PEM-formatted root CA certificate +to use for the new cluster

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
ca_key +
+

Path to the PEM-formatted root CA key to use +for the new cluster

+
+

+ + TYPE: + Optional[ValidPath] + + + DEFAULT: + None + +

+
certificate_expiry +
+

Validity period for node certificates

+
+

+ + TYPE: + Union[int, timedelta, None] + + + DEFAULT: + None + +

+
detach +
+

Exit immediately instead of waiting for the root rotation +to converge. The function will return None.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
external_ca +
+

Specifications of one or more certificate signing endpoints

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
rotate +
+

Rotate the swarm CA - if no certificate or key are provided, +new ones will be generated.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ init + + +

+
init(
+    advertise_address=None,
+    autolock=False,
+    availability="active",
+    data_path_address=None,
+    data_path_port=None,
+    listen_address=None,
+)
+
+ +
+ +

Initialize a Swarm.

+

If you need the token to join the new swarm from another node, +use the docker.swarm.join_token function.

+

A example of how to initialize the whole swarm without leaving the manager +if the manager has ssh access to the workers:

+
from python_on_whales import docker, DockerClient
+
+worker_docker = DockerClient(host="ssh://worker_linux_user@worker_hostname")
+# Here the docker variable is connected to the local daemon
+# worker_docker is a connected to the Docker daemon of the
+# worker through ssh, useful to control it without login to the machine
+# manually.
+docker.swarm.init()
+my_token = docker.swarm.join_token("worker")  # you can set manager too
+worker_docker.swarm.join("manager_hostname:2377", token=my_token)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
advertise_address +
+

Advertised address (format: <ip|interface>[:port])

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
autolock +
+

Enable manager autolocking (requiring an unlock key to start a +stopped manager)

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
availability +
+

Availability of the node ("active"|"pause"|"drain")

+
+

+ + TYPE: + str + + + DEFAULT: + 'active' + +

+
data_path_address +
+

Address or interface to use for data path +traffic (format is <ip|interface>)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
listen_address +
+

address upon which the node listens for inbound +swarm manager traffic (format: <ip|interface>[:port])

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ join + + +

+
join(
+    manager_address,
+    advertise_address=None,
+    availability="active",
+    data_path_address=None,
+    listen_address=None,
+    token=None,
+)
+
+ +
+ +

Joins a swarm

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
manager_address +
+

The address of the swarm manager in the format "{ip}:{port}"

+
+

+ + TYPE: + str + +

+
advertise_address +
+

Advertised address (format: [:port])

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
availability +
+

Availability of the node +("active"|"pause"|"drain")

+
+

+ + TYPE: + str + + + DEFAULT: + 'active' + +

+
data_path_address +
+

Address or interface to use for data +path traffic (format: )

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
listen_address +
+

Listen address (format: [:port]) +(default 0.0.0.0:2377)

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
token +
+

Token for entry into the swarm, will determine if +the node enters the swarm as a manager or a worker.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
+ +
+ +
+ +
+ + +

+ join_token + + +

+
join_token(node_type, rotate=False)
+
+ +
+ +

Obtains a token to join the swarm

+

This token can then be used +with docker.swarm.join("manager:2377", token=my_token).

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
node_type +
+

"manager" or "worker"

+
+

+ + TYPE: + str + +

+
rotate +
+

Rotate join token

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ leave + + +

+
leave(force=False)
+
+ +
+ +

Leave the swarm

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
force +
+

Force this node to leave the swarm, ignoring warnings

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ unlock + + +

+
unlock(key)
+
+ +
+ +

Unlock a swarm after the --autolock parameter was used and +the daemon restarted.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
key +
+

The key to unlock the swarm. The key can be obtained on any manager +with docker.swarm.unlock_key().

+
+

+ + TYPE: + str + +

+
+ +
+ +
+ +
+ + +

+ unlock_key + + +

+
unlock_key(rotate=False)
+
+ +
+ +

Gives you the key needed to unlock the swarm after a manager daemon reboot.

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
rotate +
+

Rotate the unlock key.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ update + + +

+
update(
+    autolock=None,
+    cert_expiry=None,
+    dispatcher_heartbeat=None,
+    external_ca=None,
+    max_snapshots=None,
+    snapshot_interval=None,
+    task_history_limit=None,
+)
+
+ +
+ +

Update the swarm configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
autolock +
+

Change manager autolocking setting

+
+

+ + TYPE: + Optional[bool] + + + DEFAULT: + None + +

+
cert_expiry +
+

Validity period for node certificates, default +is datetime.timedelta(days=90). If int, it's a number of seconds.

+
+

+ + TYPE: + Optional[timedelta] + + + DEFAULT: + None + +

+
dispatcher_heartbeat +
+

Dispatcher heartbeat period.

+
+

+ + TYPE: + Optional[timedelta] + + + DEFAULT: + None + +

+
external_ca +
+

Specifications of one or more certificate signing endpoints

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
max_snapshots +
+

Number of additional Raft snapshots to retain

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
snapshot_interval +
+

Number of log entries between Raft snapshots (default 10000)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
task_history_limit +
+

Task history retention limit (default 5)

+
+

+ + TYPE: + Optional[int] + + + DEFAULT: + None + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/system/index.html b/sub-commands/system/index.html new file mode 100644 index 00000000..457bb103 --- /dev/null +++ b/sub-commands/system/index.html @@ -0,0 +1,1365 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker system - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ SystemCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ disk_free + + +

+
disk_free()
+
+ +
+ +

Give information about the disk usage of the Docker daemon.

+

Returns a python_on_whales.DiskFreeResult object.

+
from python_on_whales import docker
+disk_free_result = docker.system.disk_free()
+print(disk_free_result.images.active)  #int
+print(disk_free_result.containers.reclaimable)  # int, number of bytes
+print(disk_free_result.volumes.reclaimable_percent)  # float
+print(disk_free_result.build_cache.total_count)  # int
+print(disk_free_result.build_cache.size)  # int, number of bytes
+...
+
+

Note that the number are not 100% accurate because the docker CLI +doesn't provide the exact numbers.

+

Maybe in a future implementation, we can provide exact numbers.

+

Verbose mode is not yet implemented.

+ +
+ +
+ +
+ + +

+ events + + +

+
events(since=None, until=None, filters={})
+
+ +
+ +

Return docker events information up to the current point in time.

+

If until is not specified, then the iterator returned is infinite. +For example

+
from python_on_whales import docker
+from datetime import datetime, timedelta
+
+
+for event in docker.system.events():
+    print("new event!")
+    print(event)
+    # this will never end, that's ok if you want to monitor something
+    # for a long time. You can also use 'break' in the for loop if needed.
+
+for event in docker.system.events(until=datetime.now() - timedelta(seconds=30)):
+    print("some past event")
+    print(event)
+    # this loop will end, unlike the previous one
+
+for event in docker.system.events(until=datetime.now() + timedelta(seconds=30)):
+    print("some past event")
+    print(event)
+    # this loop will end in 30 seconds, even if there are no events at all
+
+events = list(docker.system.events(filters={"container": "mycontainer"}, until=datetime.now()))
+# the list of all events concerning the container "mycontainer"
+
+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
since +
+

Show all events created since timestamp

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
until +
+

Stream events until this timestamp

+
+

+ + TYPE: + Union[None, datetime, timedelta] + + + DEFAULT: + None + +

+
filters + +

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
A iterator which will yield DockerEvent objects from stdout/stderr
+
+

reference page for +system events

+ +
+ +
+ +
+ + +

+ info + + +

+
info()
+
+ +
+ +

Returns diverse information about the Docker client and daemon.

+

Returns

+
A `python_on_whales.SystemInfo` object
+
+

As an example

+
from python_on_whales import docker
+
+info = docker.system.info()
+print(info.images)
+# 40
+print(info.plugins.volume)
+# ["local"}
+...
+
+

You can find all attributes available by looking up the reference page for +system info.

+ +
+ +
+ +
+ + +

+ prune + + +

+
prune(all=False, volumes=False, filters={})
+
+ +
+ +

Remove unused docker data

+ + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
all +
+

Remove all unused images not just dangling ones

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
volumes +
+

Prune volumes

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
filters +
+

See the Docker documentation page about filtering +. +For example, filters=dict(until="24h").

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/task/index.html b/sub-commands/task/index.html new file mode 100644 index 00000000..b0cb280e --- /dev/null +++ b/sub-commands/task/index.html @@ -0,0 +1,1115 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker task - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ TaskCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ inspect + + +

+
inspect(x)
+
+ +
+ +

Returns a python_on_whales.Task object from its ID.

+ +
+ +
+ +
+ + +

+ list + + +

+
list()
+
+ +
+ +

Returns all tasks in the swarm

+

Returns

+
`List[python_on_whales.Task]`
+
+ +
+ +
+ +
+ + +

+ logs + + +

+
logs()
+
+ +
+ +

Not Yet implemented

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/trust/index.html b/sub-commands/trust/index.html new file mode 100644 index 00000000..9c0e9502 --- /dev/null +++ b/sub-commands/trust/index.html @@ -0,0 +1,1086 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker trust - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ TrustCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ inspect + + +

+
inspect()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ revoke + + +

+
revoke()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ +
+ + +

+ sign + + +

+
sign()
+
+ +
+ +

Not yet implemented

+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/sub-commands/volume/index.html b/sub-commands/volume/index.html new file mode 100644 index 00000000..05f74bc0 --- /dev/null +++ b/sub-commands/volume/index.html @@ -0,0 +1,1652 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker volume - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +
+ + + +

+ VolumeCLI + + +

+ + +
+ + + + + +
+ + + + + + + + + +
+ + +

+ clone + + +

+
clone(
+    source,
+    new_volume_name=None,
+    driver=None,
+    labels={},
+    options={},
+)
+
+ +
+ +

Clone a volume.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
source +
+

The volume to clone

+
+

+ + TYPE: + ValidVolume + +

+
new_volume_name +
+

The new volume name. If not given, a random name is chosen.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
driver +
+

Specify volume driver name (default "local")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
labels +
+

Set metadata for a volume

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
options +
+

Set driver specific options

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+

Returns

+
A `python_on_whales.Volume`, the new volume.
+
+ +
+ +
+ +
+ + +

+ copy + + +

+
copy(source, destination)
+
+ +
+ +

Copy files/folders between a volume and the local filesystem.

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
source +
+

If source is a directory/file inside a Docker volume, +a tuple (my_volume, path_in_volume) must be provided. The volume +can be a python_on_whales.Volume or a volume name as str. The path +can be a pathlib.Path or a str. If source is a local directory, +a pathlib.Path or str should be provided. End the source path with +/. if you want to copy the directory content in another directory.

+
+

+ + TYPE: + Union[ValidPath, VolumePath] + +

+
destination +
+

Same as source.

+
+

+ + TYPE: + Union[ValidPath, VolumePath] + +

+
+ +
+ +
+ +
+ + +

+ create + + +

+
create(
+    volume_name=None, driver=None, labels={}, options={}
+)
+
+ +
+ +

Creates a volume

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
volume_name +
+

The volume name, if not provided, a long random +string will be used instead.

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
driver +
+

Specify volume driver name (default "local")

+
+

+ + TYPE: + Optional[str] + + + DEFAULT: + None + +

+
labels +
+

Set metadata for a volume

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
options +
+

Set driver specific options

+
+

+ + TYPE: + Dict[str, str] + + + DEFAULT: + {} + +

+
+ +
+ +
+ +
+ + +

+ exists + + +

+
exists(x)
+
+ +
+ +

Returns True if the volume exists. False otherwise.

+

It's just calling docker.volume.inspect(...) and verifies that it doesn't throw + a python_on_whales.exceptions.NoSuchVolume.

+

Returns

+
A `bool`
+
+ +
+ +
+ +
+ + +

+ list + + +

+
list(filters={})
+
+ +
+ +

List volumes

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
filters +
+

See the Docker documentation page about filtering +. +An example filters=dict(dangling=1, driver="local").

+
+

+ + TYPE: + Dict[str, Union[str, int]] + + + DEFAULT: + {} + +

+
+

Returns

+
`List[python_on_whales.Volume]`
+
+ +
+ +
+ +
+ + +

+ prune + + +

+
prune(filters={}, all=False)
+
+ +
+ +

Remove volumes

+ + + + + + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
filters +
+

See the Docker documentation page about filtering +. +An example filters=dict(dangling=1, driver="local").

+
+

+ + TYPE: + Dict[str, Union[str, int]] + + + DEFAULT: + {} + +

+
all +
+

Remove all unused volumes, not just anonymous ones.

+
+

+ + TYPE: + bool + + + DEFAULT: + False + +

+
+ +
+ +
+ +
+ + +

+ remove + + +

+
remove(x)
+
+ +
+ +

Removes one or more volumes

+ + + + + + + + + + + + + + + +
PARAMETERDESCRIPTION
x +
+

A volume or a list of volumes. An empty list as argument means +nothing is done.

+
+

+ + TYPE: + Union[ValidVolume, List[ValidVolume]] + +

+
+ +
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/user_guide/docker_run/index.html b/user_guide/docker_run/index.html new file mode 100644 index 00000000..3b548f55 --- /dev/null +++ b/user_guide/docker_run/index.html @@ -0,0 +1,1086 @@ + + + + + + + + + + + + + + + + + + + + + + + + docker.run() guide - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

The different ways of using docker.run()

+

Simple call

+
from python_on_whales import docker
+
+stdout_as_str = docker.run("hello-world")
+print(stdout_as_str)
+
+# Hello from Docker!
+# This message shows that your installation appears to be working correctly.
+# ...
+
+

This is the simplest way. The function docker.run(...) returns only when the container +is done and the output (stdout) is returned all at once in a single string.

+

This is very practical for simple use cases, but not so much when you have a container that +needs to run for a very long time for example, as you don't get the output in real time.

+

Detach the container

+
from python_on_whales import docker
+from redis import Redis
+
+redis_container = docker.run("redis", detach=True, publish=[(6379, 6379)])
+# the container is up and listening on port 6379
+
+redis_client = Redis()
+redis_client.set("hello", "world")
+print(redis_client.get("hello"))
+# b'world'
+
+

This is a very simple way to start a container in the background. It will continue running +until the process inside exits. It's useful when running servers for example, because they should +never stop.

+

Detach with the context manager

+
from python_on_whales import docker
+from redis import Redis
+
+with docker.run("redis", detach=True, publish=[(6379, 6379)]) as redis_container:
+    # the container is up and listening on port 6379
+    redis_client = Redis()
+    redis_client.set("hello", "world")
+    print(redis_client.get("hello"))
+    # b'world'
+
+print("The container is now stopped and removed because we're outside the context manager")
+print(redis_container.state.running)  # will raise an error with the message "no such container"
+
+

Using the context manager is quite useful when you need the container running in the background +but you need to know exactly for how long it will live.

+

For example in unit tests, you might need a redis server to execute a function. +You can then have the redis container running only during this specific unit test.

+

This is also better than calling manually redis_container.remove(). Why? +For the same reason it's better to do with open(...) as f: than f = open(...). If an exception occurs +in the context manager block, the container is still removed.

+

Stream the output

+
from python_on_whales import docker
+
+output_generator = docker.run("busybox", ["ping", "-c", "50", "www.google.com"], stream=True, name="box")
+
+for stream_type, stream_content in output_generator:
+    print(f"Stream type: {stream_type}, stream content: {stream_content}")
+
+# Stream type: stdout, stream content: b'PING www.google.com (142.250.74.228): 56 data bytes\n'
+# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=0 ttl=119 time=18.350 ms\n'
+# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=1 ttl=119 time=18.386 ms\n'
+# ...
+# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=48 ttl=119 time=18.494 ms\n'
+# Stream type: stdout, stream content: b'64 bytes from 142.250.74.228: seq=49 ttl=119 time=18.260 ms\n'
+# Stream type: stdout, stream content: b'\n'
+# Stream type: stdout, stream content: b'--- www.google.com ping statistics ---\n'
+# Stream type: stdout, stream content: b'50 packets transmitted, 50 packets received, 0% packet loss\n'
+# Stream type: stdout, stream content: b'round-trip min/avg/max = 17.547/18.075/18.508 ms\n'
+
+# when the generator is done and we're out of the loop
+# it means the container has finished running.
+print(docker.container.inspect("box").state.running)
+# False
+
+

This is very useful for long running processes. For example if you need the output +of a container that will stay up for a very long time.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/user_guide/exceptions/index.html b/user_guide/exceptions/index.html new file mode 100644 index 00000000..6dfa4773 --- /dev/null +++ b/user_guide/exceptions/index.html @@ -0,0 +1,1009 @@ + + + + + + + + + + + + + + + + + + + + + + dealing with exceptions - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Capturing exceptions

+

Exception classes

+

Exceptions raised will be an instance of DockerException, or a child class for +more specific errors.

+

Those are the child classes:

+
    +
  • NoSuchContainer
  • +
  • NoSuchImage
  • +
  • NoSuchService
  • +
  • NotASwarmManager
  • +
  • NoSuchVolume
  • +
+

All exceptions will have these 4 attributes:

+
    +
  • docker_command: the docker command used internally, as a list of strings.
  • +
  • return_code: the exit code docker client exited with, as an int
  • +
  • stdout: the content that docker wrote to stdout, as a string, or None
  • +
  • stderr: the content that docker wrote to stderr, as a string, or None
  • +
+

Example

+
import logging
+from python_on_whales import DockerClient
+from python_on_whales.exceptions import DockerException
+
+client = DockerClient(compose_files=["/tmp/docker-compose.yml"])
+try:
+    client.execute("my-service", ["arg1", "arg2"])
+except DockerException as e:
+    print(f"Exit code {e.return_code} while running {e.docker_command}")
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/user_guide/generic_resources/index.html b/user_guide/generic_resources/index.html new file mode 100644 index 00000000..063c5630 --- /dev/null +++ b/user_guide/generic_resources/index.html @@ -0,0 +1,1165 @@ + + + + + + + + + + + + + + + + + + + + + + + + Swarm generic resources - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Docker Swarm generic resources

+

There are two kind of generic resources, discreet and named.

+

Both are declared in /etc/docker/daemon.json and both are +accessible in your containers as environment variables.

+

Named resources

+

Named resources should be used when you have a small number of things you want accessed. +The best example is gpu devices. Each gpu has a UUID, which can be the +name of this resources. Actually you could also use an index, and this index would have +to be the "name" of the gpu.

+

Since we want to show they're generic, let's take something else than GPUs for this example.

+

Let's say you have 5 hamsters connected to your node, making an app run:

+

logo +logo +logo +logo +logo

+

They are named Robert, Lucie, Annie, James and Stacy.

+

You'll define one service that needs one hamster and one that needs three. +We'll call them my_light_service and my_heavy_service.

+

Let's declare the hamsters in the /etc/docker/daemon.json. If this file doesn't exist +on your system, you can create it.

+

Mine looks like this, note that you don't need the insecure registries part:

+
{
+    "insecure-registries": ["127.0.0.1:5000"],
+    "node-generic-resources": [
+        "hamster=Robert",
+        "hamster=Lucie",
+        "hamster=Annie",
+        "hamster=James",
+        "hamster=Stacy"
+    ]
+}
+
+

Restart your Docker daemon with sudo service docker restart.

+

Then create a Docker swarm: docker swarm init

+

The hamster are declared, up and ready to go! +You can check they're here with docker node ls and docker node inspect.

+

Creating services with the CLI

+

It's time to create services and hit those hamsters!

+

First we'll create the services with the CLI and then with the command line.

+
$ docker service create --generic-resource "hamster=1" --name my_light_service ubuntu bash -c "env && sleep infinity"
+$ docker service create --generic-resource "hamster=3" --name my_heavy_service ubuntu bash -c "env && sleep infinity"
+
+

We have one replica for the light and heavy service. They use 4 hamster. Let's try to use moooooooore!

+
$ docker service scale -d my_light_service=10 my_heavy_service=10
+$ docker service ls
+ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
+tt436bxjtdn7        my_heavy_service    replicated          1/10                 ubuntu:latest
+ksiq5x0bxch1        my_light_service    replicated          2/10                 ubuntu:latest
+
+

Remember, we only have 5 hamsters, and 3 are needed for the heavy service and one for the light service. +Hence here 2 * 1 + 1 * 3 = 5 ! This is what we wanted. So how does each container knows which hamster to use?

+

We asked each container to print the environment variables and sleep for infinity env && sleep infinity. +Let's take a look with docker logs:

+
$ docker ps
+CONTAINER ID IMAGE          COMMAND                NAMES
+1e8932f5a985 ubuntu:latest  "bash -c 'env && sle…" my_light_service.4.shys2wwxz7jjfjg2g2e0xl1sw
+0a5c4ddd303a ubuntu:latest  "bash -c 'env && sle…" my_heavy_service.1.p39satddgf6j1uhspdiohcyzh
+e2872006cc97 ubuntu:latest  "bash -c 'env && sle…" my_light_service.1.bbo0fbi5d5e2zdwozgbse8x57
+
+$ docker logs my_light_service.4.shys2wwxz7jjfjg2g2e0xl1sw
+DOCKER_RESOURCE_HAMSTER=Stacy
+HOSTNAME=1e8932f5a985
+
+$ docker logs my_heavy_service.1.p39satddgf6j1uhspdiohcyzh
+DOCKER_RESOURCE_HAMSTER=Lucie,Annie,James
+HOSTNAME=0a5c4ddd303a
+
+$ docker logs my_light_service.1.bbo0fbi5d5e2zdwozgbse8x57
+DOCKER_RESOURCE_HAMSTER=Robert
+HOSTNAME=e2872006cc97
+
+

So we can see that each container is aware of it's hamster with an environment variable. +The process running in the container can grab it and then use the correct hamster without +making two containers use the same hamster.

+

Using hamsters with Docker stack

+

Here is a docker-compose.yml that will declare the services exactly like we did in the CLI:

+
version: "3.8"
+
+services:
+  my_light_service:
+    command:
+      - bash
+      - -c
+      - env && sleep infinity
+    image: ubuntu
+    deploy:
+      replicas: 10
+      resources:
+        reservations:
+          generic_resources:
+            - discrete_resource_spec:
+                kind: 'hamster'
+                value: 1
+
+  my_heavy_service:
+    command:
+      - bash
+      - -c
+      - env && sleep infinity
+    image: ubuntu
+    deploy:
+      replicas: 10
+      resources:
+        reservations:
+          generic_resources:
+            - discrete_resource_spec:
+                kind: 'hamster'
+                value: 3
+
+
$ docker stack deploy -c docker-compose.yml my_stack_using_hamsters
+Creating network my_stack_using_hamsters_default
+Creating service my_stack_using_hamsters_my_heavy_service
+Creating service my_stack_using_hamsters_my_light_service
+
+$ docker service ls
+ID              NAME                                       MODE        REPLICAS  IMAGE 
+nlhwfnz0d1cx    my_stack_using_hamsters_my_heavy_service   replicated  1/10      ubuntu:latest
+c77tv3czzfw2    my_stack_using_hamsters_my_light_service   replicated  2/10      ubuntu:latest
+
+

How does that fit with Nvidia GPUs?

+

Well, if you remember, the Nvidia runtime uses environment variables in the container to know which gpu to use.

+

By modifying the /etc/nvidia-container-runtime/config.toml, +and setting swarm-resource = "DOCKER_RESOURCE_GPU", it indicates the nvidia-docker runtime +that it should watch for this environment variable when deciding which gpu to use. +Make the nvidia-docker runtime the default one for this node, replace hamster by gpu and you're good to +go as long as you used UUID as your hamster's names.

+

A more in depth guide can be found here.

+

Discreet resources

+

TODO (just put "node-generic-resources": ["hamster=100"] in the daemon.json, there are too many hamsters to give them names).

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/user_guide/running_python_on_whales_inside_a_container/index.html b/user_guide/running_python_on_whales_inside_a_container/index.html new file mode 100644 index 00000000..180b221a --- /dev/null +++ b/user_guide/running_python_on_whales_inside_a_container/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + Running python-on-whales inside a container - Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Running python-on-whales inside a container

+

To follow this example, you just need Docker installed, and nothing else!

+

The use case

+

Sometimes you don't want to install Python on your system, but you still +would like to use python-on-whales to handle most of the Docker logic.

+

You can then run python-on-whales inside a Docker container. For simplicity, +we let the container access the Docker daemon of the host.

+

Let's give you the code example, and we'll explain afterwards where is the magic.

+

Example

+

We want to run this small Python script. It uses python-on-whales. We'll call it main.py

+
# main.py
+from python_on_whales import docker
+
+print("We are going to run the hello world docker container")
+
+output = docker.run("hello-world")
+
+print("Here is the output:")
+print(output)
+
+print(f"buildx version: {docker.buildx.version()}")
+print(f"compose version: {docker.compose.version()}")
+
+

Next to this main.py, make a Dockerfile.

+
# Dockerfile
+FROM python:3.9
+
+RUN pip install python-on-whales
+RUN python-on-whales download-cli
+
+# install docker buildx, this step is optional
+RUN mkdir -p ~/.docker/cli-plugins/
+RUN wget https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64 -O ~/.docker/cli-plugins/docker-buildx
+RUN chmod a+x  ~/.docker/cli-plugins/docker-buildx
+
+# install docker compose, this step is optional
+RUN mkdir -p ~/.docker/cli-plugins/
+RUN wget https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-linux-x86_64 -O ~/.docker/cli-plugins/docker-compose
+RUN chmod a+x  ~/.docker/cli-plugins/docker-compose
+
+COPY ./main.py /main.py
+CMD python /main.py
+
+

We're all set! Let's run this Python script, without having Python installed on the system!

+
docker build -t image-with-python-on-whales .
+docker run -v /var/run/docker.sock:/var/run/docker.sock image-with-python-on-whales
+
+

You should see this output:

+
We are going to run the hello world docker container
+Here is the output:
+
+Hello from Docker!
+This message shows that your installation appears to be working correctly.
+
+To generate this message, Docker took the following steps:
+ 1. The Docker client contacted the Docker daemon.
+ 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
+    (amd64)
+ 3. The Docker daemon created a new container from that image which runs the
+    executable that produces the output you are currently reading.
+ 4. The Docker daemon streamed that output to the Docker client, which sent it
+    to your terminal.
+
+To try something more ambitious, you can run an Ubuntu container with:
+ $ docker run -it ubuntu bash
+
+Share images, automate workflows, and more with a free Docker ID:
+ https://hub.docker.com/
+
+For more examples and ideas, visit:
+ https://docs.docker.com/get-started/
+
+buildx version: github.com/docker/buildx v0.6.3 266c0eac611d64fcc0c72d80206aa364e826758d
+compose version: Docker Compose version v2.0.0-rc.2
+
+

How does it work?

+

The main magic here is the sharing of the docker socket between the host and the container. +This is done with the -v /var/run/docker.sock:/var/run/docker.sock.

+

With this option, the container can have access to the docker API. But it still needs the binary client in Go. +Download it in the dockerfile with python-no-whales download-cli. You can then optionally install buildx and compose.

+

Then you're good to go! Simple as that.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file

s*8VdX&Nht*SpWq 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%0Defw$`|58OnxJNenVY2kY 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 00000000..47f5ee48 --- /dev/null +++ b/index.html @@ -0,0 +1,1237 @@ + + + + + + + + + + + + + + + + + + + + Python on whales + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +