CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">Improving performance for Docker on Mac computers when using named volumes | by Sandra Beier | Netresearch | Medium</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2021-05-07T08:59:21.488Z"/><meta data-rh="true" name="title" content="Improving performance for Docker on Mac computers when using named volumes | by Sandra Beier | Netresearch | Medium"/><meta data-rh="true" property="og:title" content="Improving performance for Docker on Mac computers when using named volumes"/><meta data-rh="true" property="al:android:url" content="medium://p/55580efcbf68"/><meta data-rh="true" property="al:ios:url" content="medium://p/55580efcbf68"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="As a senior software developer at Netresearch, Benjamin has been supporting Magento, Akeneo and Docker projects since 2016. Even beyond projects, he researches in these areas in order to be able to…"/><meta data-rh="true" property="og:description" content="During use of Docker, we found that the performance on Mac is significantly worse than on other systems. Read how to improve it."/><meta data-rh="true" property="og:url" content="https://medium.com/netresearch/improving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68"/><meta data-rh="true" property="al:web:url" content="https://medium.com/netresearch/improving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/resize:fit:1200/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg"/><meta data-rh="true" property="article:author" content="https://medium.com/@sandra.beier"/><meta data-rh="true" name="author" content="Sandra Beier"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Improving performance for Docker on Mac computers when using named volumes"/><meta data-rh="true" name="twitter:site" content="@netresearch"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/55580efcbf68"/><meta data-rh="true" property="twitter:description" content="During use of Docker, we found that the performance on Mac is significantly worse than on other systems. Read how to improve it."/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/resize:fit:1200/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="13 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" rel="preconnect" href="https://glyph.medium.com" crossOrigin=""/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@sandra.beier"/><link data-rh="true" rel="canonical" href="https://medium.com/netresearch/improving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/55580efcbf68"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*6IE6yzQKNQPKBxYI5AzuBA.jpeg"],"url":"https:\u002F\u002Fmedium.com\u002Fnetresearch\u002Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68","dateCreated":"2019-12-10T12:41:12.653Z","datePublished":"2019-12-10T12:41:12.653Z","dateModified":"2021-12-12T22:44:04.440Z","headline":"Improving performance for Docker on Mac computers when using named volumes","name":"Improving performance for Docker on Mac computers when using named volumes","description":"As a senior software developer at Netresearch, Benjamin has been supporting Magento, Akeneo and Docker projects since 2016. Even beyond projects, he researches in these areas in order to be able to…","identifier":"55580efcbf68","author":{"@type":"Person","name":"Sandra Beier","url":"https:\u002F\u002Fmedium.com\u002F@sandra.beier"},"creator":["Sandra Beier"],"publisher":{"@type":"Organization","name":"Netresearch","url":"https:\u002F\u002Fmedium.com\u002Fnetresearch","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002Fnetresearch\u002Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68"}</script><style type="text/css" data-fela-rehydration="566" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="566" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(42, 149, 160, 1)}.es{border-color:rgba(42, 149, 160, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(42, 149, 160, 1)}.ez:disabled:hover{border-color:rgba(42, 149, 160, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-left:-12px}.ii{width:28px}.ij{height:28px}.ik{z-index:1}.il{width:24px}.im{margin-bottom:2px}.in{flex-wrap:nowrap}.io{font-size:16px}.ip{line-height:24px}.ir{margin:0 8px}.is{display:inline}.it{color:rgba(42, 149, 160, 1)}.iu{fill:rgba(42, 149, 160, 1)}.ix{flex:0 0 auto}.ja{flex-wrap:wrap}.jb{white-space:pre-wrap}.jc{margin-right:4px}.jd{overflow:hidden}.je{max-height:20px}.jf{text-overflow:ellipsis}.jg{display:-webkit-box}.jh{-webkit-line-clamp:1}.ji{-webkit-box-orient:vertical}.jj{word-break:break-all}.jl{padding-left:8px}.jm{padding-right:8px}.kn> *{flex-shrink:0}.ko{overflow-x:scroll}.kp::-webkit-scrollbar{display:none}.kq{scrollbar-width:none}.kr{-ms-overflow-style:none}.ks{width:74px}.kt{flex-direction:row}.ku{z-index:2}.kx{-webkit-user-select:none}.ky{border:0}.kz{fill:rgba(117, 117, 117, 1)}.lc{outline:0}.ld{user-select:none}.le> svg{pointer-events:none}.ln{cursor:progress}.lo{opacity:1}.lp{padding:4px 0}.ls{margin-top:0px}.lt{width:16px}.lv{display:inline-flex}.mb{max-width:100%}.mc{padding:8px 2px}.md svg{color:#6B6B6B}.mu{margin-left:auto}.mv{margin-right:auto}.mw{max-width:200px}.nc{clear:both}.nd{height:auto}.ne{margin-top:10px}.nf{max-width:728px}.ni{line-height:1.58}.nj{letter-spacing:-0.004em}.nk{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.of{margin-bottom:-0.46em}.og{font-style:italic}.oh{text-decoration:underline}.oi{max-width:2600px}.op{cursor:zoom-in}.oq{z-index:auto}.os{line-height:1.12}.ot{letter-spacing:-0.022em}.ou{font-weight:600}.pp{margin-bottom:-0.28em}.pv{line-height:1.18}.qj{margin-bottom:-0.31em}.qk{clear:left}.ql{float:left}.qm{font-size:66px}.qn{line-height:.83}.qt{max-width:1028px}.qu{list-style-type:decimal}.qv{margin-left:30px}.qw{padding-left:0px}.rc{list-style-type:disc}.rd{overflow-x:auto}.re{font-family:source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace}.rf{padding:20px}.rg{border-radius:0}.rh{background:#F2F2F2}.ri{margin-top:-0.09em}.rj{margin-bottom:-0.09em}.rk{min-width:fit-content}.rl{margin-top:0.91em}.rm{margin-bottom:26px}.rn{margin-top:6px}.ro{margin-top:8px}.rp{margin-right:8px}.rq{padding:8px 16px}.rr{border-radius:100px}.rs{transition:background 300ms ease}.ru{white-space:nowrap}.rv{border-top:none}.rw{margin-bottom:50px}.rx{height:52px}.ry{max-height:52px}.rz{box-sizing:content-box}.sa{position:static}.sc{max-width:155px}.si{margin-right:20px}.sj{margin-bottom:64px}.sk{margin-bottom:48px}.sy{border-radius:2px}.ta{height:64px}.tb{width:64px}.tc{align-self:flex-end}.td{flex:1 1 auto}.tj{padding-right:4px}.tk{font-weight:500}.tr{margin-top:16px}.ts{color:rgba(255, 255, 255, 1)}.tt{fill:rgba(255, 255, 255, 1)}.tu{background:rgba(25, 25, 25, 1)}.tv{border-color:rgba(25, 25, 25, 1)}.ty:disabled{opacity:0.1}.tz:disabled:hover{background:rgba(25, 25, 25, 1)}.ua:disabled:hover{border-color:rgba(25, 25, 25, 1)}.ub{margin-bottom:54px}.uc{height:0px}.ud{gap:18px}.ue{fill:rgba(61, 61, 61, 1)}.uq{border-bottom:solid 1px #E5E5E5}.ur{margin-top:72px}.us{padding:24px 0}.ut{margin-bottom:0px}.uu{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(48, 128, 136, 1)}.eu:hover{border-color:rgba(48, 128, 136, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.iq:hover{text-decoration:underline}.iv:hover:not(:disabled){color:rgba(48, 128, 136, 1)}.iw:hover:not(:disabled){fill:rgba(48, 128, 136, 1)}.lb:hover{fill:rgba(8, 8, 8, 1)}.lq:hover{fill:#000000}.lr:hover p{color:#000000}.lu:hover{color:#000000}.me:hover svg{color:#000000}.rt:hover{background-color:#F2F2F2}.sz:hover{background-color:none}.tw:hover{background:#000000}.tx:hover{border-color:#242424}.uf:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.la:focus{fill:rgba(8, 8, 8, 1)}.mf:focus svg{color:#000000}.or:focus{transform:scale(1.01)}.lf:active{border-style:none}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:50px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.jz{border-top:solid 1px #F2F2F2}.ka{border-bottom:solid 1px #F2F2F2}.kb{margin:32px 0 0}.kc{padding:3px 8px}.kl> *{margin-right:24px}.km> :last-child{margin-right:0}.lm{margin-top:0px}.ma{margin:0}.nb{margin-top:40px}.ob{font-size:20px}.oc{margin-top:2.14em}.od{line-height:32px}.oe{letter-spacing:-0.003em}.on{margin-top:56px}.pl{font-size:24px}.pm{margin-top:1.95em}.pn{line-height:30px}.po{letter-spacing:-0.016em}.pu{margin-top:0.94em}.qg{margin-top:1.72em}.qh{line-height:24px}.qi{letter-spacing:0}.qs{padding-top:7px}.rb{margin-top:1.14em}.sh{display:inline-block}.sl{flex-direction:row}.so{margin-bottom:0}.sp{margin-right:20px}.te{max-width:500px}.uk{margin:40px 0 0}.up{padding-top:72px}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ll{margin-top:0px}.ng{margin-left:auto}.nh{text-align:center}.sg{display:inline-block}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lk{margin-top:0px}.sf{display:inline-block}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.li{margin-top:0px}.lj{margin-right:0px}.se{display:inline-block}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:2px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.iy{flex-direction:column}.jn{margin:24px -24px 0}.jo{padding:0}.kd> *{margin-right:8px}.ke> :last-child{margin-right:24px}.kv{margin-left:0px}.lg{margin-top:0px}.lh{margin-right:0px}.lw{margin:0}.mg{border:1px solid #F2F2F2}.mh{border-radius:99em}.mi{padding:0px 16px 0px 12px}.mj{height:38px}.mk{align-items:center}.mm svg{margin-right:8px}.mx{margin-top:32px}.nl{font-size:18px}.nm{margin-top:1.56em}.nn{line-height:28px}.no{letter-spacing:-0.003em}.oj{margin-top:40px}.ov{font-size:20px}.ow{margin-top:1.2em}.ox{line-height:24px}.oy{letter-spacing:0}.pq{margin-top:0.67em}.pw{font-size:16px}.px{margin-top:1.23em}.qo{padding-top:0}.qx{margin-top:1.34em}.sd{display:inline-block}.sw{margin-bottom:20px}.sx{margin-right:0}.ti{max-width:100%}.tl{font-size:24px}.tm{line-height:30px}.tn{letter-spacing:-0.016em}.ug{margin:32px 0 0}.ul{padding-top:48px}.ml:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:50px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jv{border-top:solid 1px #F2F2F2}.jw{border-bottom:solid 1px #F2F2F2}.jx{margin:32px 0 0}.jy{padding:3px 8px}.kj> *{margin-right:24px}.kk> :last-child{margin-right:0}.lz{margin:0}.na{margin-top:40px}.nx{font-size:20px}.ny{margin-top:2.14em}.nz{line-height:32px}.oa{letter-spacing:-0.003em}.om{margin-top:56px}.ph{font-size:24px}.pi{margin-top:1.95em}.pj{line-height:30px}.pk{letter-spacing:-0.016em}.pt{margin-top:0.94em}.qd{margin-top:1.72em}.qe{line-height:24px}.qf{letter-spacing:0}.qr{padding-top:7px}.ra{margin-top:1.14em}.sm{flex-direction:row}.sq{margin-bottom:0}.sr{margin-right:20px}.tf{max-width:500px}.uj{margin:40px 0 0}.uo{padding-top:72px}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:50px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jr{border-top:solid 1px #F2F2F2}.js{border-bottom:solid 1px #F2F2F2}.jt{margin:32px 0 0}.ju{padding:3px 8px}.kh> *{margin-right:24px}.ki> :last-child{margin-right:0}.ly{margin:0}.mz{margin-top:40px}.nt{font-size:20px}.nu{margin-top:2.14em}.nv{line-height:32px}.nw{letter-spacing:-0.003em}.ol{margin-top:56px}.pd{font-size:24px}.pe{margin-top:1.95em}.pf{line-height:30px}.pg{letter-spacing:-0.016em}.ps{margin-top:0.94em}.qa{margin-top:1.72em}.qb{line-height:24px}.qc{letter-spacing:0}.qq{padding-top:7px}.qz{margin-top:1.14em}.sn{flex-direction:row}.ss{margin-bottom:0}.st{margin-right:20px}.tg{max-width:500px}.ui{margin:40px 0 0}.un{padding-top:72px}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:2px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iz{flex-direction:column}.jp{margin:24px 0 0}.jq{padding:0}.kf> *{margin-right:8px}.kg> :last-child{margin-right:8px}.kw{margin-left:0px}.lx{margin:0}.mn{border:1px solid #F2F2F2}.mo{border-radius:99em}.mp{padding:0px 16px 0px 12px}.mq{height:38px}.mr{align-items:center}.mt svg{margin-right:8px}.my{margin-top:32px}.np{font-size:18px}.nq{margin-top:1.56em}.nr{line-height:28px}.ns{letter-spacing:-0.003em}.ok{margin-top:40px}.oz{font-size:20px}.pa{margin-top:1.2em}.pb{line-height:24px}.pc{letter-spacing:0}.pr{margin-top:0.67em}.py{font-size:16px}.pz{margin-top:1.23em}.qp{padding-top:0}.qy{margin-top:1.34em}.su{margin-bottom:20px}.sv{margin-right:0}.th{max-width:100%}.to{font-size:24px}.tp{line-height:30px}.tq{letter-spacing:-0.016em}.uh{margin:32px 0 0}.um{padding-top:48px}.ms:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="print">.sb{display:none}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jk{max-height:none}</style><style type="text/css" data-fela-rehydration="566" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.oo{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F55580efcbf68&amp;%7Efeature=LoOpenInAppButton&amp;%7Echannel=ShowPostUnderCollection&amp;source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" rel="noopener follow" href="/?source=---top_nav_layout_nav-----------------------------------------"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" rel="noopener follow" href="/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnew-story&amp;source=---top_nav_layout_nav-----------------------new_post_topnav------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" rel="noopener follow" href="/search?source=---top_nav_layout_nav-----------------------------------------"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><button class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton">Sign up</button></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" rel="noopener follow" href="/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="587b" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">Improving performance for Docker on Mac computers when using named volumes</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a rel="noopener follow" href="/@sandra.beier?source=post_page---byline--55580efcbf68---------------------------------------"><div class="l ib ic by id ie"><div class="l fj"><img alt="Sandra Beier" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/2*xiPqJIDY8AJkvMWhELSuxA.jpeg" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div><div class="ih ab fj"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/netresearch?source=post_page---byline--55580efcbf68---------------------------------------" rel="noopener follow"><div class="l ii ij by id ik"><div class="l fj"><img alt="Netresearch" class="l fd by br il cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*6JBii4k5U9UAFcUxChuNlA.png" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="if by l br il fs n ig ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="im ab q"><div class="ab q in"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b io ip bk"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" data-testid="authorName" rel="noopener follow" href="/@sandra.beier?source=post_page---byline--55580efcbf68---------------------------------------">Sandra Beier</a></p></div></div></div><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b io ip du"><span><a class="it iu ah ai aj ak al am an ao ap aq ar ex iv iw" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F9c84072ae3af&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;user=Sandra+Beier&amp;userId=9c84072ae3af&amp;source=post_page-9c84072ae3af--byline--55580efcbf68---------------------post_header------------------">Follow</a></span></p></div></div></span></div></div><div class="l ix"><span class="bf b bg z du"><div class="ab cn iy iz ja"><div class="fu fv ab"><div class="bf b bg z du ab jb"><span class="jc l ix">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar iq ab q" data-testid="publicationName" href="https://medium.com/netresearch?source=post_page---byline--55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b bg z jd je jf jg jh ji jj jk bk">Netresearch</p></a></div></div></div><div class="h k"><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">13 min read</span><div class="jl jm l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Dec 10, 2019</span></div></span></div></span></div></div></div><div class="ab cp jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc"><div class="h k w fg fh q"><div class="ks l"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fnetresearch%2F55580efcbf68&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;user=Sandra+Beier&amp;userId=9c84072ae3af&amp;source=---header_actions--55580efcbf68---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao ky lo lp ab q fk lq lr" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="ls"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div><div class="ab q kd ke kf kg kh ki kj kk kl km kn ko kp kq kr"><div class="lt k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F55580efcbf68&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;source=---header_actions--55580efcbf68---------------------bookmark_footer------------------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lu" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd lv cn"><div class="l ae"><div class="ab cb"><div class="lw lx ly lz ma mb ci bh"><div class="ab"><div class="bm" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al mc an ao ap ex md me lr mf mg mh mi mj s mk ml mm mn mo mp mq u mr ms mt"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al mc an ao ap ex md me lr mf mg mh mi mj s mk ml mm mn mo mp mq u mr ms mt"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><figure class="mx my mz na nb nc mu mv paragraph-image"><div class="mu mv mw"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 1100w, https://miro.medium.com/v2/resize:fit:400/format:webp/1*rUFWEs1QRrl3lBvneLgMQQ.png 400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 200px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*rUFWEs1QRrl3lBvneLgMQQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*rUFWEs1QRrl3lBvneLgMQQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*rUFWEs1QRrl3lBvneLgMQQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*rUFWEs1QRrl3lBvneLgMQQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*rUFWEs1QRrl3lBvneLgMQQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*rUFWEs1QRrl3lBvneLgMQQ.png 1100w, https://miro.medium.com/v2/resize:fit:400/1*rUFWEs1QRrl3lBvneLgMQQ.png 400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 200px"/><img alt="" class="bh mb nd c" width="200" height="200" loading="eager" role="presentation"/></picture></div><figcaption class="ne ff nf mu mv ng nh bf b bg z du">Author: Benjamin Heuer</figcaption></figure><p id="eb70" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk"><em class="og">As a senior software developer at </em><a class="af oh" href="https://www.netresearch.de/en/" rel="noopener ugc nofollow" target="_blank"><em class="og">Netresearch</em></a><em class="og">, Benjamin has been supporting Magento, Akeneo and Docker projects since 2016. Even beyond projects, he researches in these areas in order to be able to advance future projects in the best possible quality.</em></p><figure class="oj ok ol om on nc mu mv paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="mu mv oi"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1400/1*6IE6yzQKNQPKBxYI5AzuBA.jpeg 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mb nd c" width="700" height="404" loading="lazy" role="presentation"/></picture></div></div></figure><p id="b81d" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">At Netresearch, Docker is a long established tool to provision and deploy our applications likewise to production systems as well as to the local systems of our developers. We’ve been using it for about four years now. Since we are expanding our services with the <a class="af oh" href="https://www.blugento.com/" rel="noopener ugc nofollow" target="_blank">Blugento</a> ShopFactory, Docker is a crucial component for our automated processes, like testing environments or setting up the same system multiple times for scaling the application. This eliminates many of the problems which can occur if the environment on the production system differs even slightly from the development system.</p><p id="1278" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Right now, we are focussing our efforts on making Docker easy to use on a daily basis for backend, frontend, and fullstack developers as well as non-developers. We want to provide a fast and user-friendly environment for every operating system. During our work, we noticed that the Docker performance on Mac computers — using the same setup — is considerably worse than on Windows and Linux computers.</p><h1 id="b18d" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Background of this research</h1><p id="c8b3" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">As mentioned in the introduction section, we noticed a significantly increased loading time for all processes within Docker setups when the source files for the application were mounted to the host system. This is mostly done by the developers who need to connect their local XDebug with the application to find errors or test the behavior of specific parts within the application. This is also shown in the table in “<strong class="nk gv">Docker Performance Tests</strong>”.</p><h2 id="96e5" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">What do we use and why?</h2><p id="8c1d" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Our project’s images contain precompiled and prebuilt sources to speed up the start of the applications, and to ensure that the source files are identical on every system. If something went wrong or if somebody wanted to install the project locally, we needed a way to copy those files to the host system with the ability to make live changes to the system. For this reason, and since we don’t know the OS of the specific user, we looked for for a way which works independently of the OS. At first, we built the sources locally on our own computers and mounted them into the containers. This approach worked and with the “<strong class="nk gv">:delegated</strong>” flag the performance was good as well. The downsides were that you needed a second, Mac-only configuration file to add the “<strong class="nk gv">:delegated</strong>” flag to the volumes, and that you needed to copy the sources — ideally via an automated process — to the outside of the container, in order to not build it twice.</p><p id="1f6b" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The next approach was using <a class="af oh" href="https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">SSHFS</strong></a>. This allowed us to connect the sources from a “developer container” equipped with a SSH server to the host and thus make them accessible. However, we had some problems getting it to run under Windows, because on Windows, the virtual machine and the port required for SSHFS could not be connected at the same time. The second downside was the usability. If you restarted your container or your computer without closing the connection first, you had to kill the (dead) SSHFS connection and reconnect the SSHFS directory, since it had an invalid state after the restart process. This turned out to be more and more annoying during daily use.</p><p id="acb6" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Our current approach is using things which are included in docker-compose and Docker itself, the latter providing a more shell-like syntax. We share the sources within our services via “Named Volumes” and use a local driver to decide where the volume content should be bound to. This solution and our general structure can be seen <a class="af oh" href="https://github.com/docker/compose/issues/4675#issuecomment-519016744" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">here</strong></a>. It generally works for all three systems, aside from the performance issue which I want to solve in this research.</p><h1 id="88fc" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Docker environments</h1><p id="e9a2" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">When starting with Mac and Docker, you have to decide how you want to use Docker in general. At the time of writing, there are two options which I would now like to discuss in more detail.</p><h2 id="d702" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Docker Toolbox</h2><p id="af8e" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Docker Toolbox is the classic approach to use Docker on a Mac system. It uses <a class="af oh" href="https://www.virtualbox.org/" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">VirtualBox</strong></a> as a virtual machine in which you run your applications. With this approach, you might have difficulties with permissions and more complex applications, but it is older and more stable.</p><h2 id="db0d" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Docker Desktop for Mac (formerly known as Docker for Mac)</h2><p id="0dc6" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Docker Desktop for Mac uses <a class="af oh" href="https://github.com/docker/HyperKit/" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">HyperKit</strong></a> which is ultimately also a virtual machine, but more lightweight and “Mac-native”. This approach is faster and you can act independently of a “real” virtual machine where you have to link your Docker executables across your system. But for more complex applications you might suffer from port restrictions. Quote from the official docs:</p><p id="eb8c" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk qk"><span class="l ql qm qn bo qo qp qq qr qs fj">“A</span>lso note that Docker Desktop for Mac can’t route traffic to containers, so you can’t directly access an exposed port on a running container from the hosting machine.”</p><p id="e583" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk qk"><span class="l ql qm qn bo qo qp qq qr qs fj">“I</span>f you do need multiple VMs, such as when testing multi-node swarms, you can continue to use Docker Machine, which operates outside the scope of Docker Desktop for Mac. See <a class="af oh" href="https://docs.docker.com/docker-for-mac/docker-toolbox/#docker-toolbox-and-docker-for-mac-coexistence" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">Docker Toolbox and Docker Desktop for Mac coexistence</strong></a>”.</p><p id="ce01" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk"><em class="og">I am not sure about the technical background, but I was able to run and expose an nginx service via port 80 and 8080, and both worked. If some of you are interested in this topic and want to check this, or if you know already the “real” restriction, please tell me.</em></p><p id="85be" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">For this research, I will try to run an application via Docker Desktop for Mac to avoid issues between my system and VirtualBox.</p><h1 id="bf1b" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Docker performance tests</h1><p id="65fd" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">As a test application, I chose Akeneo, because it is more lightweight than Magento regarding the amount of files and dependencies of the system.</p><p id="a0ba" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Since I use Linux and thus apparently have the least problems and best performance of all three systems, I will use it as the baseline for this comparison.</p><figure class="oj ok ol om on nc mu mv paragraph-image"><div role="button" tabindex="0" class="oo op fj oq bh or"><div class="mu mv qt"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*8PT3767cZc1tTUG_UDHP2Q.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*8PT3767cZc1tTUG_UDHP2Q.png 640w, https://miro.medium.com/v2/resize:fit:720/1*8PT3767cZc1tTUG_UDHP2Q.png 720w, https://miro.medium.com/v2/resize:fit:750/1*8PT3767cZc1tTUG_UDHP2Q.png 750w, https://miro.medium.com/v2/resize:fit:786/1*8PT3767cZc1tTUG_UDHP2Q.png 786w, https://miro.medium.com/v2/resize:fit:828/1*8PT3767cZc1tTUG_UDHP2Q.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*8PT3767cZc1tTUG_UDHP2Q.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*8PT3767cZc1tTUG_UDHP2Q.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mb nd c" width="700" height="412" loading="lazy" role="presentation"/></picture></div></div><figcaption class="ne ff nf mu mv ng nh bf b bg z du">Results</figcaption></figure><h2 id="b66d" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Explanation</h2><p id="20d7" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">These are the different scenarios:</p><ol class=""><li id="2fdd" class="ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of qu qv qw bk">Time for starting the Docker setup (<strong class="nk gv">docker-compose up -d</strong>) without sample data</li><li id="71e2" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Time for the first page load. Here I will use the <strong class="nk gv">app-dev.php</strong> since Symfony delivers some debug tools along with the page</li><li id="a0f6" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Average time to navigate through the pages (average of 7 calls)</li><li id="3a35" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Call of the <strong class="nk gv">cache:clear</strong> and <strong class="nk gv">cache:warmup</strong> commands</li><li id="f445" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Restarting the setup (<strong class="nk gv">docker-compose down &amp;&amp; docker-compose up -d</strong>)</li><li id="3af9" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Time for the first page load</li></ol><p id="bd58" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">These are the environments where the tests were run:</p><ol class=""><li id="5645" class="ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of qu qv qw bk">Ubuntu system (baseline) with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and database via named volume mounts</li><li id="920d" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Mac with all development services, exposing port 80 directly without any kind of proxy, but without any shared volumes</li><li id="fc39" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via named volume mounts</li><li id="0270" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via named volume mounts and the delegated flag</li><li id="14d4" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via <a class="af oh" href="https://docker-sync.readthedocs.io/en/latest/" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">docker-sync</strong></a></li><li id="e78a" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of qu qv qw bk">Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via <a class="af oh" href="https://mutagen.io/documentation/introduction/" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">mutagen.io</strong></a></li></ol><h1 id="815e" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Docker setup</h1><p id="a7e5" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">After those pure facts, I would like to describe the setup for the individual environments in more detail. If one scenario is what you want to achieve, you can duplicate it. I used our internal Akeneo setup for the docker-compose files.</p><h1 id="c64f" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Default setup preparations</h1><ul class=""><li id="c733" class="ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of rc qv qw bk">Prepare the Docker system with Akeneo, a database, and a webserver with PHP</li><li id="ad9d" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk">Add the local address (akeneo.local) to your hosts-file</li><li id="2219" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk"><em class="og">HINT: If you have multiple docker-compose files, you can add this ENV variable to omit the necessity to call the “up” command with all files as parameters. Otherwise, you would have to explicitly specify all YAML files to boot. For example: </em><strong class="nk gv"><em class="og">COMPOSE_FILE=docker-compose.yml:docker-compose.override.yml</em></strong></li><li id="bbaa" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk">Pull the images: <strong class="nk gv">docker-compose pull</strong></li><li id="e825" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk">Start Akeneo: <strong class="nk gv">docker-compose up -d</strong></li><li id="6b34" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk">Wait until your system is ready</li><li id="eb16" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk">See the result in your browser at <a class="af oh" href="http://akeneo.local" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">http://akeneo.local</strong></a></li></ul><h1 id="bf5b" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Mac setup without shared volumes</h1><p id="9293" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">This is the easiest setup. Just follow the instructions and you’re good to go.</p><h2 id="7a14" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Advantages</h2><p id="8b27" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">This setup is as fast as the Ubuntu solution.</p><h2 id="e9bc" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Disadvantages</h2><p id="c543" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">There is no easy way to access and change the files as a developer.</p><h1 id="16d5" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Mac setup with shared volumes via named volume mounts</h1><p id="66f1" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">For this environment, you can use the previous one, but you must do the following BEFORE you start the setup:</p><p id="6675" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Un-comment the mount options in the upper part of the <strong class="nk gv">docker-compose.override.yml</strong> and add the Elastic Search database. The upper part should look like this:</p><pre class="oj ok ol om on rd re rf rg ay rh bk"><span id="cab2" class="pv ot gu re b io ri rj l jb rk">volumes:</span><span id="6e06" class="pv ot gu re b io rl rj l jb rk"># $PWD is only available on Unix-based systems (Linux, MacOs), Windows might need absolute paths</span><span id="5212" class="pv ot gu re b io rl rj l jb rk">akeneo:<br/> driver: local<br/> driver_opts:<br/> type: none<br/> device: ${PWD}/mnt/src # absolute path ONLY<br/> o: bind</span><span id="8cd4" class="pv ot gu re b io rl rj l jb rk">data:<br/> driver: local<br/> driver_opts:<br/> type: none<br/> device: ${PWD}/mnt/assets # absolute path ONLY<br/> o: bind</span><span id="c35c" class="pv ot gu re b io rl rj l jb rk">database:<br/> driver: local<br/> driver_opts:<br/> type: none<br/> device: ${PWD}/mnt/database # absolute path ONLY<br/> o: bind</span><span id="da95" class="pv ot gu re b io rl rj l jb rk">esDatabase:<br/> driver: local<br/> driver_opts:<br/> type: none<br/> device: ${PWD}/mnt/esDatabase # absolute path ONLY<br/> o: bind</span></pre><p id="d33f" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Create the directories you want to use (like mnt/*). Add the following environment variable to the end of the .env file, since the copy process will take a lot longer than the default 60 seconds: <strong class="nk gv">COMPOSE_HTTP_TIMEOUT=500</strong></p><h2 id="2622" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Advantages</h2><p id="c078" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">The permissions aren’t an issue. If you change and add ACLs for your user ID so that you can access files with the user ID expected within your containers, Hyperkit seems to work with that rather well. I was able to change my local user for files in my IDE, and inside the developer container they still belonged to www-data. Nice handling.</p><h2 id="ce80" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Disadvantages</h2><p id="c4ce" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">It is about ten times slower than the Ubuntu or the non-shared setup.</p><h1 id="c33e" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Mac setup with shared volumes via named volume mounts using the delegated flag</h1><p id="cddd" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">This approach failed, because if you use the delegated flag together with the volume mounts, Docker for Mac searches the files in another directory and cannot find them:</p><pre class="oj ok ol om on rd re rf rg ay rh bk"><span id="5089" class="pv ot gu re b io ri rj l jb rk">ERROR: for base-package_setup_1 Cannot start service setup:<br/>OCI runtime create failed:<br/> container_linux.go:345:<br/> starting container process caused <strong class="re gv">&quot;process_linux.go:430:<br/> container init caused &quot;</strong>rootfs_linux.go:58:<br/> mounting <strong class="re gv">&quot;/var/lib/docker/volumes/base-package_akeneo/_data&quot;<br/></strong> to rootfs <strong class="re gv">&quot;/var/lib/docker/overlay2/053b184a8cc131e322e5bf6d4bbf58aff0030bd33984eb79e80e280379935ee4/merged&quot;<br/></strong> at <strong class="re gv">&quot;/var/lib/docker/overlay2/053b184a8cc131e322e5bf6d4bbf58aff0030bd33984eb79e80e280379935ee4/merged/var/www/html&quot;<br/></strong> caused <strong class="re gv">&quot;no such file or directory&quot;&quot;&quot;</strong>:<br/> unknown</span></pre><p id="d111" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Not sure if there is a workaround, but after reading the above articles, I do not expect miracles. So I skipped this in favour of the next two approaches.</p><h1 id="1534" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Mac setup with shared volumes via docker-sync</h1><p id="22f9" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Before we can configure our setup, we must set up docker-sync. Install it via <a class="af oh" href="https://docker-sync.readthedocs.io/en/latest/getting-started/installation.html#installation-osx" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">https://docker-sync.readthedocs.io/en/latest/getting-started/installation.html#installation-osx</strong></a>.</p><p id="42c5" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">I use Unison as the sync tool, just out of gut feeling and because of the impression I had reading through the articles. It seems to have better sync methods for deleted files and more watch capabilities than rsync. Based on the documentation, I will use the native OSX sync strategy:</p><p id="85e5" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk qk"><span class="l ql qm qn bo qo qp qq qr qs fj">“N</span>ative-OSX is a combination of two concepts, <a class="af oh" href="https://github.com/EugenMayer/docker-sync/issues/346" rel="noopener ugc nofollow" target="_blank"><strong class="nk gv">OSXFS only</strong></a> and Unison together.”</p><p id="1775" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Now you have different ways of implementing docker-sync into your project. To keep the setup simple for my colleagues, I tried the docker-compose approach provided by docker-sync itself. I added a new docker-compose file into the project: <strong class="nk gv">docker-compose.docker-sync.yml</strong>.</p><p id="62a6" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">I then added the new file at the end of my <strong class="nk gv">COMPOSE_FILE</strong> variable in my .env file, so it looked like this:</p><p id="a42e" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk"><strong class="nk gv">COMPOSE_FILE=docker-compose.yml:docker-compose.override.yml:docker-compose.network.yml:docker-compose.docker-sync.yml</strong>.</p><p id="ac5c" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">In my compose file, I synced the <strong class="nk gv">/var/www/html</strong> directory and my <strong class="nk gv">/var/akeneo</strong> directory to work with the system and check the logs and history of processes:</p><pre class="oj ok ol om on rd re rf rg ay rh bk"><span id="71c0" class="pv ot gu re b io ri rj l jb rk">####################################################################</span><span id="aa4f" class="pv ot gu re b io rl rj l jb rk"># Addition to Build an Akeneo image with Docker sync to share the core application with the host machine<br/># dependencies within the docker compose file<br/># Possible usage:<br/># docker-compose -f docker-compose.yml -f docker-compose.network.yml -f docker-compose.docker-sync.yml up -d</span><span id="2119" class="pv ot gu re b io rl rj l jb rk">####################################################################</span><span id="0a54" class="pv ot gu re b io rl rj l jb rk"><strong class="re gv">version: &#x27;3.5&#x27;<br/>services:<br/></strong> # Service to actual synchronize the named volume and the given path<br/> <strong class="re gv">akeneo-syncer:</strong> # sync the akeneo named volume<br/> <strong class="re gv">image:</strong> eugenmayer/unison:2.51.2.1<br/> <strong class="re gv">command:</strong> /entrypoint.sh supervisord<br/> <strong class="re gv">volumes:<br/></strong> - ./mnt/src:/host_sync<br/> - akeneo:/app_sync<br/> <strong class="re gv">environment:<br/> </strong># These variables control which directories are synced by Unison.<br/> - HOST_VOLUME=/host_sync<br/> - APP_VOLUME=/app_sync<br/> - UNISON_SRC=/host_sync<br/> - UNISON_DEST=/app_sync<br/> - UNISON_DIR=/data<br/> # IMPORTANT: Use the user’s ID here which uses the shared directory inside of the container<br/> - OWNER_UID=1001<br/> # NEAT: Add directories to ignore here. &quot;node_modules&quot; are many files without a debugging or developing purpose<br/> - UNISON_ARGS=-ignore=<strong class="re gv">&#x27;Name node_modules&#x27;</strong> -prefer /host_sync -numericids -auto -batch<br/> - UNISON_WATCH_ARGS=-repeat watch<br/> - TZ=Europe/Berlin<br/> - LANG=C.UTF<strong class="re gv">-8<br/></strong> - HOME=/root</span><span id="1e3d" class="pv ot gu re b io rl rj l jb rk"><strong class="re gv">data-syncer:</strong> # Sync the data named volume<br/> <strong class="re gv">image:</strong> eugenmayer/unison:2.51.2.1<br/> <strong class="re gv">command:</strong> /entrypoint.sh supervisord<br/> <strong class="re gv">volumes:<br/></strong> - ./mnt/assets:/host_sync<br/> - data:/app_sync<br/> <strong class="re gv">environment:<br/></strong> # These variables control which directories are synced by unison.<br/> - HOST_VOLUME=/host_sync<br/> - APP_VOLUME=/app_sync<br/> - UNISON_SRC=/host_sync<br/> - UNISON_DEST=/app_sync<br/> - UNISON_DIR=/data<br/> # IMPORTANT: Use the user’s ID which uses the shared directory inside of the container<br/> - OWNER_UID=1001<br/> # NEAT: Add directories to ignore here. &quot;cache&quot; are many files without a debugging or developing purpose<br/> - UNISON_ARGS=-ignore=<strong class="re gv">&#x27;Name cache&#x27;</strong> -prefer /host_sync -numericids -auto -batch<br/> - UNISON_WATCH_ARGS=-repeat watch<br/> - TZ=Europe/Berlin<br/> - LANG=C.UTF<strong class="re gv">-8<br/></strong> - HOME=/root</span></pre><p id="3bdd" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">NOTE:</p><p id="ab4e" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Despite the hint from the documentation, we do NOT use the :nocopy suffix because it would break our current volume/container logic. See this <a class="af oh" href="https://github.com/docker/docker.github.io/issues/2992#issuecomment-299596714" rel="noopener ugc nofollow" target="_blank">Image</a> for a better understanding of the reason:</p><p id="43b2" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Image of nocopy Workflow: <a class="af oh" href="https://cloud.githubusercontent.com/assets/1525937/25767468/574d9570-31ae-11e7-8886-d7923fbc68fb.png" rel="noopener ugc nofollow" target="_blank">https://cloud.githubusercontent.com/assets/1525937/25767468/574d9570-31ae-11e7-8886-d7923fbc68fb.png</a></p><h2 id="f979" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Advantages</h2><p id="eadb" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">This approach is easy to implement. The boilerplates give many examples on how docker-sync can be configured: <a class="af oh" href="https://github.com/EugenMayer/docker-sync-boilerplate" rel="noopener ugc nofollow" target="_blank">https://github.com/EugenMayer/docker-sync-boilerplate</a>. Even with plain default settings, I have achieved almost the same performance as on the Ubuntu system. With more experimenting and tweaking or playing around with the sync strategies, I think you can get an even faster synchronization.</p><p id="1201" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Excluding directories from the volume is a neat feature. You can speed up your system if you exclude (for your host system) useless directories like the node_modules, which saves index space for docker-sync and your IDE.</p><p id="82d3" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Mapping the user between the container and your system works out of the box and simplifies the process.<br/>Everything can be configured via a yaml file or as ENV variables</p><p id="2e96" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">One note about the time in brackets in the table:</p><p id="dd25" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">One request — in particular, one of the first — took way longer than the rest, so maybe it was a spike. Ignoring it, I reached the other average of 300 ms per content load.</p><h2 id="a9b5" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Disadvantages</h2><p id="e375" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Starting the environment takes about twice as long as the baseline reference. Especially the CSS generation takes time, but not much more than calling it directly in your running system. Maybe this is related to the sync process indexing the files or something.</p><p id="319d" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">One service can only sync one volume, so you need one service per volume. With an increasing number of services, the performance will get worse, depending on the amount of files you are synchronizing. You can still go a hybrid way, though. For example, you can mount the database volumes as named volumes, like in the previous section, and only use docker-sync for the main volume for development and debugging.</p><h1 id="ba2c" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Mac setup with shared volumes via Mutagen IO</h1><p id="72c5" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Before we can utilize this, we must install Mutagen: <a class="af oh" href="https://mutagen.io/documentation/introduction/installation/" rel="noopener ugc nofollow" target="_blank">https://mutagen.io/documentation/introduction/installation/</a>.</p><p id="4bb5" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Add the daemon to our user, as described in the CLI command line help: <strong class="nk gv">mutagen daemon register</strong> and <strong class="nk gv">mutagen daemon start</strong>.</p><p id="58cb" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Start Akeneo without named volumes, like in the first Mac environment. When the system runs, just start your listener to sync the files between your system and the container. For Akeneo without the node_modules directory, it takes about 42 s until the watcher is ready to watch.</p><pre class="oj ok ol om on rd re rf rg ay rh bk"><span id="2988" class="pv ot gu re b io ri rj l jb rk">mutagen sync create — name=akeneoSrc -m=two-way-resolved — symlink-mode ignore -i node_modules \</span><span id="5221" class="pv ot gu re b io rl rj l jb rk">docker://www-data@base-package_devbox_1/var/www/html/ mnt/src \</span><span id="1e5a" class="pv ot gu re b io rl rj l jb rk">&amp;&amp; mutagen sync monitor</span></pre><p id="870a" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The logic behind this call is the following:</p><p id="6aee" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The first path <strong class="nk gv">“docker://…”</strong> is “alpha” and <strong class="nk gv">“mnt/src”</strong> is “beta”. Depending on your sync mode, both paths will be equally synced or not, which can lead to conflicts. With the parameter <strong class="nk gv">“-m=two-way-resolved”</strong> alpha always wins. That is why the Docker container containing the files should be alpha here.</p><p id="9759" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">You can run as many syncs as you want and keep track of them via the name: <strong class="nk gv">“–name=akeneoSrc”</strong>. In the default mode, Mutagen apparently handles symlinks not very well, so for now I set it to ignore them: <strong class="nk gv">“ — symlink-mode ignore”</strong>. Otherwise, it won’t find the redirections and will not work.</p><p id="4d51" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The “alpha” path contains three elements: <strong class="nk gv">“docker://www-data@”</strong> is the way to use Docker remotes for the sync. The “www-data” part is the way of telling Mutagen to copy and handle all files as this specific user. Otherwise, it will use the default user of the container. <strong class="nk gv">“base-package_devbox_1”</strong> is the name of the container. With some bash/grep logic you could also find a more automated way for make-files to call a specific container. The last part <strong class="nk gv">“/var/www/html/”</strong> is the path within the container which should be shared.</p><p id="9b5b" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">As with docker-sync, we can exclude directories which should not be synced: <strong class="nk gv">“-i node_modules”</strong>. Since one line that long might be inefficient and error-prone, you can define a <strong class="nk gv">mutagen.yml</strong> in the same directory and use that instead of putting everything in this single-line-command.</p><p id="874d" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">NOTE:</p><p id="b47b" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">The default mode for synchronized files is 700 instead of the project-specific 644+xS. You can also define the file mode via a parameter or config file, otherwise after changing something in your IDE, it changes the file mode to 700.</p><h2 id="7688" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Advantages</h2><p id="e9ba" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">Mutagen is a tool with the capabilities to synchronize multiple systems in essentially real-time. It is independent of your setup and subsequent processes, so the performance should not be affected, as proven in the table on the top of this page. You can also define many small configurations like directory excludes and so on. You can sync the local and remote system at the same time and therefore orchestrate multiple systems at the same time or publish bug fixes to any system you have access to. You also have forward capabilities, which in theory could replace the proxy. But I haven’t tested that yet.</p><h2 id="99d6" class="pv ot gu bf ou pw px dy oy py pz ea pc nt qa qb qc nx qd qe qf ob qg qh qi qj bk">Disadvantages</h2><p id="0cf3" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">It is more difficult to get started, because there aren’t many examples for a docker-compose setup like we have it. Also, despite the popularity Mutagen seems to have (after speaking with some agencies at conferences), I can’t find much on the internet about Mutagen and Docker.</p><h1 id="e4b2" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Conclusion</h1><p id="7c97" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">With the use of docker-sync or Mutagen it should be possible to provide the same structure and logic for a debuggable and production-ready Docker environment independent of the OS. While docker-sync is the easiest solutions, Mutagen delivers the best performance and at first glance the most fields of use, not only providing Mac users a better performance than with named volumes.</p><h1 id="59f9" class="os ot gu bf ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp bk">Sources</h1><p id="abfe" class="pw-post-body-paragraph ni nj gu nk b nl pq nn no np pr nr ns nt ps nv nw nx pt nz oa ob pu od oe of gn bk">These are the sources I used for finding the differences between the tools mentioned:</p><ul class=""><li id="eb9f" class="ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of rc qv qw bk"><a class="af oh" href="https://docs.docker.com/docker-for-mac/docker-toolbox/" rel="noopener ugc nofollow" target="_blank">https://docs.docker.com/docker-for-mac/docker-toolbox/</a></li><li id="0f66" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk"><a class="af oh" href="https://blog.rocketinsights.com/speeding-up-docker-development-on-the-mac/" rel="noopener ugc nofollow" target="_blank">https://blog.rocketinsights.com/speeding-up-docker-development-on-the-mac/</a></li><li id="6b7c" class="ni nj gu nk b nl qx nn no np qy nr ns nt qz nv nw nx ra nz oa ob rb od oe of rc qv qw bk"><a class="af oh" href="https://stories.amazee.io/docker-on-mac-performance-docker-machine-vs-docker-for-mac-4c64c0afdf99" rel="noopener ugc nofollow" target="_blank">https://stories.amazee.io/docker-on-mac-performance-docker-machine-vs-docker-for-mac-4c64c0afdf99</a></li></ul><p id="204c" class="pw-post-body-paragraph ni nj gu nk b nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of gn bk">Learn more about Netresearch <a class="af oh" href="https://www.netresearch.de/en/" rel="noopener ugc nofollow" target="_blank">here</a>.</p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rm rn ab ja"><div class="ro ab"><a class="rp ay am ao" rel="noopener follow" href="/tag/docker?source=post_page-----55580efcbf68---------------------------------------"><div class="rq fj cx rr ge rs rt bf b bg z bk ru">Docker</div></a></div><div class="ro ab"><a class="rp ay am ao" rel="noopener follow" href="/tag/performance?source=post_page-----55580efcbf68---------------------------------------"><div class="rq fj cx rr ge rs rt bf b bg z bk ru">Performance</div></a></div><div class="ro ab"><a class="rp ay am ao" rel="noopener follow" href="/tag/mac?source=post_page-----55580efcbf68---------------------------------------"><div class="rq fj cx rr ge rs rt bf b bg z bk ru">Mac</div></a></div></div></div></div><div class="l"></div><footer class="rv rw rx ry rz ab q sa ik c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp sb"><div class="ab q kt"><div class="sc l"><span class="l sd se sf e d"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fnetresearch%2F55580efcbf68&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;user=Sandra+Beier&amp;userId=9c84072ae3af&amp;source=---footer_actions--55580efcbf68---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></span><span class="l h g f sg sh"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fnetresearch%2F55580efcbf68&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;user=Sandra+Beier&amp;userId=9c84072ae3af&amp;source=---footer_actions--55580efcbf68---------------------clap_footer------------------"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao ky lo lp ab q fk lq lr" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="ls"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div></div><div class="ab q"><div class="si l ix"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" rel="noopener follow" href="/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2F55580efcbf68&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnetresearch%2Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68&amp;source=---footer_actions--55580efcbf68---------------------bookmark_footer------------------"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lu" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="si l ix"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al mc an ao ap ex md me lr mf"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="sj l"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="sk l"><div class="ab sl sm sn iz iy"><div class="so sp sq sr ss st su sv sw sx ab cp"><div class="h k"><a href="https://medium.com/netresearch?source=post_page---post_publication_info--55580efcbf68---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Netresearch" class="sy ib ic cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*6JBii4k5U9UAFcUxChuNlA.png" width="48" height="48" loading="lazy"/><div class="sy l ic ib fs n fr sz"></div></div></a></div><div class="j i d"><a href="https://medium.com/netresearch?source=post_page---post_publication_info--55580efcbf68---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Netresearch" class="sy tb ta cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*6JBii4k5U9UAFcUxChuNlA.png" width="64" height="64" loading="lazy"/><div class="sy l ta tb fs n fr sz"></div></div></a></div><div class="j i d tc ix"><div class="ab"></div></div></div><div class="ab co td"><div class="te tf tg th ti l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://medium.com/netresearch?source=post_page---post_publication_info--55580efcbf68---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf tk tl tm tn to tp tq nt qb qc nx qe qf ob qh qi bk"><span class="gn tj">Published in <!-- -->Netresearch</span></h2></a><div class="ro ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/netresearch/followers?source=post_page---post_publication_info--55580efcbf68---------------------------------------">16 Followers</a></span></div><div class="bf b bg z du ab jb"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/netresearch/b2b-marketplace-features-top-10-features-für-b2b-marktplätze-dc978020275?source=post_page---post_publication_info--55580efcbf68---------------------------------------">Last published <span>Oct 10, 2022</span></a></div></div><div class="tr l"><p class="bf b bg z bk"><span class="gn">Company Magazine of Netresearch</span></p></div></div></div><div class="h k"><div class="ab"></div></div></div></div><div class="ab sl sm sn iz iy"><div class="so sp sq sr ss st su sv sw sx ab cp"><div class="h k"><a tabindex="0" rel="noopener follow" href="/@sandra.beier?source=post_page---post_author_info--55580efcbf68---------------------------------------"><div class="l fj"><img alt="Sandra Beier" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/2*xiPqJIDY8AJkvMWhELSuxA.jpeg" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay sz"></div></div></a></div><div class="j i d"><a tabindex="0" rel="noopener follow" href="/@sandra.beier?source=post_page---post_author_info--55580efcbf68---------------------------------------"><div class="l fj"><img alt="Sandra Beier" class="l fd by ta tb cx" src="https://miro.medium.com/v2/resize:fill:128:128/2*xiPqJIDY8AJkvMWhELSuxA.jpeg" width="64" height="64" loading="lazy"/><div class="fr by l ta tb fs n ay sz"></div></div></a></div><div class="j i d tc ix"><div class="ab"><span><button class="bf b bg z ts rq tt tu tv tw tx ev ew ty tz ua fa fb fc fd bm fe ff">Follow</button></span></div></div></div><div class="ab co td"><div class="te tf tg th ti l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" rel="noopener follow" href="/@sandra.beier?source=post_page---post_author_info--55580efcbf68---------------------------------------"><h2 class="pw-author-name bf tk tl tm tn to tp tq nt qb qc nx qe qf ob qh qi bk"><span class="gn tj">Written by <!-- -->Sandra Beier</span></h2></a><div class="ro ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/@sandra.beier/followers?source=post_page---post_author_info--55580efcbf68---------------------------------------">1 Follower</a></span></div><div class="bf b bg z du ab jb"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/@sandra.beier/following?source=post_page---post_author_info--55580efcbf68---------------------------------------">5 Following</a></div></div><div class="tr l"><p class="bf b bg z bk"><span class="gn">Marketer &amp; blogger. Since 2011 she has been gaining experience in e-commerce &amp; web development from various perspectives.</span></p></div></div></div><div class="h k"><div class="ab"><span><button class="bf b bg z ts rq tt tu tv tw tx ev ew ty tz ua fa fb fc fd bm fe ff">Follow</button></span></div></div></div></div></div></div><div class="ub l"><div class="uc bh r sj"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf tk ov ox oy oz pb pc pd pf pg ph pj pk pl pn po bk">No responses yet</h2><div class="ab ud"><div><div class="bm" aria-hidden="false"><a class="ue uf" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--55580efcbf68---------------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div><div class="ug uh ui uj uk l"></div></div></div></div><div class="ul um un uo up l bx"><div class="h k j"><div class="uc bh uq ur"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="us ab kt ja"><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/about?autoplay=1&amp;source=post_page-----55580efcbf68---------------------------------------"><p class="bf b dv z du">About</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----55580efcbf68---------------------------------------"><p class="bf b dv z du">Careers</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="mailto:pressinquiries@medium.com" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="ut uu l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----55580efcbf68---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="ut l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow" href="/business?source=post_page-----55580efcbf68---------------------------------------"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20250225-171551-096f9e72ed"</script><script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"","group":"enabled","tags":["group-edgeCachePosts","post-55580efcbf68","user-9c84072ae3af","collection-85a18ce596e3"],"serverVariantState":"44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a","middlewareEnabled":true,"cacheStatus":"DYNAMIC","shouldUseCache":true,"vary":[],"pubFeaturingPostPageLabelEnabled":false,"pubHierarchyFlagGroup":"control"},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"DEFAULT","explicit":false},"viewerIsBot":false},"debug":{"requestId":"565196b0-6909-480f-8126-8403df2b671a","requestTag":"","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-16e93bdfba0b0706625d1a8180238261-58f9c52f50d945a4-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Fnetresearch\u002Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68","host":"medium.com","hostname":"medium.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"","currentHash":""},"config":{"nodeEnv":"production","version":"main-20250225-171551-096f9e72ed","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20250225-171551-096f9e72ed","commit":"096f9e72ed521472e35a09682b36bded1c308eb5"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"collectionByDomainOrSlug({\"domainOrSlug\":\"netresearch\"})":{"__ref":"Collection:85a18ce596e3"},"postResult({\"id\":\"55580efcbf68\"})":{"__ref":"Post:55580efcbf68"}},"ImageMetadata:":{"__typename":"ImageMetadata","id":"","originalWidth":0,"originalHeight":0},"Collection:85a18ce596e3":{"__typename":"Collection","id":"85a18ce596e3","favicon":{"__ref":"ImageMetadata:"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFE4F7FA","point":0},{"__typename":"ColorPoint","color":"#FFDFF6F9","point":0.1},{"__typename":"ColorPoint","color":"#FFD9F5F9","point":0.2},{"__typename":"ColorPoint","color":"#FFD4F5F9","point":0.3},{"__typename":"ColorPoint","color":"#FFCEF4F9","point":0.4},{"__typename":"ColorPoint","color":"#FFC8F3F8","point":0.5},{"__typename":"ColorPoint","color":"#FFC2F2F8","point":0.6},{"__typename":"ColorPoint","color":"#FFBCF1F8","point":0.7},{"__typename":"ColorPoint","color":"#FFB6F0F8","point":0.8},{"__typename":"ColorPoint","color":"#FFAFEFF8","point":0.9},{"__typename":"ColorPoint","color":"#FFA8EFF7","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF2A95A0","point":0},{"__typename":"ColorPoint","color":"#FF2E8B94","point":0.1},{"__typename":"ColorPoint","color":"#FF308088","point":0.2},{"__typename":"ColorPoint","color":"#FF30747C","point":0.3},{"__typename":"ColorPoint","color":"#FF2F696F","point":0.4},{"__typename":"ColorPoint","color":"#FF2D5D63","point":0.5},{"__typename":"ColorPoint","color":"#FF2A5156","point":0.6},{"__typename":"ColorPoint","color":"#FF254549","point":0.7},{"__typename":"ColorPoint","color":"#FF20383B","point":0.8},{"__typename":"ColorPoint","color":"#FF192B2D","point":0.9},{"__typename":"ColorPoint","color":"#FF101D1E","point":1}]},"tintBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FF2F99A4","colorPoints":[{"__typename":"ColorPoint","color":"#FF2F99A4","point":0},{"__typename":"ColorPoint","color":"#FF4DA5AF","point":0.1},{"__typename":"ColorPoint","color":"#FF65B0B9","point":0.2},{"__typename":"ColorPoint","color":"#FF79BBC4","point":0.3},{"__typename":"ColorPoint","color":"#FF8DC6CD","point":0.4},{"__typename":"ColorPoint","color":"#FF9FD1D7","point":0.5},{"__typename":"ColorPoint","color":"#FFB1DBE1","point":0.6},{"__typename":"ColorPoint","color":"#FFC2E5EA","point":0.7},{"__typename":"ColorPoint","color":"#FFD3EFF3","point":0.8},{"__typename":"ColorPoint","color":"#FFE4F9FC","point":0.9},{"__typename":"ColorPoint","color":"#FFF4FFFF","point":1}]}},"domain":null,"slug":"netresearch","googleAnalyticsId":null,"name":"Netresearch","avatar":{"__ref":"ImageMetadata:1*6JBii4k5U9UAFcUxChuNlA.png"},"description":"Company Magazine of Netresearch","subscriberCount":16,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:dc978020275"}]},"isAuroraVisible":false,"tintColor":"#FF2F99A4","newsletterV3":null,"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:85a18ce596e3-viewerId:lo_4c5cb3cc7dc6"},"twitterUsername":"netresearch","facebookPageId":null,"logo":{"__ref":"ImageMetadata:"}},"ImageMetadata:1*6JBii4k5U9UAFcUxChuNlA.png":{"__typename":"ImageMetadata","id":"1*6JBii4k5U9UAFcUxChuNlA.png"},"User:691646d97eec":{"__typename":"User","id":"691646d97eec","customDomainState":null,"hasSubdomain":false,"username":"marketing_netresearch"},"Post:dc978020275":{"__typename":"Post","id":"dc978020275","firstPublishedAt":1665396606037,"creator":{"__ref":"User:691646d97eec"},"collection":{"__ref":"Collection:85a18ce596e3"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fnetresearch\u002Fb2b-marketplace-features-top-10-features-f%C3%BCr-b2b-marktpl%C3%A4tze-dc978020275","sequence":null,"uniqueSlug":"b2b-marketplace-features-top-10-features-für-b2b-marktplätze-dc978020275"},"LinkedAccounts:9c84072ae3af":{"__typename":"LinkedAccounts","mastodon":null,"id":"9c84072ae3af"},"User:9c84072ae3af":{"__typename":"User","id":"9c84072ae3af","linkedAccounts":{"__ref":"LinkedAccounts:9c84072ae3af"},"isSuspended":false,"name":"Sandra Beier","imageId":"2*xiPqJIDY8AJkvMWhELSuxA.jpeg","customDomainState":null,"hasSubdomain":false,"username":"sandra.beier","verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":1,"followingCount":3,"collectionFollowingCount":2},"bio":"Marketer & blogger. Since 2011 she has been gaining experience in e-commerce & web development from various perspectives.","membership":null,"allowNotes":true,"viewerEdge":{"__ref":"UserViewerEdge:userId:9c84072ae3af-viewerId:lo_4c5cb3cc7dc6"},"twitterScreenName":""},"Paragraph:140a37075c3c_0":{"__typename":"Paragraph","id":"140a37075c3c_0","name":"587b","type":"H3","href":null,"layout":null,"metadata":null,"text":"Improving performance for Docker on Mac computers when using named volumes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*rUFWEs1QRrl3lBvneLgMQQ.png":{"__typename":"ImageMetadata","id":"1*rUFWEs1QRrl3lBvneLgMQQ.png","originalHeight":200,"originalWidth":200,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:140a37075c3c_1":{"__typename":"Paragraph","id":"140a37075c3c_1","name":"c18c","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*rUFWEs1QRrl3lBvneLgMQQ.png"},"text":"Author: Benjamin Heuer","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_2":{"__typename":"Paragraph","id":"140a37075c3c_2","name":"eb70","type":"P","href":null,"layout":null,"metadata":null,"text":"As a senior software developer at Netresearch, Benjamin has been supporting Magento, Akeneo and Docker projects since 2016. Even beyond projects, he researches in these areas in order to be able to advance future projects in the best possible quality.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":34,"end":45,"href":"https:\u002F\u002Fwww.netresearch.de\u002Fen\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":251,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*6IE6yzQKNQPKBxYI5AzuBA.jpeg":{"__typename":"ImageMetadata","id":"1*6IE6yzQKNQPKBxYI5AzuBA.jpeg","originalHeight":1500,"originalWidth":2600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:140a37075c3c_3":{"__typename":"Paragraph","id":"140a37075c3c_3","name":"314f","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*6IE6yzQKNQPKBxYI5AzuBA.jpeg"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_4":{"__typename":"Paragraph","id":"140a37075c3c_4","name":"b81d","type":"P","href":null,"layout":null,"metadata":null,"text":"At Netresearch, Docker is a long established tool to provision and deploy our applications likewise to production systems as well as to the local systems of our developers. We’ve been using it for about four years now. Since we are expanding our services with the Blugento ShopFactory, Docker is a crucial component for our automated processes, like testing environments or setting up the same system multiple times for scaling the application. This eliminates many of the problems which can occur if the environment on the production system differs even slightly from the development system.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":264,"end":272,"href":"https:\u002F\u002Fwww.blugento.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_5":{"__typename":"Paragraph","id":"140a37075c3c_5","name":"1278","type":"P","href":null,"layout":null,"metadata":null,"text":"Right now, we are focussing our efforts on making Docker easy to use on a daily basis for backend, frontend, and fullstack developers as well as non-developers. We want to provide a fast and user-friendly environment for every operating system. During our work, we noticed that the Docker performance on Mac computers — using the same setup — is considerably worse than on Windows and Linux computers.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_6":{"__typename":"Paragraph","id":"140a37075c3c_6","name":"b18d","type":"H3","href":null,"layout":null,"metadata":null,"text":"Background of this research","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_7":{"__typename":"Paragraph","id":"140a37075c3c_7","name":"c8b3","type":"P","href":null,"layout":null,"metadata":null,"text":"As mentioned in the introduction section, we noticed a significantly increased loading time for all processes within Docker setups when the source files for the application were mounted to the host system. This is mostly done by the developers who need to connect their local XDebug with the application to find errors or test the behavior of specific parts within the application. This is also shown in the table in “Docker Performance Tests”.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":418,"end":442,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_8":{"__typename":"Paragraph","id":"140a37075c3c_8","name":"96e5","type":"H4","href":null,"layout":null,"metadata":null,"text":"What do we use and why?","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_9":{"__typename":"Paragraph","id":"140a37075c3c_9","name":"8c1d","type":"P","href":null,"layout":null,"metadata":null,"text":"Our project’s images contain precompiled and prebuilt sources to speed up the start of the applications, and to ensure that the source files are identical on every system. If something went wrong or if somebody wanted to install the project locally, we needed a way to copy those files to the host system with the ability to make live changes to the system. For this reason, and since we don’t know the OS of the specific user, we looked for for a way which works independently of the OS. At first, we built the sources locally on our own computers and mounted them into the containers. This approach worked and with the “:delegated” flag the performance was good as well. The downsides were that you needed a second, Mac-only configuration file to add the “:delegated” flag to the volumes, and that you needed to copy the sources — ideally via an automated process — to the outside of the container, in order to not build it twice.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":622,"end":632,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":758,"end":768,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_10":{"__typename":"Paragraph","id":"140a37075c3c_10","name":"1f6b","type":"P","href":null,"layout":null,"metadata":null,"text":"The next approach was using SSHFS. This allowed us to connect the sources from a “developer container” equipped with a SSH server to the host and thus make them accessible. However, we had some problems getting it to run under Windows, because on Windows, the virtual machine and the port required for SSHFS could not be connected at the same time. The second downside was the usability. If you restarted your container or your computer without closing the connection first, you had to kill the (dead) SSHFS connection and reconnect the SSHFS directory, since it had an invalid state after the restart process. This turned out to be more and more annoying during daily use.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":28,"end":33,"href":"https:\u002F\u002Fwww.digitalocean.com\u002Fcommunity\u002Ftutorials\u002Fhow-to-use-sshfs-to-mount-remote-file-systems-over-ssh","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":28,"end":33,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_11":{"__typename":"Paragraph","id":"140a37075c3c_11","name":"acb6","type":"P","href":null,"layout":null,"metadata":null,"text":"Our current approach is using things which are included in docker-compose and Docker itself, the latter providing a more shell-like syntax. We share the sources within our services via “Named Volumes” and use a local driver to decide where the volume content should be bound to. This solution and our general structure can be seen here. It generally works for all three systems, aside from the performance issue which I want to solve in this research.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":331,"end":335,"href":"https:\u002F\u002Fgithub.com\u002Fdocker\u002Fcompose\u002Fissues\u002F4675#issuecomment-519016744","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":331,"end":335,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_12":{"__typename":"Paragraph","id":"140a37075c3c_12","name":"88fc","type":"H3","href":null,"layout":null,"metadata":null,"text":"Docker environments","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_13":{"__typename":"Paragraph","id":"140a37075c3c_13","name":"e9a2","type":"P","href":null,"layout":null,"metadata":null,"text":"When starting with Mac and Docker, you have to decide how you want to use Docker in general. At the time of writing, there are two options which I would now like to discuss in more detail.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_14":{"__typename":"Paragraph","id":"140a37075c3c_14","name":"d702","type":"H4","href":null,"layout":null,"metadata":null,"text":"Docker Toolbox","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_15":{"__typename":"Paragraph","id":"140a37075c3c_15","name":"af8e","type":"P","href":null,"layout":null,"metadata":null,"text":"Docker Toolbox is the classic approach to use Docker on a Mac system. It uses VirtualBox as a virtual machine in which you run your applications. With this approach, you might have difficulties with permissions and more complex applications, but it is older and more stable.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":78,"end":88,"href":"https:\u002F\u002Fwww.virtualbox.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":78,"end":88,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_16":{"__typename":"Paragraph","id":"140a37075c3c_16","name":"db0d","type":"H4","href":null,"layout":null,"metadata":null,"text":"Docker Desktop for Mac (formerly known as Docker for Mac)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_17":{"__typename":"Paragraph","id":"140a37075c3c_17","name":"0dc6","type":"P","href":null,"layout":null,"metadata":null,"text":"Docker Desktop for Mac uses HyperKit which is ultimately also a virtual machine, but more lightweight and “Mac-native”. This approach is faster and you can act independently of a “real” virtual machine where you have to link your Docker executables across your system. But for more complex applications you might suffer from port restrictions. Quote from the official docs:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":28,"end":36,"href":"https:\u002F\u002Fgithub.com\u002Fdocker\u002FHyperKit\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":28,"end":36,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_18":{"__typename":"Paragraph","id":"140a37075c3c_18","name":"eb8c","type":"P","href":null,"layout":null,"metadata":null,"text":"“Also note that Docker Desktop for Mac can’t route traffic to containers, so you can’t directly access an exposed port on a running container from the hosting machine.”","hasDropCap":true,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_19":{"__typename":"Paragraph","id":"140a37075c3c_19","name":"e583","type":"P","href":null,"layout":null,"metadata":null,"text":"“If you do need multiple VMs, such as when testing multi-node swarms, you can continue to use Docker Machine, which operates outside the scope of Docker Desktop for Mac. See Docker Toolbox and Docker Desktop for Mac coexistence”.","hasDropCap":true,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":174,"end":227,"href":"https:\u002F\u002Fdocs.docker.com\u002Fdocker-for-mac\u002Fdocker-toolbox\u002F#docker-toolbox-and-docker-for-mac-coexistence","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":174,"end":227,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_20":{"__typename":"Paragraph","id":"140a37075c3c_20","name":"ce01","type":"P","href":null,"layout":null,"metadata":null,"text":"I am not sure about the technical background, but I was able to run and expose an nginx service via port 80 and 8080, and both worked. If some of you are interested in this topic and want to check this, or if you know already the “real” restriction, please tell me.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":0,"end":265,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_21":{"__typename":"Paragraph","id":"140a37075c3c_21","name":"85be","type":"P","href":null,"layout":null,"metadata":null,"text":"For this research, I will try to run an application via Docker Desktop for Mac to avoid issues between my system and VirtualBox.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_22":{"__typename":"Paragraph","id":"140a37075c3c_22","name":"bf1b","type":"H3","href":null,"layout":null,"metadata":null,"text":"Docker performance tests","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_23":{"__typename":"Paragraph","id":"140a37075c3c_23","name":"65fd","type":"P","href":null,"layout":null,"metadata":null,"text":"As a test application, I chose Akeneo, because it is more lightweight than Magento regarding the amount of files and dependencies of the system.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_24":{"__typename":"Paragraph","id":"140a37075c3c_24","name":"a0ba","type":"P","href":null,"layout":null,"metadata":null,"text":"Since I use Linux and thus apparently have the least problems and best performance of all three systems, I will use it as the baseline for this comparison.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*8PT3767cZc1tTUG_UDHP2Q.png":{"__typename":"ImageMetadata","id":"1*8PT3767cZc1tTUG_UDHP2Q.png","originalHeight":604,"originalWidth":1028,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:140a37075c3c_25":{"__typename":"Paragraph","id":"140a37075c3c_25","name":"20de","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*8PT3767cZc1tTUG_UDHP2Q.png"},"text":"Results","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_26":{"__typename":"Paragraph","id":"140a37075c3c_26","name":"b66d","type":"H4","href":null,"layout":null,"metadata":null,"text":"Explanation","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_27":{"__typename":"Paragraph","id":"140a37075c3c_27","name":"20d7","type":"P","href":null,"layout":null,"metadata":null,"text":"These are the different scenarios:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_28":{"__typename":"Paragraph","id":"140a37075c3c_28","name":"2fdd","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Time for starting the Docker setup (docker-compose up -d) without sample data","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":36,"end":56,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_29":{"__typename":"Paragraph","id":"140a37075c3c_29","name":"71e2","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Time for the first page load. Here I will use the app-dev.php since Symfony delivers some debug tools along with the page","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":50,"end":61,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_30":{"__typename":"Paragraph","id":"140a37075c3c_30","name":"a0f6","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Average time to navigate through the pages (average of 7 calls)","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_31":{"__typename":"Paragraph","id":"140a37075c3c_31","name":"3a35","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Call of the cache:clear and cache:warmup commands","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":12,"end":23,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":28,"end":40,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_32":{"__typename":"Paragraph","id":"140a37075c3c_32","name":"f445","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Restarting the setup (docker-compose down && docker-compose up -d)","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":22,"end":65,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_33":{"__typename":"Paragraph","id":"140a37075c3c_33","name":"3af9","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Time for the first page load","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_34":{"__typename":"Paragraph","id":"140a37075c3c_34","name":"bd58","type":"P","href":null,"layout":null,"metadata":null,"text":"These are the environments where the tests were run:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_35":{"__typename":"Paragraph","id":"140a37075c3c_35","name":"5645","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Ubuntu system (baseline) with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and database via named volume mounts","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_36":{"__typename":"Paragraph","id":"140a37075c3c_36","name":"920d","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Mac with all development services, exposing port 80 directly without any kind of proxy, but without any shared volumes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_37":{"__typename":"Paragraph","id":"140a37075c3c_37","name":"fc39","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via named volume mounts","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_38":{"__typename":"Paragraph","id":"140a37075c3c_38","name":"0270","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via named volume mounts and the delegated flag","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_39":{"__typename":"Paragraph","id":"140a37075c3c_39","name":"14d4","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via docker-sync","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":148,"end":159,"href":"https:\u002F\u002Fdocker-sync.readthedocs.io\u002Fen\u002Flatest\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":148,"end":159,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_40":{"__typename":"Paragraph","id":"140a37075c3c_40","name":"e78a","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Mac with all development services, exposing port 80 directly without any kind of proxy, with sharing volumes for the app, appData and databases via mutagen.io","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":148,"end":158,"href":"https:\u002F\u002Fmutagen.io\u002Fdocumentation\u002Fintroduction\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":148,"end":158,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_41":{"__typename":"Paragraph","id":"140a37075c3c_41","name":"815e","type":"H3","href":null,"layout":null,"metadata":null,"text":"Docker setup","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_42":{"__typename":"Paragraph","id":"140a37075c3c_42","name":"a7e5","type":"P","href":null,"layout":null,"metadata":null,"text":"After those pure facts, I would like to describe the setup for the individual environments in more detail. If one scenario is what you want to achieve, you can duplicate it. I used our internal Akeneo setup for the docker-compose files.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_43":{"__typename":"Paragraph","id":"140a37075c3c_43","name":"c64f","type":"H3","href":null,"layout":null,"metadata":null,"text":"Default setup preparations","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_44":{"__typename":"Paragraph","id":"140a37075c3c_44","name":"c733","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Prepare the Docker system with Akeneo, a database, and a webserver with PHP","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_45":{"__typename":"Paragraph","id":"140a37075c3c_45","name":"ad9d","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Add the local address (akeneo.local) to your hosts-file","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_46":{"__typename":"Paragraph","id":"140a37075c3c_46","name":"2219","type":"ULI","href":null,"layout":null,"metadata":null,"text":"HINT: If you have multiple docker-compose files, you can add this ENV variable to omit the necessity to call the “up” command with all files as parameters. Otherwise, you would have to explicitly specify all YAML files to boot. For example: COMPOSE_FILE=docker-compose.yml:docker-compose.override.yml","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":241,"end":300,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":300,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_47":{"__typename":"Paragraph","id":"140a37075c3c_47","name":"bbaa","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Pull the images: docker-compose pull","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":17,"end":36,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_48":{"__typename":"Paragraph","id":"140a37075c3c_48","name":"e825","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Start Akeneo: docker-compose up -d","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":14,"end":34,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_49":{"__typename":"Paragraph","id":"140a37075c3c_49","name":"6b34","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Wait until your system is ready","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_50":{"__typename":"Paragraph","id":"140a37075c3c_50","name":"eb16","type":"ULI","href":null,"layout":null,"metadata":null,"text":"See the result in your browser at http:\u002F\u002Fakeneo.local","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":34,"end":53,"href":"http:\u002F\u002Fakeneo.local","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":34,"end":53,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_51":{"__typename":"Paragraph","id":"140a37075c3c_51","name":"bf5b","type":"H3","href":null,"layout":null,"metadata":null,"text":"Mac setup without shared volumes","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_52":{"__typename":"Paragraph","id":"140a37075c3c_52","name":"9293","type":"P","href":null,"layout":null,"metadata":null,"text":"This is the easiest setup. Just follow the instructions and you’re good to go.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_53":{"__typename":"Paragraph","id":"140a37075c3c_53","name":"7a14","type":"H4","href":null,"layout":null,"metadata":null,"text":"Advantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_54":{"__typename":"Paragraph","id":"140a37075c3c_54","name":"8b27","type":"P","href":null,"layout":null,"metadata":null,"text":"This setup is as fast as the Ubuntu solution.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_55":{"__typename":"Paragraph","id":"140a37075c3c_55","name":"e9bc","type":"H4","href":null,"layout":null,"metadata":null,"text":"Disadvantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_56":{"__typename":"Paragraph","id":"140a37075c3c_56","name":"c543","type":"P","href":null,"layout":null,"metadata":null,"text":"There is no easy way to access and change the files as a developer.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_57":{"__typename":"Paragraph","id":"140a37075c3c_57","name":"16d5","type":"H3","href":null,"layout":null,"metadata":null,"text":"Mac setup with shared volumes via named volume mounts","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_58":{"__typename":"Paragraph","id":"140a37075c3c_58","name":"66f1","type":"P","href":null,"layout":null,"metadata":null,"text":"For this environment, you can use the previous one, but you must do the following BEFORE you start the setup:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_59":{"__typename":"Paragraph","id":"140a37075c3c_59","name":"6675","type":"P","href":null,"layout":null,"metadata":null,"text":"Un-comment the mount options in the upper part of the docker-compose.override.yml and add the Elastic Search database. The upper part should look like this:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":54,"end":81,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_60":{"__typename":"Paragraph","id":"140a37075c3c_60","name":"cab2","type":"PRE","href":null,"layout":null,"metadata":null,"text":"volumes:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_61":{"__typename":"Paragraph","id":"140a37075c3c_61","name":"6e06","type":"PRE","href":null,"layout":null,"metadata":null,"text":"# $PWD is only available on Unix-based systems (Linux, MacOs), Windows might need absolute paths","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_62":{"__typename":"Paragraph","id":"140a37075c3c_62","name":"5212","type":"PRE","href":null,"layout":null,"metadata":null,"text":"akeneo:\n driver: local\n driver_opts:\n type: none\n device: ${PWD}\u002Fmnt\u002Fsrc # absolute path ONLY\n o: bind","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_63":{"__typename":"Paragraph","id":"140a37075c3c_63","name":"8cd4","type":"PRE","href":null,"layout":null,"metadata":null,"text":"data:\n driver: local\n driver_opts:\n type: none\n device: ${PWD}\u002Fmnt\u002Fassets # absolute path ONLY\n o: bind","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_64":{"__typename":"Paragraph","id":"140a37075c3c_64","name":"c35c","type":"PRE","href":null,"layout":null,"metadata":null,"text":"database:\n driver: local\n driver_opts:\n type: none\n device: ${PWD}\u002Fmnt\u002Fdatabase # absolute path ONLY\n o: bind","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_65":{"__typename":"Paragraph","id":"140a37075c3c_65","name":"da95","type":"PRE","href":null,"layout":null,"metadata":null,"text":"esDatabase:\n driver: local\n driver_opts:\n type: none\n device: ${PWD}\u002Fmnt\u002FesDatabase # absolute path ONLY\n o: bind","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_66":{"__typename":"Paragraph","id":"140a37075c3c_66","name":"d33f","type":"P","href":null,"layout":null,"metadata":null,"text":"Create the directories you want to use (like mnt\u002F*). Add the following environment variable to the end of the .env file, since the copy process will take a lot longer than the default 60 seconds: COMPOSE_HTTP_TIMEOUT=500","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":196,"end":220,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_67":{"__typename":"Paragraph","id":"140a37075c3c_67","name":"2622","type":"H4","href":null,"layout":null,"metadata":null,"text":"Advantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_68":{"__typename":"Paragraph","id":"140a37075c3c_68","name":"c078","type":"P","href":null,"layout":null,"metadata":null,"text":"The permissions aren’t an issue. If you change and add ACLs for your user ID so that you can access files with the user ID expected within your containers, Hyperkit seems to work with that rather well. I was able to change my local user for files in my IDE, and inside the developer container they still belonged to www-data. Nice handling.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_69":{"__typename":"Paragraph","id":"140a37075c3c_69","name":"ce80","type":"H4","href":null,"layout":null,"metadata":null,"text":"Disadvantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_70":{"__typename":"Paragraph","id":"140a37075c3c_70","name":"c4ce","type":"P","href":null,"layout":null,"metadata":null,"text":"It is about ten times slower than the Ubuntu or the non-shared setup.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_71":{"__typename":"Paragraph","id":"140a37075c3c_71","name":"c33e","type":"H3","href":null,"layout":null,"metadata":null,"text":"Mac setup with shared volumes via named volume mounts using the delegated flag","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_72":{"__typename":"Paragraph","id":"140a37075c3c_72","name":"cddd","type":"P","href":null,"layout":null,"metadata":null,"text":"This approach failed, because if you use the delegated flag together with the volume mounts, Docker for Mac searches the files in another directory and cannot find them:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_73":{"__typename":"Paragraph","id":"140a37075c3c_73","name":"5089","type":"PRE","href":null,"layout":null,"metadata":null,"text":"ERROR: for base-package_setup_1 Cannot start service setup:\nOCI runtime create failed:\n container_linux.go:345:\n starting container process caused \"process_linux.go:430:\n container init caused \"rootfs_linux.go:58:\n mounting \"\u002Fvar\u002Flib\u002Fdocker\u002Fvolumes\u002Fbase-package_akeneo\u002F_data\"\n to rootfs \"\u002Fvar\u002Flib\u002Fdocker\u002Foverlay2\u002F053b184a8cc131e322e5bf6d4bbf58aff0030bd33984eb79e80e280379935ee4\u002Fmerged\"\n at \"\u002Fvar\u002Flib\u002Fdocker\u002Foverlay2\u002F053b184a8cc131e322e5bf6d4bbf58aff0030bd33984eb79e80e280379935ee4\u002Fmerged\u002Fvar\u002Fwww\u002Fhtml\"\n caused \"no such file or directory\"\"\":\n unknown","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":148,"end":197,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":230,"end":282,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":295,"end":394,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":402,"end":514,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":524,"end":553,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_74":{"__typename":"Paragraph","id":"140a37075c3c_74","name":"d111","type":"P","href":null,"layout":null,"metadata":null,"text":"Not sure if there is a workaround, but after reading the above articles, I do not expect miracles. So I skipped this in favour of the next two approaches.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_75":{"__typename":"Paragraph","id":"140a37075c3c_75","name":"1534","type":"H3","href":null,"layout":null,"metadata":null,"text":"Mac setup with shared volumes via docker-sync","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_76":{"__typename":"Paragraph","id":"140a37075c3c_76","name":"22f9","type":"P","href":null,"layout":null,"metadata":null,"text":"Before we can configure our setup, we must set up docker-sync. Install it via https:\u002F\u002Fdocker-sync.readthedocs.io\u002Fen\u002Flatest\u002Fgetting-started\u002Finstallation.html#installation-osx.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":78,"end":173,"href":"https:\u002F\u002Fdocker-sync.readthedocs.io\u002Fen\u002Flatest\u002Fgetting-started\u002Finstallation.html#installation-osx","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":78,"end":173,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_77":{"__typename":"Paragraph","id":"140a37075c3c_77","name":"42c5","type":"P","href":null,"layout":null,"metadata":null,"text":"I use Unison as the sync tool, just out of gut feeling and because of the impression I had reading through the articles. It seems to have better sync methods for deleted files and more watch capabilities than rsync. Based on the documentation, I will use the native OSX sync strategy:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_78":{"__typename":"Paragraph","id":"140a37075c3c_78","name":"85e5","type":"P","href":null,"layout":null,"metadata":null,"text":"“Native-OSX is a combination of two concepts, OSXFS only and Unison together.”","hasDropCap":true,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":46,"end":56,"href":"https:\u002F\u002Fgithub.com\u002FEugenMayer\u002Fdocker-sync\u002Fissues\u002F346","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":46,"end":56,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_79":{"__typename":"Paragraph","id":"140a37075c3c_79","name":"1775","type":"P","href":null,"layout":null,"metadata":null,"text":"Now you have different ways of implementing docker-sync into your project. To keep the setup simple for my colleagues, I tried the docker-compose approach provided by docker-sync itself. I added a new docker-compose file into the project: docker-compose.docker-sync.yml.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":239,"end":269,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_80":{"__typename":"Paragraph","id":"140a37075c3c_80","name":"62a6","type":"P","href":null,"layout":null,"metadata":null,"text":"I then added the new file at the end of my COMPOSE_FILE variable in my .env file, so it looked like this:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":43,"end":55,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_81":{"__typename":"Paragraph","id":"140a37075c3c_81","name":"a42e","type":"P","href":null,"layout":null,"metadata":null,"text":"COMPOSE_FILE=docker-compose.yml:docker-compose.override.yml:docker-compose.network.yml:docker-compose.docker-sync.yml.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":117,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_82":{"__typename":"Paragraph","id":"140a37075c3c_82","name":"ac5c","type":"P","href":null,"layout":null,"metadata":null,"text":"In my compose file, I synced the \u002Fvar\u002Fwww\u002Fhtml directory and my \u002Fvar\u002Fakeneo directory to work with the system and check the logs and history of processes:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":33,"end":46,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":64,"end":75,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_83":{"__typename":"Paragraph","id":"140a37075c3c_83","name":"71c0","type":"PRE","href":null,"layout":null,"metadata":null,"text":"####################################################################","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_84":{"__typename":"Paragraph","id":"140a37075c3c_84","name":"aa4f","type":"PRE","href":null,"layout":null,"metadata":null,"text":"# Addition to Build an Akeneo image with Docker sync to share the core application with the host machine\n# dependencies within the docker compose file\n# Possible usage:\n# docker-compose -f docker-compose.yml -f docker-compose.network.yml -f docker-compose.docker-sync.yml up -d","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_85":{"__typename":"Paragraph","id":"140a37075c3c_85","name":"2119","type":"PRE","href":null,"layout":null,"metadata":null,"text":"####################################################################","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_86":{"__typename":"Paragraph","id":"140a37075c3c_86","name":"0a54","type":"PRE","href":null,"layout":null,"metadata":null,"text":"version: '3.5'\nservices:\n # Service to actual synchronize the named volume and the given path\n akeneo-syncer: # sync the akeneo named volume\n image: eugenmayer\u002Funison:2.51.2.1\n command: \u002Fentrypoint.sh supervisord\n volumes:\n - .\u002Fmnt\u002Fsrc:\u002Fhost_sync\n - akeneo:\u002Fapp_sync\n environment:\n # These variables control which directories are synced by Unison.\n - HOST_VOLUME=\u002Fhost_sync\n - APP_VOLUME=\u002Fapp_sync\n - UNISON_SRC=\u002Fhost_sync\n - UNISON_DEST=\u002Fapp_sync\n - UNISON_DIR=\u002Fdata\n # IMPORTANT: Use the user’s ID here which uses the shared directory inside of the container\n - OWNER_UID=1001\n # NEAT: Add directories to ignore here. \"node_modules\" are many files without a debugging or developing purpose\n - UNISON_ARGS=-ignore='Name node_modules' -prefer \u002Fhost_sync -numericids -auto -batch\n - UNISON_WATCH_ARGS=-repeat watch\n - TZ=Europe\u002FBerlin\n - LANG=C.UTF-8\n - HOME=\u002Froot","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":25,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":97,"end":111,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":145,"end":151,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":181,"end":189,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":219,"end":228,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":278,"end":293,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":735,"end":754,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":870,"end":873,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_87":{"__typename":"Paragraph","id":"140a37075c3c_87","name":"1e3d","type":"PRE","href":null,"layout":null,"metadata":null,"text":"data-syncer: # Sync the data named volume\n image: eugenmayer\u002Funison:2.51.2.1\n command: \u002Fentrypoint.sh supervisord\n volumes:\n - .\u002Fmnt\u002Fassets:\u002Fhost_sync\n - data:\u002Fapp_sync\n environment:\n # These variables control which directories are synced by unison.\n - HOST_VOLUME=\u002Fhost_sync\n - APP_VOLUME=\u002Fapp_sync\n - UNISON_SRC=\u002Fhost_sync\n - UNISON_DEST=\u002Fapp_sync\n - UNISON_DIR=\u002Fdata\n # IMPORTANT: Use the user’s ID which uses the shared directory inside of the container\n - OWNER_UID=1001\n # NEAT: Add directories to ignore here. \"cache\" are many files without a debugging or developing purpose\n - UNISON_ARGS=-ignore='Name cache' -prefer \u002Fhost_sync -numericids -auto -batch\n - UNISON_WATCH_ARGS=-repeat watch\n - TZ=Europe\u002FBerlin\n - LANG=C.UTF-8\n - HOME=\u002Froot","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":12,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":44,"end":50,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":80,"end":88,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":118,"end":127,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":178,"end":191,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":633,"end":645,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":764,"end":767,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_88":{"__typename":"Paragraph","id":"140a37075c3c_88","name":"3bdd","type":"P","href":null,"layout":null,"metadata":null,"text":"NOTE:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_89":{"__typename":"Paragraph","id":"140a37075c3c_89","name":"ab4e","type":"P","href":null,"layout":null,"metadata":null,"text":"Despite the hint from the documentation, we do NOT use the :nocopy suffix because it would break our current volume\u002Fcontainer logic. See this Image for a better understanding of the reason:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":142,"end":147,"href":"https:\u002F\u002Fgithub.com\u002Fdocker\u002Fdocker.github.io\u002Fissues\u002F2992#issuecomment-299596714","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_90":{"__typename":"Paragraph","id":"140a37075c3c_90","name":"43b2","type":"P","href":null,"layout":null,"metadata":null,"text":"Image of nocopy Workflow: https:\u002F\u002Fcloud.githubusercontent.com\u002Fassets\u002F1525937\u002F25767468\u002F574d9570-31ae-11e7-8886-d7923fbc68fb.png","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":26,"end":126,"href":"https:\u002F\u002Fcloud.githubusercontent.com\u002Fassets\u002F1525937\u002F25767468\u002F574d9570-31ae-11e7-8886-d7923fbc68fb.png","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_91":{"__typename":"Paragraph","id":"140a37075c3c_91","name":"f979","type":"H4","href":null,"layout":null,"metadata":null,"text":"Advantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_92":{"__typename":"Paragraph","id":"140a37075c3c_92","name":"eadb","type":"P","href":null,"layout":null,"metadata":null,"text":"This approach is easy to implement. The boilerplates give many examples on how docker-sync can be configured: https:\u002F\u002Fgithub.com\u002FEugenMayer\u002Fdocker-sync-boilerplate. Even with plain default settings, I have achieved almost the same performance as on the Ubuntu system. With more experimenting and tweaking or playing around with the sync strategies, I think you can get an even faster synchronization.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":110,"end":163,"href":"https:\u002F\u002Fgithub.com\u002FEugenMayer\u002Fdocker-sync-boilerplate","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_93":{"__typename":"Paragraph","id":"140a37075c3c_93","name":"1201","type":"P","href":null,"layout":null,"metadata":null,"text":"Excluding directories from the volume is a neat feature. You can speed up your system if you exclude (for your host system) useless directories like the node_modules, which saves index space for docker-sync and your IDE.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_94":{"__typename":"Paragraph","id":"140a37075c3c_94","name":"82d3","type":"P","href":null,"layout":null,"metadata":null,"text":"Mapping the user between the container and your system works out of the box and simplifies the process.\nEverything can be configured via a yaml file or as ENV variables","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_95":{"__typename":"Paragraph","id":"140a37075c3c_95","name":"2e96","type":"P","href":null,"layout":null,"metadata":null,"text":"One note about the time in brackets in the table:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_96":{"__typename":"Paragraph","id":"140a37075c3c_96","name":"dd25","type":"P","href":null,"layout":null,"metadata":null,"text":"One request — in particular, one of the first — took way longer than the rest, so maybe it was a spike. Ignoring it, I reached the other average of 300 ms per content load.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_97":{"__typename":"Paragraph","id":"140a37075c3c_97","name":"a9b5","type":"H4","href":null,"layout":null,"metadata":null,"text":"Disadvantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_98":{"__typename":"Paragraph","id":"140a37075c3c_98","name":"e375","type":"P","href":null,"layout":null,"metadata":null,"text":"Starting the environment takes about twice as long as the baseline reference. Especially the CSS generation takes time, but not much more than calling it directly in your running system. Maybe this is related to the sync process indexing the files or something.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_99":{"__typename":"Paragraph","id":"140a37075c3c_99","name":"319d","type":"P","href":null,"layout":null,"metadata":null,"text":"One service can only sync one volume, so you need one service per volume. With an increasing number of services, the performance will get worse, depending on the amount of files you are synchronizing. You can still go a hybrid way, though. For example, you can mount the database volumes as named volumes, like in the previous section, and only use docker-sync for the main volume for development and debugging.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_100":{"__typename":"Paragraph","id":"140a37075c3c_100","name":"ba2c","type":"H3","href":null,"layout":null,"metadata":null,"text":"Mac setup with shared volumes via Mutagen IO","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_101":{"__typename":"Paragraph","id":"140a37075c3c_101","name":"72c5","type":"P","href":null,"layout":null,"metadata":null,"text":"Before we can utilize this, we must install Mutagen: https:\u002F\u002Fmutagen.io\u002Fdocumentation\u002Fintroduction\u002Finstallation\u002F.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":53,"end":112,"href":"https:\u002F\u002Fmutagen.io\u002Fdocumentation\u002Fintroduction\u002Finstallation\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_102":{"__typename":"Paragraph","id":"140a37075c3c_102","name":"4bb5","type":"P","href":null,"layout":null,"metadata":null,"text":"Add the daemon to our user, as described in the CLI command line help: mutagen daemon register and mutagen daemon start.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":71,"end":94,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":99,"end":119,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_103":{"__typename":"Paragraph","id":"140a37075c3c_103","name":"58cb","type":"P","href":null,"layout":null,"metadata":null,"text":"Start Akeneo without named volumes, like in the first Mac environment. When the system runs, just start your listener to sync the files between your system and the container. For Akeneo without the node_modules directory, it takes about 42 s until the watcher is ready to watch.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_104":{"__typename":"Paragraph","id":"140a37075c3c_104","name":"2988","type":"PRE","href":null,"layout":null,"metadata":null,"text":"mutagen sync create — name=akeneoSrc -m=two-way-resolved — symlink-mode ignore -i node_modules \\","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_105":{"__typename":"Paragraph","id":"140a37075c3c_105","name":"5221","type":"PRE","href":null,"layout":null,"metadata":null,"text":"docker:\u002F\u002Fwww-data@base-package_devbox_1\u002Fvar\u002Fwww\u002Fhtml\u002F mnt\u002Fsrc \\","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_106":{"__typename":"Paragraph","id":"140a37075c3c_106","name":"1e5a","type":"PRE","href":null,"layout":null,"metadata":null,"text":"&& mutagen sync monitor","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_107":{"__typename":"Paragraph","id":"140a37075c3c_107","name":"870a","type":"P","href":null,"layout":null,"metadata":null,"text":"The logic behind this call is the following:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_108":{"__typename":"Paragraph","id":"140a37075c3c_108","name":"6aee","type":"P","href":null,"layout":null,"metadata":null,"text":"The first path “docker:\u002F\u002F…” is “alpha” and “mnt\u002Fsrc” is “beta”. Depending on your sync mode, both paths will be equally synced or not, which can lead to conflicts. With the parameter “-m=two-way-resolved” alpha always wins. That is why the Docker container containing the files should be alpha here.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":15,"end":27,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":43,"end":52,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":183,"end":204,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_109":{"__typename":"Paragraph","id":"140a37075c3c_109","name":"9759","type":"P","href":null,"layout":null,"metadata":null,"text":"You can run as many syncs as you want and keep track of them via the name: “–name=akeneoSrc”. In the default mode, Mutagen apparently handles symlinks not very well, so for now I set it to ignore them: “ — symlink-mode ignore”. Otherwise, it won’t find the redirections and will not work.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":75,"end":92,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":202,"end":226,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_110":{"__typename":"Paragraph","id":"140a37075c3c_110","name":"4d51","type":"P","href":null,"layout":null,"metadata":null,"text":"The “alpha” path contains three elements: “docker:\u002F\u002Fwww-data@” is the way to use Docker remotes for the sync. The “www-data” part is the way of telling Mutagen to copy and handle all files as this specific user. Otherwise, it will use the default user of the container. “base-package_devbox_1” is the name of the container. With some bash\u002Fgrep logic you could also find a more automated way for make-files to call a specific container. The last part “\u002Fvar\u002Fwww\u002Fhtml\u002F” is the path within the container which should be shared.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":42,"end":62,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":270,"end":293,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":450,"end":466,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_111":{"__typename":"Paragraph","id":"140a37075c3c_111","name":"9b5b","type":"P","href":null,"layout":null,"metadata":null,"text":"As with docker-sync, we can exclude directories which should not be synced: “-i node_modules”. Since one line that long might be inefficient and error-prone, you can define a mutagen.yml in the same directory and use that instead of putting everything in this single-line-command.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":76,"end":93,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":175,"end":186,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_112":{"__typename":"Paragraph","id":"140a37075c3c_112","name":"874d","type":"P","href":null,"layout":null,"metadata":null,"text":"NOTE:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_113":{"__typename":"Paragraph","id":"140a37075c3c_113","name":"b47b","type":"P","href":null,"layout":null,"metadata":null,"text":"The default mode for synchronized files is 700 instead of the project-specific 644+xS. You can also define the file mode via a parameter or config file, otherwise after changing something in your IDE, it changes the file mode to 700.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_114":{"__typename":"Paragraph","id":"140a37075c3c_114","name":"7688","type":"H4","href":null,"layout":null,"metadata":null,"text":"Advantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_115":{"__typename":"Paragraph","id":"140a37075c3c_115","name":"e9ba","type":"P","href":null,"layout":null,"metadata":null,"text":"Mutagen is a tool with the capabilities to synchronize multiple systems in essentially real-time. It is independent of your setup and subsequent processes, so the performance should not be affected, as proven in the table on the top of this page. You can also define many small configurations like directory excludes and so on. You can sync the local and remote system at the same time and therefore orchestrate multiple systems at the same time or publish bug fixes to any system you have access to. You also have forward capabilities, which in theory could replace the proxy. But I haven’t tested that yet.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_116":{"__typename":"Paragraph","id":"140a37075c3c_116","name":"99d6","type":"H4","href":null,"layout":null,"metadata":null,"text":"Disadvantages","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_117":{"__typename":"Paragraph","id":"140a37075c3c_117","name":"0cf3","type":"P","href":null,"layout":null,"metadata":null,"text":"It is more difficult to get started, because there aren’t many examples for a docker-compose setup like we have it. Also, despite the popularity Mutagen seems to have (after speaking with some agencies at conferences), I can’t find much on the internet about Mutagen and Docker.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_118":{"__typename":"Paragraph","id":"140a37075c3c_118","name":"e4b2","type":"H3","href":null,"layout":null,"metadata":null,"text":"Conclusion","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_119":{"__typename":"Paragraph","id":"140a37075c3c_119","name":"7c97","type":"P","href":null,"layout":null,"metadata":null,"text":"With the use of docker-sync or Mutagen it should be possible to provide the same structure and logic for a debuggable and production-ready Docker environment independent of the OS. While docker-sync is the easiest solutions, Mutagen delivers the best performance and at first glance the most fields of use, not only providing Mac users a better performance than with named volumes.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_120":{"__typename":"Paragraph","id":"140a37075c3c_120","name":"59f9","type":"H3","href":null,"layout":null,"metadata":null,"text":"Sources","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_121":{"__typename":"Paragraph","id":"140a37075c3c_121","name":"abfe","type":"P","href":null,"layout":null,"metadata":null,"text":"These are the sources I used for finding the differences between the tools mentioned:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_122":{"__typename":"Paragraph","id":"140a37075c3c_122","name":"eb9f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fdocs.docker.com\u002Fdocker-for-mac\u002Fdocker-toolbox\u002F","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":54,"href":"https:\u002F\u002Fdocs.docker.com\u002Fdocker-for-mac\u002Fdocker-toolbox\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_123":{"__typename":"Paragraph","id":"140a37075c3c_123","name":"0f66","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fblog.rocketinsights.com\u002Fspeeding-up-docker-development-on-the-mac\u002F","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":74,"href":"https:\u002F\u002Fblog.rocketinsights.com\u002Fspeeding-up-docker-development-on-the-mac\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_124":{"__typename":"Paragraph","id":"140a37075c3c_124","name":"6b7c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fstories.amazee.io\u002Fdocker-on-mac-performance-docker-machine-vs-docker-for-mac-4c64c0afdf99","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":97,"href":"https:\u002F\u002Fstories.amazee.io\u002Fdocker-on-mac-performance-docker-machine-vs-docker-for-mac-4c64c0afdf99","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:140a37075c3c_125":{"__typename":"Paragraph","id":"140a37075c3c_125","name":"204c","type":"P","href":null,"layout":null,"metadata":null,"text":"Learn more about Netresearch here.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":29,"end":33,"href":"https:\u002F\u002Fwww.netresearch.de\u002Fen\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:85a18ce596e3-viewerId:lo_4c5cb3cc7dc6":{"__typename":"CollectionViewerEdge","id":"collectionId:85a18ce596e3-viewerId:lo_4c5cb3cc7dc6","isEditor":false,"isMuting":false},"UserViewerEdge:userId:9c84072ae3af-viewerId:lo_4c5cb3cc7dc6":{"__typename":"UserViewerEdge","id":"userId:9c84072ae3af-viewerId:lo_4c5cb3cc7dc6","isMuting":false},"PostViewerEdge:postId:55580efcbf68-viewerId:lo_4c5cb3cc7dc6":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:55580efcbf68-viewerId:lo_4c5cb3cc7dc6"},"Tag:docker":{"__typename":"Tag","id":"docker","displayTitle":"Docker","normalizedTagSlug":"docker"},"Tag:performance":{"__typename":"Tag","id":"performance","displayTitle":"Performance","normalizedTagSlug":"performance"},"Tag:mac":{"__typename":"Tag","id":"mac","displayTitle":"Mac","normalizedTagSlug":"mac"},"Post:55580efcbf68":{"__typename":"Post","id":"55580efcbf68","collection":{"__ref":"Collection:85a18ce596e3"},"content({\"postMeteringOptions\":{\"referrer\":\"\"}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"bdbb","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:140a37075c3c_0"},{"__ref":"Paragraph:140a37075c3c_1"},{"__ref":"Paragraph:140a37075c3c_2"},{"__ref":"Paragraph:140a37075c3c_3"},{"__ref":"Paragraph:140a37075c3c_4"},{"__ref":"Paragraph:140a37075c3c_5"},{"__ref":"Paragraph:140a37075c3c_6"},{"__ref":"Paragraph:140a37075c3c_7"},{"__ref":"Paragraph:140a37075c3c_8"},{"__ref":"Paragraph:140a37075c3c_9"},{"__ref":"Paragraph:140a37075c3c_10"},{"__ref":"Paragraph:140a37075c3c_11"},{"__ref":"Paragraph:140a37075c3c_12"},{"__ref":"Paragraph:140a37075c3c_13"},{"__ref":"Paragraph:140a37075c3c_14"},{"__ref":"Paragraph:140a37075c3c_15"},{"__ref":"Paragraph:140a37075c3c_16"},{"__ref":"Paragraph:140a37075c3c_17"},{"__ref":"Paragraph:140a37075c3c_18"},{"__ref":"Paragraph:140a37075c3c_19"},{"__ref":"Paragraph:140a37075c3c_20"},{"__ref":"Paragraph:140a37075c3c_21"},{"__ref":"Paragraph:140a37075c3c_22"},{"__ref":"Paragraph:140a37075c3c_23"},{"__ref":"Paragraph:140a37075c3c_24"},{"__ref":"Paragraph:140a37075c3c_25"},{"__ref":"Paragraph:140a37075c3c_26"},{"__ref":"Paragraph:140a37075c3c_27"},{"__ref":"Paragraph:140a37075c3c_28"},{"__ref":"Paragraph:140a37075c3c_29"},{"__ref":"Paragraph:140a37075c3c_30"},{"__ref":"Paragraph:140a37075c3c_31"},{"__ref":"Paragraph:140a37075c3c_32"},{"__ref":"Paragraph:140a37075c3c_33"},{"__ref":"Paragraph:140a37075c3c_34"},{"__ref":"Paragraph:140a37075c3c_35"},{"__ref":"Paragraph:140a37075c3c_36"},{"__ref":"Paragraph:140a37075c3c_37"},{"__ref":"Paragraph:140a37075c3c_38"},{"__ref":"Paragraph:140a37075c3c_39"},{"__ref":"Paragraph:140a37075c3c_40"},{"__ref":"Paragraph:140a37075c3c_41"},{"__ref":"Paragraph:140a37075c3c_42"},{"__ref":"Paragraph:140a37075c3c_43"},{"__ref":"Paragraph:140a37075c3c_44"},{"__ref":"Paragraph:140a37075c3c_45"},{"__ref":"Paragraph:140a37075c3c_46"},{"__ref":"Paragraph:140a37075c3c_47"},{"__ref":"Paragraph:140a37075c3c_48"},{"__ref":"Paragraph:140a37075c3c_49"},{"__ref":"Paragraph:140a37075c3c_50"},{"__ref":"Paragraph:140a37075c3c_51"},{"__ref":"Paragraph:140a37075c3c_52"},{"__ref":"Paragraph:140a37075c3c_53"},{"__ref":"Paragraph:140a37075c3c_54"},{"__ref":"Paragraph:140a37075c3c_55"},{"__ref":"Paragraph:140a37075c3c_56"},{"__ref":"Paragraph:140a37075c3c_57"},{"__ref":"Paragraph:140a37075c3c_58"},{"__ref":"Paragraph:140a37075c3c_59"},{"__ref":"Paragraph:140a37075c3c_60"},{"__ref":"Paragraph:140a37075c3c_61"},{"__ref":"Paragraph:140a37075c3c_62"},{"__ref":"Paragraph:140a37075c3c_63"},{"__ref":"Paragraph:140a37075c3c_64"},{"__ref":"Paragraph:140a37075c3c_65"},{"__ref":"Paragraph:140a37075c3c_66"},{"__ref":"Paragraph:140a37075c3c_67"},{"__ref":"Paragraph:140a37075c3c_68"},{"__ref":"Paragraph:140a37075c3c_69"},{"__ref":"Paragraph:140a37075c3c_70"},{"__ref":"Paragraph:140a37075c3c_71"},{"__ref":"Paragraph:140a37075c3c_72"},{"__ref":"Paragraph:140a37075c3c_73"},{"__ref":"Paragraph:140a37075c3c_74"},{"__ref":"Paragraph:140a37075c3c_75"},{"__ref":"Paragraph:140a37075c3c_76"},{"__ref":"Paragraph:140a37075c3c_77"},{"__ref":"Paragraph:140a37075c3c_78"},{"__ref":"Paragraph:140a37075c3c_79"},{"__ref":"Paragraph:140a37075c3c_80"},{"__ref":"Paragraph:140a37075c3c_81"},{"__ref":"Paragraph:140a37075c3c_82"},{"__ref":"Paragraph:140a37075c3c_83"},{"__ref":"Paragraph:140a37075c3c_84"},{"__ref":"Paragraph:140a37075c3c_85"},{"__ref":"Paragraph:140a37075c3c_86"},{"__ref":"Paragraph:140a37075c3c_87"},{"__ref":"Paragraph:140a37075c3c_88"},{"__ref":"Paragraph:140a37075c3c_89"},{"__ref":"Paragraph:140a37075c3c_90"},{"__ref":"Paragraph:140a37075c3c_91"},{"__ref":"Paragraph:140a37075c3c_92"},{"__ref":"Paragraph:140a37075c3c_93"},{"__ref":"Paragraph:140a37075c3c_94"},{"__ref":"Paragraph:140a37075c3c_95"},{"__ref":"Paragraph:140a37075c3c_96"},{"__ref":"Paragraph:140a37075c3c_97"},{"__ref":"Paragraph:140a37075c3c_98"},{"__ref":"Paragraph:140a37075c3c_99"},{"__ref":"Paragraph:140a37075c3c_100"},{"__ref":"Paragraph:140a37075c3c_101"},{"__ref":"Paragraph:140a37075c3c_102"},{"__ref":"Paragraph:140a37075c3c_103"},{"__ref":"Paragraph:140a37075c3c_104"},{"__ref":"Paragraph:140a37075c3c_105"},{"__ref":"Paragraph:140a37075c3c_106"},{"__ref":"Paragraph:140a37075c3c_107"},{"__ref":"Paragraph:140a37075c3c_108"},{"__ref":"Paragraph:140a37075c3c_109"},{"__ref":"Paragraph:140a37075c3c_110"},{"__ref":"Paragraph:140a37075c3c_111"},{"__ref":"Paragraph:140a37075c3c_112"},{"__ref":"Paragraph:140a37075c3c_113"},{"__ref":"Paragraph:140a37075c3c_114"},{"__ref":"Paragraph:140a37075c3c_115"},{"__ref":"Paragraph:140a37075c3c_116"},{"__ref":"Paragraph:140a37075c3c_117"},{"__ref":"Paragraph:140a37075c3c_118"},{"__ref":"Paragraph:140a37075c3c_119"},{"__ref":"Paragraph:140a37075c3c_120"},{"__ref":"Paragraph:140a37075c3c_121"},{"__ref":"Paragraph:140a37075c3c_122"},{"__ref":"Paragraph:140a37075c3c_123"},{"__ref":"Paragraph:140a37075c3c_124"},{"__ref":"Paragraph:140a37075c3c_125"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:9c84072ae3af"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fmedium.com\u002Fnetresearch\u002Fimproving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68","primaryTopic":null,"topics":[{"__typename":"Topic","slug":"programming"}],"isLimitedState":false,"isPublished":true,"allowResponses":true,"latestPublishedVersion":"140a37075c3c","visibility":"PUBLIC","responsesLocked":false,"postResponses":{"__typename":"PostResponses","count":0},"responseDistribution":"NOT_DISTRIBUTED","clapCount":60,"title":"Improving performance for Docker on Mac computers when using named volumes","isSeries":false,"sequence":null,"uniqueSlug":"improving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1620377961488,"readingTime":12.591509433962266,"previewContent":{"__typename":"PreviewContent","subtitle":"During use of Docker, we found that the performance on Mac is significantly worse than on other systems. Read how to improve it."},"previewImage":{"__ref":"ImageMetadata:1*6IE6yzQKNQPKBxYI5AzuBA.jpeg"},"isShortform":false,"seoTitle":"","firstPublishedAt":1575981672653,"updatedAt":1639349044440,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"","viewerEdge":{"__ref":"PostViewerEdge:postId:55580efcbf68-viewerId:lo_4c5cb3cc7dc6"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:docker"},{"__ref":"Tag:performance"},{"__ref":"Tag:mac"}],"isFeaturedInPublishedPublication":false,"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":3191,"layerCake":0}}</script><script>window.__MIDDLEWARE_STATE__={"session":{"xsrf":""},"cache":{"cacheStatus":"MISS"}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.361f32ff.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.557bd252.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.5bef8967.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4505.6dfaf853.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9380.fb176dee.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.cebfb665.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.68bc318b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3045.1cc3d8cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.3329b100.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.67b7130d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6428.7d30b23c.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6199.c727247b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.7d9f7f3d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.e46b7f66.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4492.0c3e1a1d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2571.6814b962.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6128.f8800a13.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2135.aeee1c45.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/144.72d76bca.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5240.6281357f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8819.c627c2bf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.d0637ed0.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.8692827c.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.0d800846.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.18a8996d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.e1e580cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.e89462cb.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'917a00da18a891ab',t:'MTc0MDUxMDcwOS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10