How Konduktor uploads and synchronizes your code and files before workload execution.
file_mounts backed by cloud storage buckets/credentials (the object
storage sync flow described below) is deprecated and will be removed in a
future version of Konduktor. Prefer building your application code into
your image or using workdir/git-based sync instead.
Users have the following options for submitting their application code as a Trainy workload.
(Re)building a docker image for every change and pushing it to a registry for launching a workload.
Committing changes to a development branch in git and checking it out in the workload
Synchronizing application code through file sync via file_mounts and workdir definitions.
The first option is often slow given the size of deep learning images so we focus on the the latter two here.
Full setup for file sync requires cloud storage configuration which can be found here.Konduktor mounts your cloud credentials into the job containers and places them in ~/.aws (S3) or ~/.config/gcloud (GS) at startup. If you plan to use command-line tools like aws s3, gsutil, or gcloud, ensure your image includes those CLIs or install them in your run: block.We check our cloud service account credentials in the Trainy cluster with this:
$ konduktor check <CLOUD STORAGE ALIAS> # s3, gs, etc.
Afterwards we configure the storage provider by setting ~/.konduktor/config.yaml
By default every machine auto-creates its own bucket named
konduktor-filemounts-<username>-<user_hash>. For teams this proliferates
buckets, so admins can instead point everyone at one shared bucket with
jobs.bucket (same key as SkyPilot’s config):
# ~/.konduktor/config.yamljobs: bucket: gs://konduktor-filemounts # {s3, gs}, an optional prefix is allowed
Each machine’s uploads are namespaced under its own folder so engineers
never collide, and each launch gets its own sub-folder:
gs://konduktor-filemounts/ alice-1a2b3c4d/ # <username>-<user_hash>, one per machine my-training-job-a1b2/ # <task_name>-<run_id>, one per launch workdir/ local-file-mounts/0 tmp-files/ bob-9f8e7d6c/ ...
Notes for admins:
The bucket must exist or be creatable by, and be readable/writable with,
every engineer’s cloud credentials (konduktor check gs) — the same
minimal permissions as the default flow.
An optional prefix is respected: gs://my-bucket/team-a places machine
folders under team-a/.
Konduktor never deletes the shared bucket or its objects; you own its
lifecycle. To keep it from growing unboundedly, attach an object TTL,
e.g. delete uploads older than 30 days:
With jobs.bucket set, Konduktor stops auto-creating per-machine
konduktor-filemounts-* buckets entirely, which keeps your cloud
inventory to a single, auditable bucket.
Use a .konduktorignore file to exclude files and directories from being synchronized.
It works similarly to .gitignore, and is evaluated relative to the sync root.
Patterns in .konduktorignore are matched relative to the location.
*.log # ignores *.log at the sync root (my_dir)secret.txt # ignores secret.txt at the sync root (my_dir)secret-dir1/** # ignores the entire secret-dir1/ subtreesecret-dir2/*.bin # ignores .bin files under secret-dir2/
Cloning private repositories is supported via both file sync of ssh keys to your object store or through secrets. This section demonstrates how to file sync an ssh key from our workstation onto the workload and configure SSH for pulling from a private repository.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Trainy Konduktor","colors":{"primary":"#F07900","light":"#F8A145","dark":"#D35100"},"logo":{"light":"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72","dark":"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72"},"favicon":"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72","navbar":{"links":[{"href":"mailto:support@trainy.ai","label":"Support"},{"href":"https://trainy.teleport.sh","label":"Konduktor Login","type":"button"}],"primary":{"type":"button","label":"Pluto","href":"https://pluto.trainy.ai"}},"footer":{"socials":{"github":"https://github.com/Trainy-ai","linkedin":"https://www.linkedin.com/company/trainy-ai"}},"banner":{"content":"🎓 Pluto PRO promo: academic users and early-stage startups can email \u003ca href='mailto:founders@trainy.ai'>founders@trainy.ai\u003c/a> for a PROMO code.","dismissible":true},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Community","icon":"discord","href":"https://discord.com/invite/HQUBJSVgAP"},{"anchor":"Blog","icon":"newspaper","href":"https://trainy.ai/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"trainy","hasAudioNarration":false,"actualSubdomain":"trainy","customDomains":["docs.trainy.ai"],"gitSource":{"type":"github","owner":"trainy-ai","repo":"konduktor","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6aed0a0b8899d359f306879c","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"Konduktor","count":70},{"language":"default","tag":"Pluto","count":56},{"language":"default","tag":"Core","count":24},{"language":"default","tag":"API Reference","count":22},{"language":"default","tag":"Examples","count":20},{"language":"default","tag":"Get Started","count":20},{"language":"default","tag":"Runs","count":19},{"language":"default","tag":"Example Task Yamls","count":13},{"language":"default","tag":"Visualizations","count":7},{"language":"default","tag":"Cloud Storage","count":5}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"launch-file-sync","slug":"/launch-file-sync","pageMetadata":{"title":"File Sync on Launch","description":"How Konduktor uploads and synchronizes your code and files before workload execution.","href":"/launch-file-sync"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How Konduktor uploads and synchronizes your code and files before workload execution.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`file_mounts`}),` backed by cloud storage buckets/credentials (the object\nstorage sync flow described below) is deprecated and will be removed in a\nfuture version of Konduktor. Prefer building your application code into\nyour image or using `,_jsx(_components.code,{children:`workdir`}),`/git-based sync instead.`]})}),`\n`,_jsx(_components.p,{children:`Users have the following options for submitting their application code as a Trainy workload.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`(Re)building a docker image for every change and pushing it to a registry for launching a workload.`}),`\n`,_jsx(_components.li,{children:`Committing changes to a development branch in git and checking it out in the workload`}),`\n`,_jsxs(_components.li,{children:[`Synchronizing application code through file sync via `,_jsx(_components.code,{children:`file_mounts`}),` and `,_jsx(_components.code,{children:`workdir`}),` definitions.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The first option is often slow given the size of deep learning images so we focus on the the latter two here.`}),`\n`,_jsx(Heading,{level:`2`,id:`setup`,children:`Setup`}),`\n`,_jsxs(_components.p,{children:[`Full setup for file sync requires cloud storage configuration which can be found `,_jsx(_components.a,{href:`/setup#optional-setup-cloud-storage-credentials`,children:`here`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Konduktor mounts your cloud credentials into the job containers and places them in `,_jsx(_components.code,{children:`~/.aws`}),` (S3) or `,_jsx(_components.code,{children:`~/.config/gcloud`}),` (GS) at startup. If you plan to use command-line tools like `,_jsx(_components.code,{children:`aws s3`}),`, `,_jsx(_components.code,{children:`gsutil`}),`, or `,_jsx(_components.code,{children:`gcloud`}),`, ensure your image includes those CLIs or install them in your `,_jsx(_components.code,{children:`run:`}),` block.`]}),`\n`,_jsx(_components.p,{children:`We check our cloud service account credentials in the Trainy cluster with this:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ konduktor check \u003cCLOUD STORAGE ALIAS> # s3, gs, etc.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Afterwards we configure the storage provider by setting `,_jsx(_components.code,{children:`~/.konduktor/config.yaml`})]}),`\n`,_jsx(CodeBlock,{numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# ~/.konduktor/config.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`allowed_clouds:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` - gs # {s3, gs}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`shared-bucket`,children:`Shared bucket`}),`\n`,_jsxs(_components.p,{children:[`By default every machine auto-creates its own bucket named\n`,_jsx(_components.code,{children:`konduktor-filemounts-\u003cusername>-\u003cuser_hash>`}),`. For teams this proliferates\nbuckets, so admins can instead point everyone at one shared bucket with\n`,_jsx(_components.code,{children:`jobs.bucket`}),` (same key as SkyPilot’s config):`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`# ~/.konduktor/config.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`jobs:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` bucket: gs://konduktor-filemounts # {s3, gs}, an optional prefix is allowed`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Each machine’s uploads are namespaced under its own folder so engineers\nnever collide, and each launch gets its own sub-folder:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`9`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`gs://konduktor-filemounts/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` alice-1a2b3c4d/ # \u003cusername>-\u003cuser_hash>, one per machine`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` my-training-job-a1b2/ # \u003ctask_name>-\u003crun_id>, one per launch`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` workdir/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` local-file-mounts/0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` tmp-files/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` bob-9f8e7d6c/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Notes for admins:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The bucket must exist or be creatable by, and be readable/writable with,\nevery engineer’s cloud credentials (`,_jsx(_components.code,{children:`konduktor check gs`}),`) — the same\n`,_jsx(_components.a,{href:`/minimal-cloud-permissions/GCP`,children:`minimal permissions`}),` as the default flow.`]}),`\n`,_jsxs(_components.li,{children:[`An optional prefix is respected: `,_jsx(_components.code,{children:`gs://my-bucket/team-a`}),` places machine\nfolders under `,_jsx(_components.code,{children:`team-a/`}),`.`]}),`\n`,_jsx(_components.li,{children:`Konduktor never deletes the shared bucket or its objects; you own its\nlifecycle. To keep it from growing unboundedly, attach an object TTL,\ne.g. delete uploads older than 30 days:`}),`\n`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ echo '{\"rule\": [{\"action\": {\"type\": \"Delete\"}, \"condition\": {\"age\": 30}}]}' > ttl.json`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`$ gcloud storage buckets update gs://konduktor-filemounts --lifecycle-file=ttl.json`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`With `,_jsx(_components.code,{children:`jobs.bucket`}),` set, Konduktor stops auto-creating per-machine\n`,_jsx(_components.code,{children:`konduktor-filemounts-*`}),` buckets entirely, which keeps your cloud\ninventory to a single, auditable bucket.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`usage`,children:`Usage`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=d767ea8f8e3ae39509403ef9bbac7a1b`,alt:`File Sync Pn`,\"data-og-width\":`1193`,width:`1193`,\"data-og-height\":`855`,height:`855`,\"data-path\":`images/file-sync.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?w=280\u0026fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=e9c364504543536da6b16980ad2c6bc8 280w, https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?w=560\u0026fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=c44e68b0cc28714e584897ba16970910 560w, https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?w=840\u0026fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=21c0b6cd0088a36852bec9e87f414735 840w, https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?w=1100\u0026fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=d2ad4ebdac08bde5524d33b1bb9622b6 1100w, https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?w=1650\u0026fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=7faf2785f71a46a9cca9eea2e93ea501 1650w, https://mintcdn.com/trainy/3o543hwBM6n6EiIi/images/file-sync.png?w=2500\u0026fit=max\u0026auto=format\u0026n=3o543hwBM6n6EiIi\u0026q=85\u0026s=7dc1aec4b099d8c6b7b33045e3176ca8 2500w`}),`\n`,_jsxs(_components.p,{children:[`When we run `,_jsx(_components.code,{children:`konduktor launch`}),` the following happens in this order. If any step fails, the workload will fast-fail.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`cloud storage credentials are preflight-checked (nothing is uploaded if they are invalid)`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`workdir`}),` and `,_jsx(_components.code,{children:`file_mounts`}),` are synchronized to object storage`]}),`\n`,_jsx(_components.li,{children:`workload is submitted`}),`\n`,_jsxs(_components.li,{children:[`workload, once active, will sync down `,_jsx(_components.code,{children:`workdir`}),` and `,_jsx(_components.code,{children:`file_mounts`})]}),`\n`]}),`\n`,_jsx(_components.p,{children:`In our workload definition, we can define the following:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`24`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`24`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`name: single-file-upload`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`num_nodes: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`workdir: .`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`file_mounts:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` # syntax is \u003cremote_dir>:\u003clocal_dir>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ~/test_dir: ./test_dir`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` # syntax is \u003cremote_file>:\u003clocal_file>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ~/static_path.txt: ./static_path.txt`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`resources:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` cpus: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` memory: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` image_id: ubuntu`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` labels:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` kueue.x-k8s.io/queue-name: user-queue`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` maxRunDurationSeconds: \"600\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`run: |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ls -lah`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ls -lah ~/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`konduktorignore`,children:`.konduktorignore`}),`\n`,_jsxs(_components.p,{children:[`Use a `,_jsx(_components.code,{children:`.konduktorignore`}),` file to exclude files and directories from being synchronized.\nIt works similarly to `,_jsx(_components.code,{children:`.gitignore`}),`, and is evaluated relative to the sync root.\nPatterns in `,_jsx(_components.code,{children:`.konduktorignore`}),` are matched relative to the location.`]}),`\n`,_jsx(Heading,{level:`3`,id:`examples`,children:`Examples`}),`\n`,_jsx(Heading,{level:`4`,id:`workdir`,children:`Workdir`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`workdir: ./my_dir`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Place `,_jsx(_components.code,{children:`.konduktorignore`}),` at `,_jsx(_components.code,{children:`./my_dir/.konduktorignore`}),`.`]}),`\n`,_jsx(Heading,{level:`4`,id:`file-mounts`,children:`File mounts`}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`file_mounts:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` /remote: ./my_dir`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Place `,_jsx(_components.code,{children:`.konduktorignore`}),` at `,_jsx(_components.code,{children:`./my_dir/.konduktorignore`}),`.`]}),`\n`,_jsxs(Heading,{level:`4`,id:`example-konduktorignore-in-/my_dir/`,children:[`Example `,_jsx(_components.code,{children:`.konduktorignore`}),` in `,_jsx(_components.code,{children:`./my_dir/`}),`:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`5`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`*.log # ignores *.log at the sync root (my_dir)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`secret.txt # ignores secret.txt at the sync root (my_dir)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`secret-dir1/** # ignores the entire secret-dir1/ subtree`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`secret-dir2/*.bin # ignores .bin files under secret-dir2/`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`cloning-private-github-repositories`,children:`Cloning private GitHub Repositories`}),`\n`,_jsxs(_components.p,{children:[`Cloning private repositories is supported via both file sync of ssh keys to your object store or through `,_jsx(_components.a,{href:`/secrets`,children:`secrets`}),`. This section demonstrates how to file sync an ssh key from our workstation onto the workload and configure SSH for pulling from a private repository.`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`32`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`32`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`name: private-repo-ssh`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`num_nodes: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`resources:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` cpus: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` memory: 2`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` image_id: ubuntu`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` labels:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` kueue.x-k8s.io/queue-name: user-queue`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` maxRunDurationSeconds: \"3200\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`file_mounts:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ~/.ssh/test-ssh-key: ./tests/secrets/test-ssh-key`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`run: |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` set -eux`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` apt-get update \u0026\u0026 apt-get install -y git openssh-client`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` if [[ -f ~/.ssh/test-ssh-key \u0026\u0026 -s ~/.ssh/test-ssh-key ]]; then`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo \"SSH key mounted and non-empty\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` else`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo \"SSH key missing or empty\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` exit 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` fi`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` chmod 600 ~/.ssh/test-ssh-key`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` echo -e \"Host github.com\\\\n\\\\tIdentityFile ~/.ssh/test-ssh-key\\\\n\\\\tStrictHostKeyChecking no\\\\n\" > ~/.ssh/config`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` git clone git@github.com:mygithubaccount/My-App.git`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"File Sync on Launch","description":"How Konduktor uploads and synchronizes your code and files before workload execution.","href":"/launch-file-sync"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Setup","slug":"setup","depth":2,"children":[{"title":"Shared bucket","slug":"shared-bucket","depth":3,"children":[]}]},{"title":"Usage","slug":"usage","depth":2,"children":[]},{"title":".konduktorignore","slug":"konduktorignore","depth":2,"children":[{"title":"Examples","slug":"examples","depth":3,"children":[]},{"title":"Workdir","slug":"workdir","depth":4,"children":[]},{"title":"File mounts","slug":"file-mounts","depth":4,"children":[]},{"title":"Example .konduktorignore in ./my_dir/:","slug":"example-konduktorignore-in-/my_dir/","depth":4,"children":[]}]},{"title":"Cloning private GitHub Repositories","slug":"cloning-private-github-repositories","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"trainy","siteName":"Trainy Konduktor","title":"File Sync on Launch - Trainy Konduktor","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-28T19:47:49.382Z","originalFileLocation":"launch-file-sync.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How Konduktor uploads and synchronizes your code and files before workload execution.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Trainy Konduktor\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"File Sync on Launch - Trainy Konduktor\">\u003cmeta data-mint-head property=\"og:description\" content=\"How Konduktor uploads and synchronizes your code and files before workload execution.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Trainy Konduktor\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.trainy.ai/launch-file-sync\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://trainy.mintlify.site/_mintlify/api/og/v2?division=Get+Started\u0026amp;title=File+Sync+on+Launch\u0026amp;description=How+Konduktor+uploads+and+synchronizes+your+code+and+files+before+workload+execution.\u0026amp;theme=3d9c285da33ee525cd476c3d\u0026amp;signature=8231c796605ad30a99de421030419b3e838c8ae32a4eb2e742958edb22fd30dd\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"File Sync on Launch - Trainy Konduktor\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How Konduktor uploads and synchronizes your code and files before workload execution.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://trainy.mintlify.site/_mintlify/api/og/v2?division=Get+Started\u0026amp;title=File+Sync+on+Launch\u0026amp;description=How+Konduktor+uploads+and+synchronizes+your+code+and+files+before+workload+execution.\u0026amp;theme=3d9c285da33ee525cd476c3d\u0026amp;signature=8231c796605ad30a99de421030419b3e838c8ae32a4eb2e742958edb22fd30dd\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/trainy/rockd6CB-Yto9fqu/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Trainy Konduktor\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#F07900\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.trainy.ai/launch-file-sync\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/launch-file-sync.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.trainy.ai/#organization\",\"name\":\"Trainy Konduktor\",\"url\":\"https://docs.trainy.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/trainy/l_Z-YzGUiwLATp8A/trainy.svg?fit=max\u0026auto=format\u0026n=l_Z-YzGUiwLATp8A\u0026q=85\u0026s=a69ed11bf7bc11900bbf4631c26f5b72\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.trainy.ai#website\",\"name\":\"Trainy Konduktor\",\"url\":\"https://docs.trainy.ai\",\"publisher\":{\"@id\":\"https://docs.trainy.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.trainy.ai/launch-file-sync#webpage\",\"url\":\"https://docs.trainy.ai/launch-file-sync\",\"name\":\"File Sync on Launch\",\"description\":\"How Konduktor uploads and synchronizes your code and files before workload execution.\",\"dateModified\":\"2026-08-28T19:47:49.382Z\",\"isPartOf\":{\"@id\":\"https://docs.trainy.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.trainy.ai/launch-file-sync#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.trainy.ai/launch-file-sync#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get Started\",\"item\":\"https://docs.trainy.ai/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"File Sync on Launch\",\"item\":\"https://docs.trainy.ai/launch-file-sync\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.trainy.ai/launch-file-sync#article\",\"headline\":\"File Sync on Launch\",\"name\":\"File Sync on Launch\",\"description\":\"How Konduktor uploads and synchronizes your code and files before workload execution.\",\"url\":\"https://docs.trainy.ai/launch-file-sync\",\"mainEntityOfPage\":{\"@id\":\"https://docs.trainy.ai/launch-file-sync#webpage\"},\"dateModified\":\"2026-08-28T19:47:49.382Z\",\"publisher\":{\"@id\":\"https://docs.trainy.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.trainy.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Trainy Konduktor\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Trainy Konduktor","nav":{"global":{"anchors":[{"anchor":"Community","icon":"discord","href":"https://discord.com/invite/HQUBJSVgAP"},{"anchor":"Blog","icon":"newspaper","href":"https://trainy.ai/blog"}]},"products":[{"product":"Konduktor","tabs":[{"tab":"Konduktor","groups":[{"group":"Get Started","pages":[{"title":"Overview","href":"/overview"},{"title":"Setup","href":"/setup"},{"title":"Quickstart","href":"/quickstart"},{"title":"Submit jobs through Trainy Hub","href":"/hub-quickstart"},{"title":"Run commands in a Hub job (experimental)","href":"/hub-job-shell"},{"title":"Common Commands","description":"Commands for launching and managing your Konduktor Jobs","href":"/commands"},{"title":"File Sync on Launch","href":"/launch-file-sync"},{"title":"File Sync during Run","description":"Understand how to persist or retrieve data while your workload is running.","href":"/runtime-file-sync"},{"title":"Distributed Multi-Node Jobs","href":"/distributed-jobs"},{"title":"Many Parallel Jobs","href":"/many-jobs"},{"title":"Run Lifecycle","href":"/lifecycle"},{"title":"Get Started with Grafana","href":"/observability"},{"title":"Managing Secrets","href":"/secrets"},{"title":"Environment Variables","href":"/env-vars"},{"title":"Python API","href":"/python-api"},{"title":"Return values from jobs","href":"/return-values"},{"title":"Tailscale Interactive SSH (Experimental)","href":"/tailscale"},{"title":"Serving Deployments (Experimental)","href":"/deployments"}]},{"group":"CLI","pages":[{"title":"CLI Reference","href":"/cli-reference"}]},{"group":"User Guides","pages":[{"title":"Authentication","href":"/authentication"},{"group":"Minimal Cloud Permissions","pages":[{"title":"GCP - gs","href":"/minimal-cloud-permissions/GCP"},{"title":"AWS - s3","href":"/minimal-cloud-permissions/AWS"}]},{"group":"Troubleshooting","pages":[{"title":"Troubleshooting \u0026 FAQ GCP","href":"/troubleshooting/GCP"}]}]},{"group":"Cluster Operators","pages":[{"title":"Enroll a worker cluster","href":"/cluster-enrollment"},{"title":"Install Cluster Telemetry","href":"/cluster-telemetry"}]}]},{"tab":"Examples","pages":[{"title":"Examples","href":"/config-schema"}]}]},{"product":"Pluto","pages":[{"title":"Pluto","href":"/pluto/overview"}]}]},"basePath":"","title":"File Sync on Launch - Trainy Konduktor","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":["10e4515597","a74be98ba7"],"chunks":["BannerMarkdown-Cj6eAYhz.js","dist-CdrJecqK.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-D-TRO5q5.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","zoom-image-lightbox-BFbLClTf.js","lightbox-handle-r17bVUz3.js"]}