{"id":808,"date":"2026-04-20T22:19:42","date_gmt":"2026-04-20T14:19:42","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/04\/20\/dagster-%e6%97%a5%e5%b8%b8%e6%93%8d%e4%bd%9c%e6%8c%87%e5%8d%97%ef%bc%9a%e6%94%b9%e7%a8%8b%e5%bc%8f%e3%80%81%e5%8a%a0%e5%a5%97%e4%bb%b6%e3%80%81%e7%94%a8-dokploy-%e6%96%b0%e5%a2%9e%e5%b0%88%e6%a1%88\/"},"modified":"2026-04-20T22:19:42","modified_gmt":"2026-04-20T14:19:42","slug":"dagster-%e6%97%a5%e5%b8%b8%e6%93%8d%e4%bd%9c%e6%8c%87%e5%8d%97%ef%bc%9a%e6%94%b9%e7%a8%8b%e5%bc%8f%e3%80%81%e5%8a%a0%e5%a5%97%e4%bb%b6%e3%80%81%e7%94%a8-dokploy-%e6%96%b0%e5%a2%9e%e5%b0%88%e6%a1%88","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/04\/20\/dagster-%e6%97%a5%e5%b8%b8%e6%93%8d%e4%bd%9c%e6%8c%87%e5%8d%97%ef%bc%9a%e6%94%b9%e7%a8%8b%e5%bc%8f%e3%80%81%e5%8a%a0%e5%a5%97%e4%bb%b6%e3%80%81%e7%94%a8-dokploy-%e6%96%b0%e5%a2%9e%e5%b0%88%e6%a1%88\/","title":{"rendered":"Dagster \u65e5\u5e38\u64cd\u4f5c\u6307\u5357\uff1a\u6539\u7a0b\u5f0f\u3001\u52a0\u5957\u4ef6\u3001\u7528 Dokploy \u65b0\u589e\u5c08\u6848"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Dagster \u65e5\u5e38\u64cd\u4f5c\u6307\u5357\uff1a\u6539\u7a0b\u5f0f\u3001\u52a0\u5957\u4ef6\u3001\u7528 Dokploy \u65b0\u589e\u5c08\u6848<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a Dagster \u90e8\u7f72\u5230 Dokploy \u4e4b\u5f8c\uff0c\u6700\u5e38\u9047\u5230\u7684\u4e0d\u662f\u90e8\u7f72\u672c\u8eab\uff0c\u800c\u662f\u300c\u6539\u5b8c\u7a0b\u5f0f\u600e\u9ebc\u8b93\u5b83\u751f\u6548\u300d\u3001\u300c\u52a0\u4e86\u65b0\u5957\u4ef6\u8981\u4e0d\u8981\u91cd\u555f\u300d\u3001\u300c\u60f3\u628a\u7b2c\u4e8c\u500b\u5c08\u6848\u585e\u9032\u540c\u4e00\u500b UI \u8981\u52d5\u54ea\u88e1\u300d\u3002\u9019\u7bc7\u7b46\u8a18\u628a\u9019\u4e09\u7a2e\u65e5\u5e38\u64cd\u4f5c\u6574\u7406\u6210\u6700\u77ed\u7684 SOP\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u63d0\uff1aDagster \u4ee5 <code>docker-compose<\/code> \u7684\u5f62\u5f0f\u90e8\u7f72\uff0c\u56db\u500b service \u662f <code>postgres<\/code>\u3001<code>user_code<\/code>\uff08gRPC code server\uff09\u3001<code>webserver<\/code>\u3001<code>daemon<\/code>\u3002\u7a0b\u5f0f\u78bc\u900f\u904e bind mount \u5f9e\u9060\u7aef\u4e3b\u6a5f\u7684\u67d0\u500b\u8cc7\u6599\u593e\u639b\u9032 <code>user_code<\/code> \u7684 <code>\/app<\/code>\uff0ccode location \u7531 <code>workspace.yaml<\/code> \u5ba3\u544a\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u672c\u6587\u5047\u8a2d\u4f60\u5df2\u7d93\u628a code \u8cc7\u6599\u593e\u7368\u7acb\u6210\u9060\u7aef\u4e3b\u6a5f\u4e0a\u81ea\u5df1\u638c\u7ba1\u7684\u8def\u5f91\uff08\u4f8b\u5982 <code>\/home\/&lt;USER&gt;\/dagster-projects\/&lt;PROJECT&gt;\/<\/code>\uff09\uff0c\u800c\u4e0d\u662f\u653e\u5728 Dokploy File Mount \u88e1\u3002\u9019\u6a23 Dokploy \u5728 Deploy \u6642\u4e0d\u6703\u8986\u84cb\u4f60\u624b\u6539\u7684\u6a94\u6848\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e00\u3001\u6539\u7a0b\u5f0f\uff1a\u4e0d\u91cd\u555f\u5bb9\u5668\uff0cUI \u9ede\u4e00\u4e0b Reload<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dagster \u7684 gRPC code server \u5728\u5bb9\u5668\u5167\u57f7\u884c\uff0c\u8f09\u5165 <code>definitions.py<\/code> \u5f8c\u6703\u628a asset\/job \u5b9a\u7fa9\u5e38\u99d0\u3002\u4f60\u6539\u6a94\u6848\u4e0d\u6703\u7acb\u523b\u751f\u6548\uff0c<strong>\u4f46\u4e0d\u9700\u8981\u91cd\u555f\u5bb9\u5668<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SOP\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>SSH \u5230\u9060\u7aef\u4e3b\u6a5f\uff0c\u7de8\u8f2f\u5c08\u6848\u8cc7\u6599\u593e\u4e0b\u7684 Python \u6a94<\/li>\n\n\n<li>\u6253\u958b Dagster UI \u2192 \u5de6\u5074 <strong>Deployment<\/strong>\uff08\u6216 <strong>Code locations<\/strong>\uff09\u2192 \u627e\u5230\u8a72 code location \u2192 \u9ede <strong>Reload<\/strong><\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Reload<\/code> \u6703\u8b93 code server \u5728\u5bb9\u5668\u88e1\u91cd\u958b\u4e00\u500b subprocess \u91cd\u65b0 import \u6a21\u7d44\uff0c\u5e7e\u79d2\u9418\u641e\u5b9a\u3002<strong>\u9019\u662f\u5beb asset \/ \u8abf job \u6642\u7684\u6a19\u6e96\u5faa\u74b0<\/strong>\uff0c\u4e0d\u8981\u6bcf\u6b21\u90fd\u8dd1 <code>docker restart<\/code>\uff0c\u66f4\u4e0d\u8981\u52d5 Dokploy Deploy\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ec0\u9ebc\u6642\u5019 Reload \u6703\u5931\u6548<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>\u4f60\u6539\u7684\u4e0d\u662f <code>definitions.py<\/code> \u672c\u8eab\uff0c\u800c\u662f\u67d0\u500b import \u93c8\u4e0a\u88ab cache \u7684\u6a21\u7d44\uff1aDagster \u6703\u91cd\u958b subprocess\uff0cPython \u4e0d\u6703\u7528\u820a\u7684\u5feb\u53d6\uff0c\u6240\u4ee5\u4e00\u822c\u4e0d\u6703\u5361\u3002<\/li>\n\n\n<li>\u4f60\u88dd\u4e86\u65b0\u7684 Python \u5957\u4ef6\u4f46\u9084\u6c92\u91cd\u555f\u5bb9\u5668\uff1aReload \u53ea\u662f\u91cd\u65b0 import\uff0c\u4e0d\u6703\u89f8\u767c <code>pip install<\/code>\uff0c\u770b\u4e0b\u4e00\u7bc0\u3002<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e8c\u3001\u52a0 Python \u5957\u4ef6\uff1a\u6539 <code>requirements.txt<\/code> \u5f8c restart \u4e00\u500b\u5bb9\u5668<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">compose \u7684 <code>user_code<\/code> service \u555f\u52d5\u6307\u4ee4\u88e1\u901a\u5e38\u6703\u9019\u6a23\u5beb\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">command:\n  - sh\n  - -c\n  - <span class=\"hljs-string\">\"pip install --cache-dir \/root\/.cache\/pip dagster==${DAGSTER_VERSION} dagster-postgres\n     &amp;&amp; (pip install --cache-dir \/root\/.cache\/pip -r \/app\/requirements.txt 2&gt;\/dev\/null || true)\n     &amp;&amp; dagster code-server start -h 0.0.0.0 -p 4000 -f definitions.py\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f <code>pip install -r requirements.txt<\/code> <strong>\u53ea\u5728\u5bb9\u5668\u555f\u52d5\u6642\u8dd1\u4e00\u6b21<\/strong>\u3002\u4f60\u628a <code>pandas<\/code> \u5beb\u9032 <code>requirements.txt<\/code>\uff0ccode \u88e1 <code>import pandas<\/code> \u7167\u6a23\u6703 <code>ModuleNotFoundError<\/code>\uff0c\u76f4\u5230\u5bb9\u5668\u91cd\u555f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SOP\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>\u7de8\u8f2f <code>requirements.txt<\/code><\/li>\n\n\n<li>\u91cd\u555f <code>user_code<\/code> \u5bb9\u5668<\/li>\n\n\n<li>\u7b49\u5bb9\u5668 healthy\uff08\u7d04 10\u201330 \u79d2\uff0c\u6709 pip cache \u6642\u66f4\u5feb\uff09<\/li>\n\n\n<li>UI \u9ede\u4e00\u6b21 <strong>Reload<\/strong> \u8b93\u65b0\u5957\u4ef6\u9032 code server<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u500b\u5e38\u898b\u7684\u8aa4\u5340<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u70ba\u5728 UI \u9ede Reload \u5c31\u6703\u91cd\u8dd1 pip install\u2014\u2014\u4e0d\u6703\u3002Reload \u53ea\u91cd\u65b0 import \u6a21\u7d44\u3002\u771f\u8981\u65b0\u5957\u4ef6\u751f\u6548\uff0c<strong>\u5fc5\u9808\u8b93 container \u7684 entrypoint \u91cd\u8dd1\u4e00\u6b21<\/strong>\uff0c\u6240\u4ee5 <code>docker restart<\/code> \u662f\u6700\u77ed\u8def\u5f91\uff1bDokploy Deploy \u4e5f\u53ef\u4ee5\uff0c\u4f46\u90a3\u6703\u628a\u6574\u500b compose \u91cd\u65b0 up \u4e00\u8f2a\uff0c\u591a\u82b1\u4e00\u500d\u6642\u9593\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u70ba\u4ec0\u9ebc\u4e0d\u628a pip install \u5beb\u9032 Docker image<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u7bc7\u7b46\u8a18\u5047\u8a2d\u7684 setup \u6bcf\u6b21\u555f\u52d5\u90fd\u8dd1 <code>pip install<\/code>\uff0c\u597d\u8655\u662f\uff1a\u6539\u4f9d\u8cf4\u4e0d\u7528 rebuild image\u3001\u958b\u767c\u671f\u8fed\u4ee3\u5feb\u3002\u58de\u8655\u662f\u51b7\u555f\u52d5\u6162\uff08\u9996\u6b21 2\u20133 \u5206\u9418\uff09\u3002\u9032\u5165\u7a69\u5b9a\u671f\u53ef\u4ee5\u6539\u6210\u81ea\u5df1 build \u4e00\u500b pre-installed \u7684 image \u66ff\u63db <code>python:3.x-slim<\/code>\uff0c\u4f46\u9019\u4e0d\u662f\u65e5\u5e38\u64cd\u4f5c\u8981\u78b0\u7684\u4e8b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001\u5728 Dokploy \u4e0a\u65b0\u589e\u7b2c\u4e8c\u500b Dagster \u5c08\u6848<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dagster \u7684 UI \u53ef\u4ee5\u540c\u6642\u986f\u793a\u591a\u500b code location\uff0c\u5f7c\u6b64\u662f<strong>\u5b8c\u5168\u7368\u7acb\u7684 Python \u74b0\u5883<\/strong>\u2014\u2014\u4f60\u53ef\u4ee5\u4e00\u500b\u5c08\u6848 pin <code>dagster==1.13.1<\/code>\uff0c\u53e6\u4e00\u500b\u8dd1 <code>1.14<\/code>\uff0c\u4e92\u4e0d\u5e72\u64fe\u3002\u6bcf\u500b code location \u5c0d\u61c9\u4e00\u500b\u7368\u7acb\u7684 gRPC \u5bb9\u5668\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6b65\u9a5f 1\uff1a\u5728\u9060\u7aef\u4e3b\u6a5f\u5efa\u7acb\u65b0\u5c08\u6848\u8cc7\u6599\u593e<\/h3>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">ssh &lt;USER&gt;@&lt;REMOTE_SERVER&gt;\nmkdir -p \/home\/&lt;USER&gt;\/dagster-projects\/ml_pipeline\ncat &gt; \/home\/&lt;USER&gt;\/dagster-projects\/ml_pipeline\/definitions.py &lt;&lt;<span class=\"hljs-string\">'PY'<\/span>\nfrom dagster import asset, Definitions\n\n@asset\ndef my_first_ml_asset():\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"hello from ml_pipeline\"<\/span>\n\ndefs = Definitions(assets=&#91;my_first_ml_asset])\nPY\ntouch \/home\/&lt;USER&gt;\/dagster-projects\/ml_pipeline\/requirements.txt\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5f37\u70c8\u5efa\u8b70\u6bcf\u500b\u5c08\u6848\u8cc7\u6599\u593e <code>git init<\/code> \u5404\u81ea\u4e00\u500b repo\uff0c\u4e4b\u5f8c\u597d\u505a\u7248\u672c\u63a7\u5236\u8207\u5354\u4f5c\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6b65\u9a5f 2\uff1a\u5728 Dokploy UI \u6539 compose \u52a0 service<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u958b Dokploy \u7684 compose \u7de8\u8f2f\u9801\uff0c<strong>\u8907\u88fd\u4e00\u4efd <code>user_code<\/code> service<\/strong> \u6539\u540d\u6210\u65b0\u5c08\u6848\u540d\u7a31\uff0c\u4e3b\u8981\u6539\u4e09\u4ef6\u4e8b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>service name\uff08\u4e5f\u662f workspace.yaml \u8981 reference \u7684 hostname\uff09<\/li>\n\n\n<li>volume \u7684 bind \u8def\u5f91\u6307\u5411\u65b0\u5c08\u6848\u8cc7\u6599\u593e<\/li>\n\n\n<li>\u4fdd\u7559\u76f8\u540c\u7684 healthcheck\u3001environment\u3001networks \u8a2d\u5b9a<\/li>\n\n<\/ul>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">  ml_pipeline:\n    image: python:<span class=\"hljs-number\">3.14<\/span>-slim\n    working_dir: \/app\n    command:\n      - sh\n      - -c\n      - <span class=\"hljs-string\">\"pip install --cache-dir \/root\/.cache\/pip dagster==${DAGSTER_VERSION} dagster-postgres\n         &amp;&amp; (pip install --cache-dir \/root\/.cache\/pip -r \/app\/requirements.txt 2&gt;\/dev\/null || true)\n         &amp;&amp; dagster code-server start -h 0.0.0.0 -p 4000 -f definitions.py\"<\/span>\n    environment:\n      DAGSTER_HOME: \/opt\/dagster\n      DAGSTER_POSTGRES_USER: dagster\n      DAGSTER_POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\n      DAGSTER_POSTGRES_DB: dagster\n    volumes:\n      - \/home\/&lt;USER&gt;\/dagster-projects\/ml_pipeline:\/app\n      - ..\/files\/dagster_home:\/opt\/dagster\n      - pip_cache:\/root\/.cache\/pip\n    networks: &#91;dagster_net]\n    healthcheck:\n      test: &#91;<span class=\"hljs-string\">\"CMD\"<\/span>, <span class=\"hljs-string\">\"dagster\"<\/span>, <span class=\"hljs-string\">\"api\"<\/span>, <span class=\"hljs-string\">\"grpc-health-check\"<\/span>, <span class=\"hljs-string\">\"-p\"<\/span>, <span class=\"hljs-string\">\"4000\"<\/span>]\n      interval: <span class=\"hljs-number\">10<\/span>s\n      timeout: <span class=\"hljs-number\">5<\/span>s\n      retries: <span class=\"hljs-number\">10<\/span>\n      start_period: <span class=\"hljs-number\">120<\/span>s\n    restart: always\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6ce8\u610f port \u662f 4000\uff0c\u4e0d\u7528\u6539\u4e5f\u4e0d\u7528\u66b4\u9732\u5230\u5bbf\u4e3b<\/strong>\uff1awebserver\/daemon \u5728 compose \u7db2\u8def\u5167\u4ee5 service name \u89e3\u6790\uff0c\u4e0d\u540c code server \u4e4b\u9593 port \u76f8\u540c\u4e0d\u885d\u7a81\uff0c\u53ea\u8981 hostname\uff08service name\uff09\u4e0d\u540c\u5373\u53ef\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6b65\u9a5f 3\uff1a\u5728 workspace.yaml \u52a0\u4e00\u500b <code>grpc_server<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">workspace.yaml \u88e1\u6bcf\u500b <code>grpc_server<\/code> \u5c31\u662f\u4e00\u500b code location\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">load_from:\n  - grpc_server:\n      host: user_code\n      <span class=\"hljs-attr\">port<\/span>: <span class=\"hljs-number\">4000<\/span>\n      <span class=\"hljs-attr\">location_name<\/span>: <span class=\"hljs-string\">\"main\"<\/span>\n  - grpc_server:\n      host: ml_pipeline\n      <span class=\"hljs-attr\">port<\/span>: <span class=\"hljs-number\">4000<\/span>\n      <span class=\"hljs-attr\">location_name<\/span>: <span class=\"hljs-string\">\"ml_pipeline\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>host<\/code> \u5c0d\u61c9 compose \u88e1\u7684 service name\uff0c<code>location_name<\/code> \u662f UI \u5074\u6b04\u986f\u793a\u7684\u540d\u5b57\uff0c\u53ef\u4ee5\u96a8\u610f\u53d6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6b65\u9a5f 4\uff1aDokploy \u6309 Deploy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dokploy \u6703\u628a\u65b0\u7684 compose \u9001\u5230\u9060\u7aef\u8dd1 <code>docker compose up -d<\/code>\u2014\u2014\u9019\u500b\u6307\u4ee4\u53ea\u6703\u5efa\u7acb\u65b0\u7684\u5bb9\u5668\uff08<code>ml_pipeline<\/code>\uff09\uff0c<strong>\u4e0d\u6703\u52d5\u5230\u5176\u4ed6\u5df2\u7d93 running \u7684\u5bb9\u5668<\/strong>\uff0c\u6240\u4ee5\u73fe\u6709\u7684 <code>hello<\/code> asset \u8ddf run history \u5168\u90fd\u4fdd\u7559\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u90e8\u7f72\u5b8c\u5e7e\u5341\u79d2\u5f8c\uff0cDagster UI \u5de6\u5074 Code locations \u5c31\u6703\u51fa\u73fe\u7b2c\u4e8c\u500b location\uff0c\u4f60\u53ef\u4ee5\u5207\u63db\u5230\u5b83\u53bb\u770b asset graph\u3001\u6392 run\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u7591\u96e3\uff1aUI \u4e0a\u65b0 location \u986f\u793a red \/ Failed to load<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>\u591a\u534a\u662f pip install \u9084\u6c92\u8dd1\u5b8c<\/strong>\u3002code server \u51b7\u555f\u52d5\u7b2c\u4e00\u6b21\u8981\u88dd dagster + dagster-postgres + \u4f60\u81ea\u5df1\u7684\u4f9d\u8cf4\uff0c\u9996\u6b21\u7d04 120 \u79d2\uff08<code>start_period<\/code> \u5c31\u662f\u70ba\u6b64\u8a2d\u5b9a\uff09\u3002\u7b49 healthcheck \u7da0\u4e86\u518d\u770b\u3002<\/li>\n\n\n<li><strong>\u6aa2\u67e5 daemon log<\/strong>\uff1a<code>docker logs &lt;COMPOSE_APP_NAME&gt;-daemon-1 --tail 50<\/code>\u3002\u5982\u679c gRPC \u9023\u4e0d\u5230\u3001\u6216 <code>DAGSTER_POSTGRES_*<\/code> env \u6c92\u8a2d\uff0c\u90fd\u6703\u5728\u9019\u88e1\u66b4\u9732\u3002<\/li>\n\n\n<li><strong>Health check \u5931\u6557<\/strong>\uff1a<code>dagster api grpc-health-check<\/code> \u56de non-zero \u8868\u793a code server \u9084\u6c92 import \u5b8c <code>definitions.py<\/code>\uff0c\u6216\u662f <code>definitions.py<\/code> \u6709 syntax error\u3002\u76f4\u63a5\u770b code server \u7684 log\uff1a<code>docker logs &lt;COMPOSE_APP_NAME&gt;-ml_pipeline-1<\/code>\u3002<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5feb\u901f\u5c0d\u7167\u8868<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u505a\u4ec0\u9ebc<\/th>\n<th>\u8981\u52d5\u4ec0\u9ebc<\/th>\n<th>\u751f\u6548\u65b9\u5f0f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u6539 asset \/ job \u7a0b\u5f0f\u78bc<\/td>\n<td>\u7de8\u8f2f\u5c08\u6848\u8cc7\u6599\u593e\u7684 <code>.py<\/code><\/td>\n<td>UI \u9ede <strong>Reload<\/strong>\uff08\u5e7e\u79d2\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u52a0 Python \u5957\u4ef6<\/td>\n<td>\u7de8\u8f2f <code>requirements.txt<\/code><\/td>\n<td><code>docker restart &lt;COMPOSE_APP_NAME&gt;-user_code-1<\/code>\uff08\u79d2\u7d1a\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u65b0\u589e code location<\/td>\n<td>Dokploy UI \u6539 compose + workspace.yaml<\/td>\n<td>Dokploy <strong>Deploy<\/strong>\uff08\u7d04 30 \u79d2\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u6539 <code>dagster.yaml<\/code><\/td>\n<td>Dokploy Mounts \u7de8\u8f2f<\/td>\n<td>Dokploy <strong>Deploy<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u5c0f\u7d50<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a\u300c\u7a0b\u5f0f\u78bc\u300d\u5f9e Dokploy File Mount \u642c\u5230\u9060\u7aef\u4e3b\u6a5f\u4e0a\u4f60\u81ea\u5df1\u7ba1\u7684\u8cc7\u6599\u593e\uff0c\u662f Dagster + Dokploy \u9019\u5957\u7d44\u5408\u6700\u91cd\u8981\u7684\u4e00\u500b\u67b6\u69cb\u6c7a\u5b9a\u3002\u505a\u4e86\u9019\u4e00\u6b65\uff0c\u65e5\u5e38\u64cd\u4f5c\u5c31\u7c21\u5316\u6210\u300c\u6539\u6a94 \u2192 Reload\u300d\u2014\u2014\u4e0d\u7528\u6bcf\u6b21\u90fd\u7d93\u904e Dokploy \u7684 Deploy cycle\uff0c\u4e5f\u4e0d\u7528\u64d4\u5fc3\u624b\u6539\u88ab Dokploy DB \u8986\u84cb\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dokploy \u8ca0\u8cac\u7d50\u69cb\uff08\u54ea\u4e9b service\u3001\u600e\u9ebc\u9023\u63a5\uff09\uff0c\u4f60\u8ca0\u8cac\u5167\u5bb9\uff08\u5beb\u4ec0\u9ebc asset\u3001\u88dd\u4ec0\u9ebc\u5957\u4ef6\uff09\u2014\u2014\u9019\u662f\u6700\u9806\u7684\u5206\u5de5\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dagster \u8dd1\u5728 Dokploy \u4e0a\u4ee5\u5f8c\uff0c\u65e5\u5e38\u8981\u6539 code\u3001\u52a0 Python \u5957\u4ef6\u3001\u6216\u5efa\u65b0\u7684 code location \u600e\u9ebc\u505a\uff1f\u4e09\u7a2e\u5834\u666f\u5404\u81ea\u5c0d\u61c9\u7684\u6700\u77ed\u6b65\u9a5f\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rolpb_likes":0,"footnotes":""},"categories":[810,820],"tags":[821,822,802,823],"class_list":["post-808","post","type-post","status-publish","format-standard","hentry","category-dokploy-","category-dagster","tag-dagster","tag-docker-compose-2","tag-dokploy","tag-workflow"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/comments?post=808"}],"version-history":[{"count":0,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/808\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}