"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9736],{3905:function(e,r,t){t.d(r,{Zo:function(){return f},kt:function(){return m}});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function a(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)t=i[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var u=n.createContext({}),s=function(e){var r=n.useContext(u),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},f=function(e){var r=s(e.components);return n.createElement(u.Provider,{value:r},e.children)},l={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},p=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,i=e.originalType,u=e.parentName,f=a(e,["components","mdxType","originalType","parentName"]),p=s(t),m=o,y=p["".concat(u,".").concat(m)]||p[m]||l[m]||i;return t?n.createElement(y,c(c({ref:r},f),{},{components:t})):n.createElement(y,c({ref:r},f))}));function m(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var i=t.length,c=new Array(i);c[0]=p;var a={};for(var u in r)hasOwnProperty.call(r,u)&&(a[u]=r[u]);a.originalType=e,a.mdxType="string"==typeof e?e:o,c[1]=a;for(var s=2;s<i;s++)c[s]=t[s];return n.createElement.apply(null,c)}return n.createElement.apply(null,t)}p.displayName="MDXCreateElement"},3467:function(e,r,t){t.r(r),t.d(r,{assets:function(){return f},contentTitle:function(){return u},default:function(){return m},frontMatter:function(){return a},metadata:function(){return s},toc:function(){return l}});var n=t(7462),o=t(3366),i=(t(7294),t(3905)),c=["components"],a={title:"Write Dockerfiles for Submarine"},u=void 0,s={unversionedId:"userDocs/yarn/Dockerfiles",id:"version-0.6.0/userDocs/yarn/Dockerfiles",title:"Write Dockerfiles for Submarine",description:"\x3c!--",source:"@site/versioned_docs/version-0.6.0/userDocs/yarn/Dockerfiles.md",sourceDirName:"userDocs/yarn",slug:"/userDocs/yarn/Dockerfiles",permalink:"/docs/0.6.0/userDocs/yarn/Dockerfiles",editUrl:"https://github.com/apache/submarine/edit/master/website/versioned_docs/version-0.6.0/userDocs/yarn/Dockerfiles.md",tags:[],version:"0.6.0",frontMatter:{title:"Write Dockerfiles for Submarine"}},f={},l=[],p={toc:l};function m(e){var r=e.components,t=(0,o.Z)(e,c);return(0,i.kt)("wrapper",(0,n.Z)({},p,t,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"WriteDockerfileTF"},"How to write Dockerfile for Submarine TensorFlow jobs")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"WriteDockerfilePT"},"How to write Dockerfile for Submarine PyTorch jobs")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"WriteDockerfileMX"},"How to write Dockerfile for Submarine MXNet jobs")))}m.isMDXComponent=!0}}]);