{"id":388,"date":"2026-08-11T10:50:50","date_gmt":"2026-08-11T02:50:50","guid":{"rendered":"https:\/\/numsimlab.com\/?p=388"},"modified":"2026-08-11T10:50:50","modified_gmt":"2026-08-11T02:50:50","slug":"binder-%e4%bb%8b%e7%bb%8d","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=388","title":{"rendered":"Binder \u4ecb\u7ecd"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Binder \u4ecb\u7ecd \u00b7 Binder Introduction<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.info-box.success{border-left-color:var(--accent2)}.info-box.success strong{color:var(--accent2)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\npre.code-block code{background:none;border:none;padding:0;font-size:inherit}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0;border-radius:var(--radius);border:1px solid var(--rule)}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody tr:last-child td{border-bottom:none}\ntbody td:first-child{text-align:left;font-weight:600}\ncaption{caption-side:bottom;text-align:center;font-size:.8rem;color:var(--muted);margin-top:.5rem;padding:.4rem}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.do h4{color:var(--accent2)}\n.compare-col.dont h4{color:var(--accent3)}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule);overflow-x:auto}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\nfigure{text-align:center;margin:1.5rem 0}\nfigcaption{font-size:.8rem;color:var(--muted);margin-top:.5rem}\n.badge{display:inline-flex;align-items:center;gap:.3rem;padding:.2rem .6rem;border-radius:4px;font-size:.78rem;font-weight:600;margin:0 .15rem}\n.badge.binder{background:var(--tag-b);color:var(--tag-b-t)}\n.badge.hub{background:var(--tag-g);color:var(--tag-g-t)}\n.badge.docker{background:var(--tag-p);color:var(--tag-p-t)}\n.file-tree{background:var(--code-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.85rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;color:var(--ink)}\n.file-tree .dir{color:var(--accent);font-weight:600}\n.file-tree .file{color:var(--muted)}\n.file-tree .config{color:var(--accent2);font-weight:600}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:22px;font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>&#128269;<\/span> Binder \u4ecb\u7ecd<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n<main>\n\n<!-- ======== \u4e2d\u6587\u7248 ======== -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Binder \u4ecb\u7ecd<span class=\"sub\">\u5c06\u4ee3\u7801\u4ed3\u5e93\u53d8\u6210\u53ef\u4ea4\u4e92\u7684\u5728\u7ebf\u8ba1\u7b97\u73af\u5883<\/span><\/h1>\n  <p>Binder \u662f\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u80fd\u591f\u5c06\u5305\u542b\u4ee3\u7801\u548c\u914d\u7f6e\u6587\u4ef6\u7684 Git \u4ed3\u5e93\u8f6c\u5316\u4e3a\u53ef\u5206\u4eab\u3001\u53ef\u4ea4\u4e92\u7684\u5728\u7ebf\u8ba1\u7b97\u73af\u5883\uff0c\u8ba9\u4efb\u4f55\u4eba\u90fd\u65e0\u9700\u5b89\u88c5\u5373\u53ef\u5728\u6d4f\u89c8\u5668\u4e2d\u8fd0\u884c\u4f60\u7684\u4ee3\u7801\u3002<sup><a href=\"#cite-1\">[1]<\/a><\/sup><\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-1\">\u4e00\u3001\u4ec0\u4e48\u662f Binder<\/a><\/li>\n    <li><a href=\"#zh-2\">\u4e8c\u3001\u6838\u5fc3\u6982\u5ff5\u4e0e\u751f\u6001\u7cfb\u7edf<\/a><\/li>\n    <li><a href=\"#zh-3\">\u4e09\u3001\u5de5\u4f5c\u539f\u7406<\/a><\/li>\n    <li><a href=\"#zh-4\">\u56db\u3001\u914d\u7f6e\u6587\u4ef6\u8be6\u89e3<\/a><\/li>\n    <li><a href=\"#zh-5\">\u4e94\u3001\u4f7f\u7528\u6d41\u7a0b<\/a><\/li>\n    <li><a href=\"#zh-6\">\u516d\u3001\u5e38\u89c1\u4f7f\u7528\u573a\u666f<\/a><\/li>\n    <li><a href=\"#zh-7\">\u4e03\u3001\u6700\u4f73\u5b9e\u8df5\u4e0e\u6ce8\u610f\u4e8b\u9879<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- \u4e00\u3001\u4ec0\u4e48\u662f Binder -->\n<h2 id=\"zh-1\">\u4e00\u3001\u4ec0\u4e48\u662f Binder<\/h2>\n\n<p><strong>Binder<\/strong>\uff08\u4e5f\u79f0\u4e3a Binder-ready repository\uff09\u662f\u4e00\u4e2a\u4ee3\u7801\u4ed3\u5e93\uff0c\u5b83\u5305\u542b\u81f3\u5c11\u4e24\u6837\u4e1c\u897f\uff1a<strong>\u4f9b\u4eba\u4eec\u8fd0\u884c\u7684\u4ee3\u7801\u6216\u5185\u5bb9<\/strong>\uff0c\u4ee5\u53ca<strong>\u7528\u4e8e\u6307\u5b9a\u8fd0\u884c\u73af\u5883\u7684\u914d\u7f6e\u6587\u4ef6<\/strong>\u3002\u5f53\u4f60\u5c06\u8fd9\u6837\u4e00\u4e2a\u4ed3\u5e93\u63d0\u4ea4\u7ed9 Binder \u670d\u52a1\u65f6\uff0c\u5b83\u4f1a\u81ea\u52a8\u6784\u5efa\u4e00\u4e2a\u5305\u542b\u6240\u9700\u4f9d\u8d56\u7684 Docker \u955c\u50cf\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u53ef\u5206\u4eab\u7684\u94fe\u63a5\uff0c\u8ba9\u4efb\u4f55\u4eba\u90fd\u80fd\u591f\u5728\u6d4f\u89c8\u5668\u4e2d\u76f4\u63a5\u8bbf\u95ee\u548c\u8fd0\u884c\u4f60\u7684\u4ee3\u7801\u3002<sup><a href=\"#cite-2\">[2]<\/a><\/sup><\/p>\n\n<div class=\"info-box\">\n  <strong>\u4e00\u53e5\u8bdd\u7406\u89e3\uff1a<\/strong>\u7ed9 Binder \u4e00\u4e2a GitHub \u4ed3\u5e93\u5730\u5740\uff0c\u5b83\u8fd8\u4f60\u4e00\u4e2a\u53ef\u76f4\u63a5\u5728\u6d4f\u89c8\u5668\u4e2d\u8fd0\u884c\u7684\u4ea4\u4e92\u5f0f\u8ba1\u7b97\u73af\u5883\u2014\u2014\u65e0\u9700\u5b89\u88c5\u3001\u65e0\u9700\u914d\u7f6e\u3001\u5373\u5f00\u5373\u7528\u3002\n<\/div>\n\n<div class=\"card\">\n  <h4>Binder \u7684\u6838\u5fc3\u4ef7\u503c<\/h4>\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-g\">\u96f6\u5b89\u88c5<\/span> \u7528\u6237\u65e0\u9700\u5728\u672c\u5730\u5b89\u88c5\u4efb\u4f55\u4f9d\u8d56\uff0c\u6253\u5f00\u94fe\u63a5\u5373\u53ef\u8fd0\u884c\u4ee3\u7801\u3002<\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-b\">\u53ef\u590d\u73b0<\/span> \u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u9501\u5b9a\u73af\u5883\u7248\u672c\uff0c\u786e\u4fdd\u4efb\u4f55\u4eba\u8fd0\u884c\u7684\u7ed3\u679c\u4e00\u81f4\u3002<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-y\">\u53ef\u5206\u4eab<\/span> \u751f\u6210\u4e00\u4e2a URL \u94fe\u63a5\uff0c\u53d1\u9001\u7ed9\u4ed6\u4eba\u5373\u53ef\u5171\u4eab\u4f60\u7684\u8ba1\u7b97\u73af\u5883\u3002<\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-p\">\u514d\u8d39\u4f7f\u7528<\/span> mybinder.org \u63d0\u4f9b\u514d\u8d39\u7684\u516c\u5171\u670d\u52a1\uff0c\u7531\u5f00\u6e90\u793e\u533a\u7ef4\u62a4\u3002<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- \u4e8c\u3001\u6838\u5fc3\u6982\u5ff5\u4e0e\u751f\u6001\u7cfb\u7edf -->\n<h2 id=\"zh-2\">\u4e8c\u3001\u6838\u5fc3\u6982\u5ff5\u4e0e\u751f\u6001\u7cfb\u7edf<\/h2>\n\n<p>Binder \u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u7f51\u7ad9\uff0c\u5b83\u80cc\u540e\u7531\u591a\u4e2a\u5f00\u6e90\u9879\u76ee\u7ec4\u6210\u4e00\u4e2a\u5b8c\u6574\u7684\u751f\u6001\u7cfb\u7edf\u3002\u7406\u89e3\u8fd9\u4e9b\u6982\u5ff5\u6709\u52a9\u4e8e\u66f4\u597d\u5730\u4f7f\u7528\u548c\u90e8\u7f72 Binder\u3002<\/p>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u6982\u5ff5<\/th>\n        <th>\u8bf4\u660e<\/th>\n        <th>\u89d2\u8272<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><span class=\"badge binder\">Binder<\/span><\/td>\n        <td>\u4e00\u4e2a\u5305\u542b\u4ee3\u7801\u548c\u914d\u7f6e\u6587\u4ef6\u7684\u4ed3\u5e93\uff0c\u53ef\u88ab BinderHub \u6784\u5efa\u4e3a\u53ef\u4ea4\u4e92\u73af\u5883<\/td>\n        <td>\u8f93\u5165<\/td>\n      <\/tr>\n      <tr>\n        <td><span class=\"badge hub\">BinderHub<\/span><\/td>\n        <td>\u670d\u52a1\u5668\u7aef\u6280\u672f\uff0c\u5c06\u4ed3\u5e93\u8f6c\u5316\u4e3a\u4ea4\u4e92\u5f0f\u8ba1\u7b97\u73af\u5883\uff0c\u8fd0\u884c\u5728 Kubernetes \u4e0a<\/td>\n        <td>\u6784\u5efa\u5f15\u64ce<\/td>\n      <\/tr>\n      <tr>\n        <td><span class=\"badge docker\">repo2docker<\/span><\/td>\n        <td>\u5e95\u5c42\u5de5\u5177\uff0c\u8bfb\u53d6\u4ed3\u5e93\u4e2d\u7684\u914d\u7f6e\u6587\u4ef6\u5e76\u6784\u5efa Docker \u955c\u50cf<\/td>\n        <td>\u6784\u5efa\u5de5\u5177<\/td>\n      <\/tr>\n      <tr>\n        <td>mybinder.org<\/td>\n        <td>BinderHub \u7684\u514d\u8d39\u516c\u5171\u90e8\u7f72\uff0c\u7531\u793e\u533a\u8054\u5408\u7ef4\u62a4<\/td>\n        <td>\u516c\u5171\u670d\u52a1<\/td>\n      <\/tr>\n      <tr>\n        <td>JupyterHub<\/td>\n        <td>\u591a\u7528\u6237 Jupyter \u670d\u52a1\u7ba1\u7406\u5668\uff0cBinderHub \u57fa\u4e8e\u5b83\u63d0\u4f9b\u7528\u6237\u4f1a\u8bdd<\/td>\n        <td>\u4f1a\u8bdd\u7ba1\u7406<\/td>\n      <\/tr>\n      <tr>\n        <td>Kubernetes<\/td>\n        <td>\u5bb9\u5668\u7f16\u6392\u5e73\u53f0\uff0c\u652f\u6491 BinderHub \u7684\u5f39\u6027\u4f38\u7f29\u548c\u8d44\u6e90\u8c03\u5ea6<\/td>\n        <td>\u57fa\u7840\u8bbe\u65bd<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 1<\/strong> Binder \u751f\u6001\u7cfb\u7edf\u7684\u6838\u5fc3\u7ec4\u4ef6<\/caption>\n  <\/table>\n<\/div>\n\n<figure>\n  <div class=\"flow-diagram\">\n    <div class=\"flow-row\">\n      <span class=\"flow-item\">Git \u4ed3\u5e93<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item purple\">repo2docker<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">Docker \u955c\u50cf<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">BinderHub<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">\u6d4f\u89c8\u5668\u4e2d\u7684<br>\u4ea4\u4e92\u73af\u5883<\/span>\n    <\/div>\n  <\/div>\n  <figcaption><strong>\u56fe 1<\/strong> Binder \u4ece\u4ed3\u5e93\u5230\u4ea4\u4e92\u73af\u5883\u7684\u6784\u5efa\u6d41\u7a0b<\/figcaption>\n<\/figure>\n\n<!-- \u4e09\u3001\u5de5\u4f5c\u539f\u7406 -->\n<h2 id=\"zh-3\">\u4e09\u3001\u5de5\u4f5c\u539f\u7406<\/h2>\n\n<p>\u5f53\u7528\u6237\u8bbf\u95ee\u4e00\u4e2a Binder \u94fe\u63a5\u65f6\uff0c\u7cfb\u7edf\u4f1a\u7ecf\u5386\u4ee5\u4e0b\u6d41\u7a0b\u6765\u5b8c\u6210\u73af\u5883\u6784\u5efa\u548c\u4f1a\u8bdd\u542f\u52a8\uff1a<sup><a href=\"#cite-2\">[2]<\/a><\/sup><\/p>\n\n<ol class=\"steps\">\n  <li>\n    <strong>\u4ed3\u5e93\u63d0\u4ea4<\/strong>\n    <span class=\"note\">\u7528\u6237\u5728 mybinder.org \u8f93\u5165\u4e00\u4e2a\u516c\u5f00\u7684 Git \u4ed3\u5e93\u5730\u5740\uff08GitHub\u3001GitLab \u6216 BitBucket\uff09\u3002\u4ed3\u5e93\u4e2d\u5fc5\u987b\u5305\u542b\u4ee3\u7801\u6587\u4ef6\u548c\u81f3\u5c11\u4e00\u4e2a\u73af\u5883\u914d\u7f6e\u6587\u4ef6\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u73af\u5883\u68c0\u6d4b<\/strong>\n    <span class=\"note\">repo2docker \u626b\u63cf\u4ed3\u5e93\u6839\u76ee\u5f55\u6216 <code>binder\/<\/code> \u6587\u4ef6\u5939\uff0c\u8bc6\u522b\u914d\u7f6e\u6587\u4ef6\uff08\u5982 environment.yml\u3001requirements.txt \u7b49\uff09\uff0c\u786e\u5b9a\u9700\u8981\u5b89\u88c5\u7684\u4f9d\u8d56\u548c\u8fd0\u884c\u65f6\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>Docker \u955c\u50cf\u6784\u5efa<\/strong>\n    <span class=\"note\">\u6839\u636e\u68c0\u6d4b\u5230\u7684\u914d\u7f6e\u6587\u4ef6\uff0crepo2docker \u81ea\u52a8\u6784\u5efa\u4e00\u4e2a Docker \u955c\u50cf\uff0c\u5305\u542b\u6240\u6709\u5fc5\u9700\u7684\u8f6f\u4ef6\u5305\u3001\u5e93\u548c\u8fd0\u884c\u65f6\u73af\u5883\u3002\u5982\u679c\u4e4b\u524d\u5df2\u6784\u5efa\u8fc7\u76f8\u540c\u7248\u672c\u7684\u955c\u50cf\uff0c\u5219\u76f4\u63a5\u590d\u7528\u7f13\u5b58\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u4f1a\u8bdd\u542f\u52a8<\/strong>\n    <span class=\"note\">\u6784\u5efa\u5b8c\u6210\u540e\uff0cBinderHub \u901a\u8fc7 JupyterHub \u5728 Kubernetes \u96c6\u7fa4\u4e0a\u542f\u52a8\u4e00\u4e2a\u5bb9\u5668\u5b9e\u4f8b\uff0c\u4e3a\u7528\u6237\u5206\u914d\u4e00\u4e2a\u4e34\u65f6\u7684\u4ea4\u4e92\u5f0f\u8ba1\u7b97\u73af\u5883\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u7528\u6237\u4ea4\u4e92<\/strong>\n    <span class=\"note\">\u7528\u6237\u5728\u6d4f\u89c8\u5668\u4e2d\u770b\u5230 Jupyter Notebook \/ JupyterLab \u754c\u9762\uff0c\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884c\u4ee3\u7801\u3001\u7f16\u8f91\u6587\u4ef6\u3001\u67e5\u770b\u7ed3\u679c\u3002\u4f1a\u8bdd\u5728\u5173\u95ed\u540e\u4e0d\u4fdd\u7559\u4efb\u4f55\u72b6\u6001\u3002<\/span>\n  <\/li>\n<\/ol>\n\n<div class=\"info-box warn\">\n  <strong>\u91cd\u8981\u63d0\u793a\uff1a<\/strong>Binder \u73af\u5883\u662f<strong>\u4e34\u65f6\u6027\u7684<\/strong>\u3002\u5f53\u7528\u6237\u5173\u95ed\u6d4f\u89c8\u5668\u6807\u7b7e\u9875\u6216\u4f1a\u8bdd\u8d85\u65f6\u540e\uff0c\u6240\u6709\u66f4\u6539\u90fd\u5c06\u4e22\u5931\u3002Binder \u4e0d\u9002\u5408\u7528\u4e8e\u6301\u4e45\u5316\u6570\u636e\u5b58\u50a8\uff0c\u800c\u662f\u7528\u4e8e\u6f14\u793a\u3001\u6559\u5b66\u548c\u5feb\u901f\u5206\u4eab\u3002\n<\/div>\n\n<!-- \u56db\u3001\u914d\u7f6e\u6587\u4ef6\u8be6\u89e3 -->\n<h2 id=\"zh-4\">\u56db\u3001\u914d\u7f6e\u6587\u4ef6\u8be6\u89e3<\/h2>\n\n<p>Binder \u4f7f\u7528 <strong>repo2docker<\/strong> \u6765\u8bc6\u522b\u914d\u7f6e\u6587\u4ef6\u5e76\u6784\u5efa\u73af\u5883\u3002\u8fd9\u4e9b\u914d\u7f6e\u6587\u4ef6\u5e76\u975e Binder \u4e13\u6709\uff0c\u800c\u662f\u6cbf\u7528\u4e86\u6570\u636e\u79d1\u5b66\u793e\u533a\u5df2\u6709\u7684\u6807\u51c6\u683c\u5f0f\u3002\u914d\u7f6e\u6587\u4ef6\u53ef\u653e\u7f6e\u5728\u4ed3\u5e93\u6839\u76ee\u5f55\u6216 <code>binder\/<\/code> \u6587\u4ef6\u5939\u4e2d\u3002<sup><a href=\"#cite-3\">[3]<\/a><\/sup><\/p>\n\n<h3>4.1 \u7814\u7a76\u4e0e\u6570\u636e\u79d1\u5b66\u914d\u7f6e<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u6587\u4ef6\u540d<\/th>\n        <th>\u7528\u9014<\/th>\n        <th>\u9002\u7528\u8bed\u8a00<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>environment.yml<\/code><\/td>\n        <td>\u5b9a\u4e49 conda \u73af\u5883\uff08\u63a8\u8350\u65b9\u5f0f\uff09<\/td>\n        <td>Python \/ R \/ \u901a\u7528<\/td>\n      <\/tr>\n      <tr>\n        <td><code>install.R<\/code><\/td>\n        <td>\u5b89\u88c5 R \u5305<\/td>\n        <td>R<\/td>\n      <\/tr>\n      <tr>\n        <td><code>DESCRIPTION<\/code><\/td>\n        <td>\u4f5c\u4e3a R \u5305\u5b89\u88c5<\/td>\n        <td>R<\/td>\n      <\/tr>\n      <tr>\n        <td><code>Project.toml<\/code><\/td>\n        <td>\u5b9a\u4e49 Julia \u73af\u5883<\/td>\n        <td>Julia<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 2<\/strong> \u7814\u7a76\u4e0e\u6570\u636e\u79d1\u5b66\u5de5\u4f5c\u6d41\u914d\u7f6e\u6587\u4ef6<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.2 \u8f6f\u4ef6\u5f00\u53d1\u914d\u7f6e<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u6587\u4ef6\u540d<\/th>\n        <th>\u7528\u9014<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>requirements.txt<\/code><\/td>\n        <td>\u4f7f\u7528 pip \u5b89\u88c5 Python \u5305<\/td>\n      <\/tr>\n      <tr>\n        <td><code>Pipfile<\/code> \/ <code>Pipfile.lock<\/code><\/td>\n        <td>\u4f7f\u7528 Pipenv \u5b89\u88c5 Python \u73af\u5883<\/td>\n      <\/tr>\n      <tr>\n        <td><code>pyproject.toml<\/code><\/td>\n        <td>\u5b89\u88c5 Python \u5305\uff08\u73b0\u4ee3\u6807\u51c6\uff09<\/td>\n      <\/tr>\n      <tr>\n        <td><code>setup.py<\/code><\/td>\n        <td>\u5b89\u88c5 Python \u5305\uff08\u4f20\u7edf\u65b9\u5f0f\uff09<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 3<\/strong> \u8f6f\u4ef6\u5f00\u53d1\u5de5\u4f5c\u6d41\u914d\u7f6e\u6587\u4ef6<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.3 \u7cfb\u7edf\u7ea7\u914d\u7f6e<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u6587\u4ef6\u540d<\/th>\n        <th>\u7528\u9014<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>apt.txt<\/code><\/td>\n        <td>\u4f7f\u7528 apt-get \u5b89\u88c5\u7cfb\u7edf\u7ea7\u8f6f\u4ef6\u5305<\/td>\n      <\/tr>\n      <tr>\n        <td><code>runtime.txt<\/code><\/td>\n        <td>\u6307\u5b9a\u8fd0\u884c\u65f6\u7248\u672c\uff08\u5982 Python 3.11\u3001R 4.3\uff09<\/td>\n      <\/tr>\n      <tr>\n        <td><code>default.nix<\/code><\/td>\n        <td>\u4f7f\u7528 Nix \u5305\u7ba1\u7406\u5668\u5b89\u88c5\u73af\u5883<\/td>\n      <\/tr>\n      <tr>\n        <td><code>Dockerfile<\/code><\/td>\n        <td>\u5b8c\u5168\u81ea\u5b9a\u4e49\u73af\u5883\uff08\u6700\u9ad8\u4f18\u5148\u7ea7\uff0c\u8986\u76d6\u5176\u4ed6\u914d\u7f6e\uff09<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 4<\/strong> \u7cfb\u7edf\u7ea7\u914d\u7f6e\u6587\u4ef6<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.4 \u6784\u5efa\u540e\u64cd\u4f5c<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u6587\u4ef6\u540d<\/th>\n        <th>\u7528\u9014<\/th>\n        <th>\u6267\u884c\u65f6\u673a<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>postBuild<\/code><\/td>\n        <td>\u73af\u5883\u5b89\u88c5\u540e\u6267\u884c\u7684\u811a\u672c\uff08\u5982\u4e0b\u8f7d\u6570\u636e\u3001\u7f16\u8bd1\u4ee3\u7801\uff09<\/td>\n        <td>\u6784\u5efa\u955c\u50cf\u65f6\uff08\u56fa\u5316\u5230\u955c\u50cf\u4e2d\uff09<\/td>\n      <\/tr>\n      <tr>\n        <td><code>start<\/code><\/td>\n        <td>\u7528\u6237\u4f1a\u8bdd\u5f00\u59cb\u524d\u6267\u884c\u7684\u811a\u672c<\/td>\n        <td>\u6bcf\u6b21\u4f1a\u8bdd\u542f\u52a8\u65f6\uff08\u4e0d\u56fa\u5316\uff09<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 5<\/strong> \u6784\u5efa\u540e\u64cd\u4f5c\u914d\u7f6e\u6587\u4ef6<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.5 \u5178\u578b\u4ed3\u5e93\u7ed3\u6784<\/h3>\n\n<div class=\"file-tree\">.\/\n&#9500;&#8219; <span class=\"config\">environment.yml<\/span>      <span class=\"file\"># conda \u73af\u5883\u914d\u7f6e\uff08\u63a8\u8350\uff09<\/span>\n&#9500;&#8219; <span class=\"config\">requirements.txt<\/span>     <span class=\"file\"># pip \u4f9d\u8d56\uff08\u4e8c\u9009\u4e00\uff09<\/span>\n&#9500;&#8219; <span class=\"config\">apt.txt<\/span>              <span class=\"file\"># \u7cfb\u7edf\u7ea7\u4f9d\u8d56\uff08\u5982 git, ffmpeg\uff09<\/span>\n&#9500;&#8219; <span class=\"config\">postBuild<\/span>            <span class=\"file\"># \u6784\u5efa\u540e\u811a\u672c\uff08\u4e0b\u8f7d\u6570\u636e\u7b49\uff09<\/span>\n&#9500;&#8219; <span class=\"config\">runtime.txt<\/span>          <span class=\"file\"># \u6307\u5b9a\u8fd0\u884c\u65f6\u7248\u672c<\/span>\n&#9500;&#8219; index.ipynb           <span class=\"file\"># Jupyter Notebook \u4e3b\u6587\u4ef6<\/span>\n&#9500;&#8219; data\/                 <span class=\"dir\"># \u6570\u636e\u76ee\u5f55<\/span>\n&#9474;&nbsp;&nbsp; &#9492;&#8219; dataset.csv\n&#9492;&#8219; README.md             <span class=\"file\"># \u9879\u76ee\u8bf4\u660e<\/span><\/div>\n\n<p>\u6216\u8005\u5c06\u6240\u6709\u914d\u7f6e\u6587\u4ef6\u7edf\u4e00\u653e\u5728 <code>binder\/<\/code> \u6587\u4ef6\u5939\u4e2d\uff1a<\/p>\n\n<div class=\"file-tree\">.\/\n&#9500;&#8219; <span class=\"dir\">binder\/<\/span>\n&#9474;&nbsp;&nbsp; &#9500;&#8219; <span class=\"config\">environment.yml<\/span>\n&#9474;&nbsp;&nbsp; &#9500;&#8219; <span class=\"config\">apt.txt<\/span>\n&#9474;&nbsp;&nbsp; &#9492;&#8219; <span class=\"config\">postBuild<\/span>\n&#9500;&#8219; index.ipynb\n&#9492;&#8219; README.md<\/div>\n\n<h3>4.6 \u914d\u7f6e\u6587\u4ef6\u793a\u4f8b<\/h3>\n\n<p><strong>environment.yml<\/strong>\uff08\u63a8\u8350\u65b9\u5f0f\uff0c\u4f7f\u7528 conda\uff09\uff1a<\/p>\n<pre class=\"code-block\"><code>name: binder-env\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.11\n  - numpy\n  - pandas\n  - matplotlib\n  - jupyterlab\n  - pip:\n    - plotly\n    - seaborn<\/code><\/pre>\n\n<p><strong>requirements.txt<\/strong>\uff08\u4f7f\u7528 pip\uff09\uff1a<\/p>\n<pre class=\"code-block\"><code>numpy>=1.24\npandas>=2.0\nmatplotlib>=3.7\nscikit-learn>=1.3\njupyterlab>=4.0<\/code><\/pre>\n\n<p><strong>apt.txt<\/strong>\uff08\u7cfb\u7edf\u7ea7\u4f9d\u8d56\uff09\uff1a<\/p>\n<pre class=\"code-block\"><code>ffmpeg\ngraphviz\ntexlive\ndvipng<\/code><\/pre>\n\n<p><strong>postBuild<\/strong>\uff08\u6784\u5efa\u540e\u811a\u672c\uff09\uff1a<\/p>\n<pre class=\"code-block\"><code>#!\/bin\/bash\n# \u4e0b\u8f7d\u6570\u636e\u96c6\nwget -q https:\/\/example.com\/data.csv -O data\/data.csv\n\n# \u5b89\u88c5 Jupyter \u6269\u5c55\njupyter labextension install @jupyterlab\/google-drive-extension<\/code><\/pre>\n\n<p><strong>runtime.txt<\/strong>\uff08\u6307\u5b9a\u8fd0\u884c\u65f6\u7248\u672c\uff09\uff1a<\/p>\n<pre class=\"code-block\"><code>python-3.11<\/code><\/pre>\n\n<!-- \u4e94\u3001\u4f7f\u7528\u6d41\u7a0b -->\n<h2 id=\"zh-5\">\u4e94\u3001\u4f7f\u7528\u6d41\u7a0b<\/h2>\n\n<h3>5.1 \u51c6\u5907\u4ed3\u5e93<\/h3>\n\n<ol class=\"steps\">\n  <li>\n    <strong>\u521b\u5efa\u516c\u5f00\u4ed3\u5e93<\/strong>\n    <span class=\"note\">\u5728 GitHub\u3001GitLab \u6216 BitBucket \u4e0a\u521b\u5efa\u4e00\u4e2a\u516c\u5f00\u4ed3\u5e93\u3002\u4ed3\u5e93\u5fc5\u987b\u4e3a\u516c\u5f00\u72b6\u6001\uff0c\u4e14\u4e0d\u5305\u542b\u4efb\u4f55\u654f\u611f\u4fe1\u606f\uff08\u5982\u5bc6\u7801\u3001\u5bc6\u94a5\uff09\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u6dfb\u52a0\u4ee3\u7801\u6587\u4ef6<\/strong>\n    <span class=\"note\">\u5c06\u4f60\u7684 Jupyter Notebook\u3001Python \u811a\u672c\u3001R \u811a\u672c\u7b49\u5185\u5bb9\u6dfb\u52a0\u5230\u4ed3\u5e93\u4e2d\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u6dfb\u52a0\u914d\u7f6e\u6587\u4ef6<\/strong>\n    <span class=\"note\">\u5728\u4ed3\u5e93\u6839\u76ee\u5f55\u6216 <code>binder\/<\/code> \u6587\u4ef6\u5939\u4e2d\u6dfb\u52a0\u81f3\u5c11\u4e00\u4e2a\u73af\u5883\u914d\u7f6e\u6587\u4ef6\uff08\u5982 environment.yml \u6216 requirements.txt\uff09\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u63a8\u9001\u5230\u8fdc\u7a0b\u4ed3\u5e93<\/strong>\n    <span class=\"note\">\u5c06\u6240\u6709\u6587\u4ef6\u63a8\u9001\u5230\u8fdc\u7a0b\u4ed3\u5e93\uff0c\u786e\u4fdd\u6700\u65b0\u4ee3\u7801\u5df2\u540c\u6b65\u3002<\/span>\n  <\/li>\n<\/ol>\n\n<h3>5.2 \u542f\u52a8 Binder<\/h3>\n\n<ol class=\"steps\">\n  <li>\n    <strong>\u8bbf\u95ee mybinder.org<\/strong>\n    <span class=\"cmd\">https:\/\/mybinder.org<\/span>\n    <span class=\"note\">\u6253\u5f00 mybinder.org \u9996\u9875\uff0c\u4f60\u4f1a\u770b\u5230\u4e00\u4e2a\u8f93\u5165\u6846\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u8f93\u5165\u4ed3\u5e93\u5730\u5740<\/strong>\n    <span class=\"cmd\">https:\/\/github.com\/&lt;your-username&gt;\/&lt;your-repo&gt;<\/span>\n    <span class=\"note\">\u5728\u7b2c\u4e00\u4e2a\u8f93\u5165\u6846\u4e2d\u7c98\u8d34\u4f60\u7684\u4ed3\u5e93 URL\u3002\u53ef\u6307\u5b9a\u5206\u652f\u3001Git \u6807\u7b7e\u6216\u5177\u4f53 commit\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u9009\u62e9\u754c\u9762<\/strong>\n    <span class=\"note\">\u5728 URL \u53f3\u4fa7\u7684\u4e0b\u62c9\u83dc\u5355\u4e2d\u9009\u62e9\u542f\u52a8\u540e\u7684\u754c\u9762\uff1aJupyter Notebook\uff08\u7ecf\u5178\uff09\u3001JupyterLab\uff08\u63a8\u8350\uff09\u3001RStudio \u7b49\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u70b9\u51fb Launch<\/strong>\n    <span class=\"note\">\u70b9\u51fb launch \u6309\u94ae\uff0c\u7cfb\u7edf\u5f00\u59cb\u6784\u5efa\u73af\u5883\u3002\u53ef\u901a\u8fc7 Build logs \u67e5\u770b\u6784\u5efa\u65e5\u5fd7\u3002\u9996\u6b21\u6784\u5efa\u53ef\u80fd\u9700\u8981\u6570\u5206\u949f\uff0c\u540e\u7eed\u8bbf\u95ee\u76f8\u540c\u7248\u672c\u4f1a\u4f7f\u7528\u7f13\u5b58\u52a0\u901f\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u83b7\u53d6\u5206\u4eab\u94fe\u63a5<\/strong>\n    <span class=\"note\">\u6784\u5efa\u5b8c\u6210\u540e\uff0c\u6d4f\u89c8\u5668\u4f1a\u81ea\u52a8\u8df3\u8f6c\u5230\u4ea4\u4e92\u73af\u5883\u3002\u6ce8\u610f\u8bb0\u5f55 URL\uff0c\u8be5\u94fe\u63a5\u53ef\u5206\u4eab\u7ed9\u4ed6\u4eba\u4f7f\u7528\u3002\u4e5f\u53ef\u5728\u9996\u9875\u5e95\u90e8\u590d\u5236 Markdown \/ RST \u683c\u5f0f\u7684 Badge \u94fe\u63a5\u3002<\/span>\n  <\/li>\n<\/ol>\n\n<h3>5.3 \u6dfb\u52a0 Binder \u5fbd\u7ae0<\/h3>\n\n<p>\u5728 README.md \u4e2d\u6dfb\u52a0 Binder \u5fbd\u7ae0\uff0c\u8ba9\u7528\u6237\u4e00\u952e\u542f\u52a8\uff1a<\/p>\n<pre class=\"code-block\"><code>[![Binder](https:\/\/mybinder.org\/badge_logo.svg)](https:\/\/mybinder.org\/v2\/gh\/your-username\/your-repo\/main)<\/code><\/pre>\n\n<p>\u542f\u52a8\u94fe\u63a5\u7684 URL \u683c\u5f0f\u4e3a\uff1a<\/p>\n<pre class=\"code-block\"><code>https:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/&lt;branch&gt;\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/&lt;git-tag&gt;\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/&lt;commit-hash&gt;\n\n# \u6307\u5b9a\u6253\u5f00\u7279\u5b9a\u6587\u4ef6\uff1a\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/main?urlpath=tree%2Findex.ipynb\n\n# \u6307\u5b9a\u4f7f\u7528 JupyterLab\uff1a\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/main?urlpath=lab<\/code><\/pre>\n\n<!-- \u516d\u3001\u5e38\u89c1\u4f7f\u7528\u573a\u666f -->\n<h2 id=\"zh-6\">\u516d\u3001\u5e38\u89c1\u4f7f\u7528\u573a\u666f<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>&#127891; \u6559\u5b66\u4e0e\u8bfe\u7a0b<\/h4>\n    <div class=\"desc\">\u8ba9\u5b66\u751f\u65e0\u9700\u914d\u7f6e\u73af\u5883\u5373\u53ef\u8fd0\u884c\u8bfe\u7a0b\u4ee3\u7801\uff0c\u964d\u4f4e\u5b66\u4e60\u95e8\u69db\u3002\u9002\u5408\u7f16\u7a0b\u6559\u5b66\u3001\u6570\u636e\u79d1\u5b66\u8bfe\u7a0b\u3001\u5de5\u4f5c\u574a\u57f9\u8bad\u7b49\u573a\u666f\u3002<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128202; \u7814\u7a76\u8bba\u6587\u590d\u73b0<\/h4>\n    <div class=\"desc\">\u5c06\u8bba\u6587\u9644\u5e26\u7684\u4ee3\u7801\u548c\u6570\u636e\u6253\u5305\u6210 Binder \u4ed3\u5e93\uff0c\u5ba1\u7a3f\u4eba\u548c\u8bfb\u8005\u53ef\u4e00\u952e\u590d\u73b0\u5b9e\u9a8c\u7ed3\u679c\uff0c\u63d0\u5347\u8bba\u6587\u53ef\u4fe1\u5ea6\u3002<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128187; \u5b9e\u65f6\u6f14\u793a<\/h4>\n    <div class=\"desc\">\u5728\u4f1a\u8bae\u3001\u62a5\u544a\u6216\u6559\u5b66\u4e2d\u8fdb\u884c\u4ea4\u4e92\u5f0f\u6f14\u793a\uff0c\u89c2\u4f17\u53ef\u81ea\u884c\u64cd\u4f5c\u4ee3\u7801\uff0c\u6df1\u5165\u7406\u89e3\u6f14\u793a\u5185\u5bb9\u3002<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128218; \u5f00\u6e90\u6587\u6863<\/h4>\n    <div class=\"desc\">\u4e3a\u5f00\u6e90\u5305\u63d0\u4f9b\u53ef\u4ea4\u4e92\u7684\u6587\u6863\u548c\u6559\u7a0b\uff0c\u7528\u6237\u53ef\u76f4\u63a5\u8fd0\u884c\u793a\u4f8b\u4ee3\u7801\uff0c\u5feb\u901f\u4e0a\u624b API \u7528\u6cd5\u3002<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#129309; \u534f\u4f5c\u5206\u4eab<\/h4>\n    <div class=\"desc\">\u5c06\u6570\u636e\u5206\u6790\u7ed3\u679c\u4ee5\u53ef\u4ea4\u4e92\u5f62\u5f0f\u5206\u4eab\u7ed9\u540c\u4e8b\u6216\u5408\u4f5c\u8005\uff0c\u65e0\u9700\u5bf9\u65b9\u5b89\u88c5\u4efb\u4f55\u4f9d\u8d56\u3002<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128269; \u539f\u578b\u9a8c\u8bc1<\/h4>\n    <div class=\"desc\">\u5feb\u901f\u9a8c\u8bc1\u4ee3\u7801\u5728\u4e0d\u540c\u73af\u5883\u4e2d\u7684\u8fd0\u884c\u6548\u679c\uff0c\u6392\u67e5\u73af\u5883\u4f9d\u8d56\u95ee\u9898\u3002<\/div>\n  <\/div>\n<\/div>\n\n<!-- \u4e03\u3001\u6700\u4f73\u5b9e\u8df5\u4e0e\u6ce8\u610f\u4e8b\u9879 -->\n<h2 id=\"zh-7\">\u4e03\u3001\u6700\u4f73\u5b9e\u8df5\u4e0e\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n<h3>7.1 \u6700\u4f73\u5b9e\u8df5<\/h3>\n\n<div class=\"compare-box\">\n  <div class=\"compare-col do\">\n    <h4>&#9989; \u63a8\u8350\u505a\u6cd5<\/h4>\n    <p><strong>\u56fa\u5b9a\u4f9d\u8d56\u7248\u672c\uff1a<\/strong>\u5728 environment.yml \u6216 requirements.txt \u4e2d\u6307\u5b9a\u5177\u4f53\u7248\u672c\u53f7\uff0c\u786e\u4fdd\u53ef\u590d\u73b0\u6027\u3002<\/p>\n    <p><strong>\u4f7f\u7528 environment.yml\uff1a<\/strong>\u4f18\u5148\u4f7f\u7528 conda \u73af\u5883\u914d\u7f6e\uff0c\u517c\u5bb9\u6027\u66f4\u597d\u3002<\/p>\n    <p><strong>\u63a7\u5236\u4ed3\u5e93\u5927\u5c0f\uff1a<\/strong>\u907f\u514d\u5728\u4ed3\u5e93\u4e2d\u5b58\u50a8\u5927\u6587\u4ef6\uff0c\u4f7f\u7528 postBuild \u811a\u672c\u6309\u9700\u4e0b\u8f7d\u3002<\/p>\n    <p><strong>\u63d0\u524d\u6784\u5efa\uff1a<\/strong>\u5728\u5206\u4eab\u94fe\u63a5\u524d\u5148\u81ea\u884c\u8bbf\u95ee\u4e00\u6b21\uff0c\u89e6\u53d1\u955c\u50cf\u6784\u5efa\uff0c\u907f\u514d\u9996\u6b21\u8bbf\u95ee\u8005\u7b49\u5f85\u3002<\/p>\n    <p><strong>\u4f7f\u7528 Binder \u5fbd\u7ae0\uff1a<\/strong>\u5728 README \u4e2d\u6dfb\u52a0\u5fbd\u7ae0\u94fe\u63a5\uff0c\u63d0\u4f9b\u4e00\u952e\u542f\u52a8\u5165\u53e3\u3002<\/p>\n  <\/div>\n  <div class=\"compare-col dont\">\n    <h4>&#10060; \u907f\u514d\u505a\u6cd5<\/h4>\n    <p><strong>\u4e0d\u8981\u5b58\u50a8\u654f\u611f\u4fe1\u606f\uff1a<\/strong>\u4ed3\u5e93\u5fc5\u987b\u516c\u5f00\uff0c\u5207\u52ff\u5305\u542b\u5bc6\u7801\u3001API Key \u7b49\u654f\u611f\u6570\u636e\u3002<\/p>\n    <p><strong>\u4e0d\u8981\u4f9d\u8d56\u6301\u4e45\u5316\uff1a<\/strong>Binder \u4f1a\u8bdd\u662f\u4e34\u65f6\u7684\uff0c\u5173\u95ed\u540e\u6570\u636e\u4e0d\u4fdd\u7559\u3002<\/p>\n    <p><strong>\u4e0d\u8981\u5b58\u50a8\u5927\u6587\u4ef6\uff1a<\/strong>\u5927\u6587\u4ef6\u4f1a\u663e\u8457\u589e\u52a0\u6784\u5efa\u65f6\u95f4\uff0c\u4f7f\u7528\u811a\u672c\u6309\u9700\u4e0b\u8f7d\u66f4\u9ad8\u6548\u3002<\/p>\n    <p><strong>\u4e0d\u8981\u8fc7\u5ea6\u4f9d\u8d56\u7f51\u7edc\uff1a<\/strong>\u4f1a\u8bdd\u4e2d\u7684\u7f51\u7edc\u8bbf\u95ee\u53ef\u80fd\u53d7\u9650\uff0c\u5c3d\u91cf\u5728 postBuild \u4e2d\u9884\u4e0b\u8f7d\u6570\u636e\u3002<\/p>\n    <p><strong>\u4e0d\u8981\u7528\u4e8e\u751f\u4ea7\u73af\u5883\uff1a<\/strong>Binder \u8d44\u6e90\u6709\u9650\uff0c\u4e0d\u9002\u5408\u9ad8\u5e76\u53d1\u6216\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u4efb\u52a1\u3002<\/p>\n  <\/div>\n<\/div>\n\n<h3>7.2 \u4f7f\u7528\u9650\u5236<\/h3>\n\n<div class=\"info-box warn\">\n  <strong>\u8d44\u6e90\u9650\u5236\uff1a<\/strong>mybinder.org \u662f\u514d\u8d39\u7684\u516c\u5171\u670d\u52a1\uff0c\u5bf9\u6bcf\u4e2a\u4f1a\u8bdd\u7684 CPU\u3001\u5185\u5b58\u548c\u8fd0\u884c\u65f6\u95f4\u6709\u4e25\u683c\u9650\u5236\u3002\u5178\u578b\u9650\u5236\u5305\u62ec\uff1a\u6700\u591a 1-2 GB \u5185\u5b58\u3001\u4f1a\u8bdd\u8d85\u65f6\u7ea6 10 \u5206\u949f\u65e0\u64cd\u4f5c\u81ea\u52a8\u5173\u95ed\u3001\u5355\u4e2a\u7528\u6237\u6700\u591a\u540c\u65f6\u8fd0\u884c\u4e00\u4e2a\u4f1a\u8bdd\u3002\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>\u6784\u5efa\u9650\u5236\uff1a<\/strong>\u5982\u679c\u4ed3\u5e93\u4f53\u79ef\u8fc7\u5927\u6216\u4f9d\u8d56\u5b89\u88c5\u8017\u65f6\u8fc7\u957f\uff0c\u6784\u5efa\u53ef\u80fd\u4f1a\u8d85\u65f6\u5931\u8d25\u3002\u5efa\u8bae\u5c06\u4ed3\u5e93\u5927\u5c0f\u63a7\u5236\u5728 100 MB \u4ee5\u5185\uff0c\u4f9d\u8d56\u5b89\u88c5\u65f6\u95f4\u63a7\u5236\u5728 10 \u5206\u949f\u4ee5\u5185\u3002\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u7f13\u5b58\u673a\u5236\uff1a<\/strong>\u540c\u4e00\u4ed3\u5e93\u7684\u540c\u4e00 commit \u53ea\u6784\u5efa\u4e00\u6b21\u3002\u540e\u7eed\u8bbf\u95ee\u76f4\u63a5\u4f7f\u7528\u7f13\u5b58\u7684 Docker \u955c\u50cf\uff0c\u542f\u52a8\u901f\u5ea6\u5f88\u5feb\u3002\u4f46\u5982\u679c\u63a8\u9001\u4e86\u65b0\u4ee3\u7801\uff0c\u4e0b\u6b21\u8bbf\u95ee\u5c06\u89e6\u53d1\u91cd\u65b0\u6784\u5efa\u3002\n<\/div>\n\n<h3>7.3 \u81ea\u5efa BinderHub<\/h3>\n\n<p>\u5982\u679c mybinder.org \u7684\u516c\u5171\u8d44\u6e90\u65e0\u6cd5\u6ee1\u8db3\u9700\u6c42\uff08\u5982\u9700\u8981\u66f4\u5927\u7684\u5185\u5b58\u3001\u66f4\u957f\u7684\u4f1a\u8bdd\u65f6\u95f4\u6216\u79c1\u6709\u4ed3\u5e93\u652f\u6301\uff09\uff0c\u53ef\u4ee5\u90e8\u7f72\u81ea\u5df1\u7684 BinderHub \u5b9e\u4f8b\u3002BinderHub \u662f\u5b8c\u5168\u5f00\u6e90\u7684\uff0c\u57fa\u4e8e Kubernetes \u548c JupyterHub \u6784\u5efa\uff0c\u53ef\u90e8\u7f72\u5728\u4efb\u4f55\u4e91\u5e73\u53f0\u4e0a\u3002<sup><a href=\"#cite-1\">[1]<\/a><\/sup><\/p>\n\n<div class=\"card\">\n  <h4>BinderHub \u6838\u5fc3\u7ec4\u4ef6<\/h4>\n  <div class=\"flow-row\" style=\"justify-content:flex-start\">\n    <span class=\"flow-item\">BinderHub<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item purple\">repo2docker<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item green\">JupyterHub<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">Kubernetes<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item\">Docker Registry<\/span>\n  <\/div>\n  <p style=\"margin-top:.8rem;font-size:.85rem\">\u81ea\u5efa BinderHub \u9700\u8981\u4e00\u4e2a Kubernetes \u96c6\u7fa4\u3001\u4e00\u4e2a Docker \u955c\u50cf\u4ed3\u5e93\uff08\u5982 Harbor\u3001ACR\uff09\u4ee5\u53ca BinderHub \u672c\u8eab\u7684\u914d\u7f6e\u3002\u8be6\u89c1 <a href=\"https:\/\/binderhub.readthedocs.io\/\" target=\"_blank\" rel=\"noopener\">BinderHub \u5b98\u65b9\u6587\u6863<\/a>\u3002<\/p>\n<\/div>\n\n<\/div>\n\n<!-- ======== English Version ======== -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Binder Introduction<span class=\"sub\">Turn your code repository into an interactive online computing environment<\/span><\/h1>\n  <p>Binder is an open-source project that transforms Git repositories containing code and configuration files into shareable, interactive online computing environments, allowing anyone to run your code in a browser without installation.<sup><a href=\"#cite-1\">[1]<\/a><\/sup><\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-1\">1. What is Binder<\/a><\/li>\n    <li><a href=\"#en-2\">2. Core Concepts &#038; Ecosystem<\/a><\/li>\n    <li><a href=\"#en-3\">3. How It Works<\/a><\/li>\n    <li><a href=\"#en-4\">4. Configuration Files<\/a><\/li>\n    <li><a href=\"#en-5\">5. Usage Workflow<\/a><\/li>\n    <li><a href=\"#en-6\">6. Common Use Cases<\/a><\/li>\n    <li><a href=\"#en-7\">7. Best Practices &#038; Limitations<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- 1. What is Binder -->\n<h2 id=\"en-1\">1. What is Binder<\/h2>\n\n<p>A <strong>Binder<\/strong> (also called a Binder-ready repository) is a code repository that contains at least two things: <strong>code or content for people to run<\/strong>, and <strong>configuration files that specify the runtime environment<\/strong>. When you submit such a repository to a Binder service, it automatically builds a Docker image with all required dependencies and generates a shareable link that lets anyone access and run your code directly in a browser.<sup><a href=\"#cite-2\">[2]<\/a><\/sup><\/p>\n\n<div class=\"info-box\">\n  <strong>In one sentence:<\/strong> Give Binder a GitHub repository URL, and it returns an interactive computing environment that runs directly in the browser \u2014 no installation, no configuration, ready to use.\n<\/div>\n\n<div class=\"card\">\n  <h4>Core Values of Binder<\/h4>\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-g\">Zero Install<\/span> Users don&#8217;t need to install any dependencies locally \u2014 just open a link and run code.<\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-b\">Reproducible<\/span> Environment versions are locked via configuration files, ensuring consistent results for everyone.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-y\">Shareable<\/span> Generates a URL that you can send to others to share your computing environment.<\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <p><span class=\"tag tag-p\">Free<\/span> mybinder.org provides a free public service maintained by the open-source community.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- 2. Core Concepts -->\n<h2 id=\"en-2\">2. Core Concepts &#038; Ecosystem<\/h2>\n\n<p>Binder is more than just a website \u2014 it is backed by a complete ecosystem of open-source projects. Understanding these concepts helps you better use and deploy Binder.<\/p>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>Concept<\/th>\n        <th>Description<\/th>\n        <th>Role<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><span class=\"badge binder\">Binder<\/span><\/td>\n        <td>A repository with code and config files that BinderHub can build into an interactive environment<\/td>\n        <td>Input<\/td>\n      <\/tr>\n      <tr>\n        <td><span class=\"badge hub\">BinderHub<\/span><\/td>\n        <td>Server-side technology that transforms repos into interactive environments, runs on Kubernetes<\/td>\n        <td>Build Engine<\/td>\n      <\/tr>\n      <tr>\n        <td><span class=\"badge docker\">repo2docker<\/span><\/td>\n        <td>Underlying tool that reads config files and builds Docker images<\/td>\n        <td>Build Tool<\/td>\n      <\/tr>\n      <tr>\n        <td>mybinder.org<\/td>\n        <td>Free public deployment of BinderHub, maintained by a community federation<\/td>\n        <td>Public Service<\/td>\n      <\/tr>\n      <tr>\n        <td>JupyterHub<\/td>\n        <td>Multi-user Jupyter service manager, BinderHub uses it for user sessions<\/td>\n        <td>Session Management<\/td>\n      <\/tr>\n      <tr>\n        <td>Kubernetes<\/td>\n        <td>Container orchestration platform supporting BinderHub&#8217;s elastic scaling<\/td>\n        <td>Infrastructure<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 1<\/strong> Core components of the Binder ecosystem<\/caption>\n  <\/table>\n<\/div>\n\n<figure>\n  <div class=\"flow-diagram\">\n    <div class=\"flow-row\">\n      <span class=\"flow-item\">Git Repo<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item purple\">repo2docker<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">Docker Image<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">BinderHub<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">Browser-based<br>Interactive Env<\/span>\n    <\/div>\n  <\/div>\n  <figcaption><strong>Figure 1<\/strong> Binder build flow from repository to interactive environment<\/figcaption>\n<\/figure>\n\n<!-- 3. How It Works -->\n<h2 id=\"en-3\">3. How It Works<\/h2>\n\n<p>When a user accesses a Binder link, the system goes through the following process to build the environment and start a session:<sup><a href=\"#cite-2\">[2]<\/a><\/sup><\/p>\n\n<ol class=\"steps\">\n  <li>\n    <strong>Repository Submission<\/strong>\n    <span class=\"note\">User enters a public Git repository URL (GitHub, GitLab, or BitBucket) on mybinder.org. The repository must contain code files and at least one environment configuration file.<\/span>\n  <\/li>\n  <li>\n    <strong>Environment Detection<\/strong>\n    <span class=\"note\">repo2docker scans the repository root or <code>binder\/<\/code> folder for configuration files (e.g., environment.yml, requirements.txt) to determine required dependencies and runtimes.<\/span>\n  <\/li>\n  <li>\n    <strong>Docker Image Build<\/strong>\n    <span class=\"note\">Based on detected configuration files, repo2docker automatically builds a Docker image containing all required packages, libraries, and runtime environments. If the same version was built before, the cached image is reused.<\/span>\n  <\/li>\n  <li>\n    <strong>Session Launch<\/strong>\n    <span class=\"note\">Once built, BinderHub launches a container instance on the Kubernetes cluster via JupyterHub, allocating a temporary interactive computing environment for the user.<\/span>\n  <\/li>\n  <li>\n    <strong>User Interaction<\/strong>\n    <span class=\"note\">The user sees a Jupyter Notebook \/ JupyterLab interface in the browser and can directly run code, edit files, and view results. No state is preserved after the session ends.<\/span>\n  <\/li>\n<\/ol>\n\n<div class=\"info-box warn\">\n  <strong>Important:<\/strong> Binder environments are <strong>ephemeral<\/strong>. When a user closes the browser tab or the session times out, all changes are lost. Binder is not suitable for persistent data storage \u2014 it&#8217;s designed for demonstrations, teaching, and quick sharing.\n<\/div>\n\n<!-- 4. Configuration Files -->\n<h2 id=\"en-4\">4. Configuration Files<\/h2>\n\n<p>Binder uses <strong>repo2docker<\/strong> to detect configuration files and build environments. These files are not Binder-specific \u2014 they reuse existing standard formats from the data science community. Configuration files can be placed in the repository root or in a <code>binder\/<\/code> folder.<sup><a href=\"#cite-3\">[3]<\/a><\/sup><\/p>\n\n<h3>4.1 Research &#038; Data Science Configuration<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>File<\/th>\n        <th>Purpose<\/th>\n        <th>Language<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>environment.yml<\/code><\/td>\n        <td>Define a conda environment (recommended)<\/td>\n        <td>Python \/ R \/ General<\/td>\n      <\/tr>\n      <tr>\n        <td><code>install.R<\/code><\/td>\n        <td>Install R packages<\/td>\n        <td>R<\/td>\n      <\/tr>\n      <tr>\n        <td><code>DESCRIPTION<\/code><\/td>\n        <td>Install as an R package<\/td>\n        <td>R<\/td>\n      <\/tr>\n      <tr>\n        <td><code>Project.toml<\/code><\/td>\n        <td>Define a Julia environment<\/td>\n        <td>Julia<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 2<\/strong> Research and data science workflow configuration files<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.2 Software Development Configuration<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>File<\/th>\n        <th>Purpose<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>requirements.txt<\/code><\/td>\n        <td>Install Python packages with pip<\/td>\n      <\/tr>\n      <tr>\n        <td><code>Pipfile<\/code> \/ <code>Pipfile.lock<\/code><\/td>\n        <td>Install Python environment with Pipenv<\/td>\n      <\/tr>\n      <tr>\n        <td><code>pyproject.toml<\/code><\/td>\n        <td>Install Python packages (modern standard)<\/td>\n      <\/tr>\n      <tr>\n        <td><code>setup.py<\/code><\/td>\n        <td>Install Python packages (legacy)<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 3<\/strong> Software development workflow configuration files<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.3 System-wide Configuration<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>File<\/th>\n        <th>Purpose<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>apt.txt<\/code><\/td>\n        <td>Install system packages with apt-get<\/td>\n      <\/tr>\n      <tr>\n        <td><code>runtime.txt<\/code><\/td>\n        <td>Specify runtime version (e.g., Python 3.11, R 4.3)<\/td>\n      <\/tr>\n      <tr>\n        <td><code>default.nix<\/code><\/td>\n        <td>Use the Nix package manager<\/td>\n      <\/tr>\n      <tr>\n        <td><code>Dockerfile<\/code><\/td>\n        <td>Fully custom environment (highest priority, overrides others)<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 4<\/strong> System-wide configuration files<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.4 Post-build Actions<\/h3>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>File<\/th>\n        <th>Purpose<\/th>\n        <th>Execution Timing<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td><code>postBuild<\/code><\/td>\n        <td>Script to run after environment setup (e.g., download data, compile code)<\/td>\n        <td>During image build (baked into image)<\/td>\n      <\/tr>\n      <tr>\n        <td><code>start<\/code><\/td>\n        <td>Script to run before user session begins<\/td>\n        <td>Each session start (not baked)<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 5<\/strong> Post-build action configuration files<\/caption>\n  <\/table>\n<\/div>\n\n<h3>4.5 Typical Repository Structure<\/h3>\n\n<div class=\"file-tree\">.\/\n&#9500;&#8219; <span class=\"config\">environment.yml<\/span>      <span class=\"file\"># conda environment config (recommended)<\/span>\n&#9500;&#8219; <span class=\"config\">requirements.txt<\/span>     <span class=\"file\"># pip dependencies (alternative)<\/span>\n&#9500;&#8219; <span class=\"config\">apt.txt<\/span>              <span class=\"file\"># system-level deps (e.g., git, ffmpeg)<\/span>\n&#9500;&#8219; <span class=\"config\">postBuild<\/span>            <span class=\"file\"># post-build script (download data, etc.)<\/span>\n&#9500;&#8219; <span class=\"config\">runtime.txt<\/span>          <span class=\"file\"># specify runtime version<\/span>\n&#9500;&#8219; index.ipynb           <span class=\"file\"># main Jupyter Notebook<\/span>\n&#9500;&#8219; data\/                 <span class=\"dir\"># data directory<\/span>\n&#9474;&nbsp;&nbsp; &#9492;&#8219; dataset.csv\n&#9492;&#8219; README.md             <span class=\"file\"># project documentation<\/span><\/div>\n\n<p>Or consolidate all config files into a <code>binder\/<\/code> folder:<\/p>\n\n<div class=\"file-tree\">.\/\n&#9500;&#8219; <span class=\"dir\">binder\/<\/span>\n&#9474;&nbsp;&nbsp; &#9500;&#8219; <span class=\"config\">environment.yml<\/span>\n&#9474;&nbsp;&nbsp; &#9500;&#8219; <span class=\"config\">apt.txt<\/span>\n&#9474;&nbsp;&nbsp; &#9492;&#8219; <span class=\"config\">postBuild<\/span>\n&#9500;&#8219; index.ipynb\n&#9492;&#8219; README.md<\/div>\n\n<h3>4.6 Configuration Examples<\/h3>\n\n<p><strong>environment.yml<\/strong> (recommended, using conda):<\/p>\n<pre class=\"code-block\"><code>name: binder-env\nchannels:\n  - conda-forge\ndependencies:\n  - python=3.11\n  - numpy\n  - pandas\n  - matplotlib\n  - jupyterlab\n  - pip:\n    - plotly\n    - seaborn<\/code><\/pre>\n\n<p><strong>requirements.txt<\/strong> (using pip):<\/p>\n<pre class=\"code-block\"><code>numpy>=1.24\npandas>=2.0\nmatplotlib>=3.7\nscikit-learn>=1.3\njupyterlab>=4.0<\/code><\/pre>\n\n<p><strong>apt.txt<\/strong> (system-level dependencies):<\/p>\n<pre class=\"code-block\"><code>ffmpeg\ngraphviz\ntexlive\ndvipng<\/code><\/pre>\n\n<p><strong>postBuild<\/strong> (post-build script):<\/p>\n<pre class=\"code-block\"><code>#!\/bin\/bash\n# Download dataset\nwget -q https:\/\/example.com\/data.csv -O data\/data.csv\n\n# Install Jupyter extensions\njupyter labextension install @jupyterlab\/google-drive-extension<\/code><\/pre>\n\n<p><strong>runtime.txt<\/strong> (specify runtime version):<\/p>\n<pre class=\"code-block\"><code>python-3.11<\/code><\/pre>\n\n<!-- 5. Usage Workflow -->\n<h2 id=\"en-5\">5. Usage Workflow<\/h2>\n\n<h3>5.1 Preparing the Repository<\/h3>\n\n<ol class=\"steps\">\n  <li>\n    <strong>Create a Public Repository<\/strong>\n    <span class=\"note\">Create a public repository on GitHub, GitLab, or BitBucket. The repository must be public and must not contain any sensitive information (passwords, keys, etc.).<\/span>\n  <\/li>\n  <li>\n    <strong>Add Code Files<\/strong>\n    <span class=\"note\">Add your Jupyter Notebooks, Python scripts, R scripts, or other content to the repository.<\/span>\n  <\/li>\n  <li>\n    <strong>Add Configuration Files<\/strong>\n    <span class=\"note\">Add at least one environment configuration file (e.g., environment.yml or requirements.txt) to the repository root or <code>binder\/<\/code> folder.<\/span>\n  <\/li>\n  <li>\n    <strong>Push to Remote<\/strong>\n    <span class=\"note\">Push all files to the remote repository, ensuring the latest code is synced.<\/span>\n  <\/li>\n<\/ol>\n\n<h3>5.2 Launching Binder<\/h3>\n\n<ol class=\"steps\">\n  <li>\n    <strong>Visit mybinder.org<\/strong>\n    <span class=\"cmd\">https:\/\/mybinder.org<\/span>\n    <span class=\"note\">Open the mybinder.org homepage. You&#8217;ll see an input form.<\/span>\n  <\/li>\n  <li>\n    <strong>Enter Repository URL<\/strong>\n    <span class=\"cmd\">https:\/\/github.com\/&lt;your-username&gt;\/&lt;your-repo&gt;<\/span>\n    <span class=\"note\">Paste your repository URL in the first input field. You can specify a branch, Git tag, or specific commit.<\/span>\n  <\/li>\n  <li>\n    <strong>Select Interface<\/strong>\n    <span class=\"note\">Choose the interface from the dropdown next to the URL: Jupyter Notebook (classic), JupyterLab (recommended), RStudio, etc.<\/span>\n  <\/li>\n  <li>\n    <strong>Click Launch<\/strong>\n    <span class=\"note\">Click the launch button to start building. View build logs via the &#8220;Build logs&#8221; button. First build may take several minutes; subsequent visits use cached images.<\/span>\n  <\/li>\n  <li>\n    <strong>Get Share Link<\/strong>\n    <span class=\"note\">After building, the browser redirects to the interactive environment. Note the URL \u2014 it can be shared with others. You can also copy Markdown\/RST badge links from the homepage.<\/span>\n  <\/li>\n<\/ol>\n\n<h3>5.3 Adding a Binder Badge<\/h3>\n\n<p>Add a Binder badge to README.md for one-click launch:<\/p>\n<pre class=\"code-block\"><code>[![Binder](https:\/\/mybinder.org\/badge_logo.svg)](https:\/\/mybinder.org\/v2\/gh\/your-username\/your-repo\/main)<\/code><\/pre>\n\n<p>Launch URL format:<\/p>\n<pre class=\"code-block\"><code>https:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/&lt;branch&gt;\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/&lt;git-tag&gt;\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/&lt;commit-hash&gt;\n\n# Open a specific file:\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/main?urlpath=tree%2Findex.ipynb\n\n# Use JupyterLab:\nhttps:\/\/mybinder.org\/v2\/gh\/&lt;user&gt;\/&lt;repo&gt;\/main?urlpath=lab<\/code><\/pre>\n\n<!-- 6. Use Cases -->\n<h2 id=\"en-6\">6. Common Use Cases<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>&#127891; Teaching &#038; Courses<\/h4>\n    <div class=\"desc\">Let students run course code without environment setup, lowering the learning barrier. Ideal for programming classes, data science courses, and workshop training.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128202; Research Reproduction<\/h4>\n    <div class=\"desc\">Package paper-accompanying code and data into a Binder repository, enabling reviewers and readers to reproduce experimental results with one click.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128187; Live Demonstrations<\/h4>\n    <div class=\"desc\">Conduct interactive demos at conferences, talks, or classes where the audience can explore the code themselves.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128218; Open Source Docs<\/h4>\n    <div class=\"desc\">Provide interactive documentation and tutorials for open-source packages, letting users run example code directly.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#129309; Collaborative Sharing<\/h4>\n    <div class=\"desc\">Share data analysis results in an interactive form with colleagues or collaborators without requiring them to install dependencies.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>&#128269; Prototype Validation<\/h4>\n    <div class=\"desc\">Quickly verify how code runs in different environments and troubleshoot dependency issues.<\/div>\n  <\/div>\n<\/div>\n\n<!-- 7. Best Practices -->\n<h2 id=\"en-7\">7. Best Practices &#038; Limitations<\/h2>\n\n<h3>7.1 Best Practices<\/h3>\n\n<div class=\"compare-box\">\n  <div class=\"compare-col do\">\n    <h4>&#9989; Recommended<\/h4>\n    <p><strong>Pin dependency versions:<\/strong> Specify exact version numbers in environment.yml or requirements.txt for reproducibility.<\/p>\n    <p><strong>Use environment.yml:<\/strong> Prefer conda environment configuration for better compatibility.<\/p>\n    <p><strong>Keep repo small:<\/strong> Avoid storing large files in the repo; use postBuild scripts to download on demand.<\/p>\n    <p><strong>Pre-build before sharing:<\/strong> Visit the link yourself first to trigger image building, so the first visitor doesn&#8217;t wait.<\/p>\n    <p><strong>Add Binder badge:<\/strong> Include a badge link in README for one-click launch.<\/p>\n  <\/div>\n  <div class=\"compare-col dont\">\n    <h4>&#10060; Avoid<\/h4>\n    <p><strong>Don&#8217;t store secrets:<\/strong> Repositories must be public \u2014 never include passwords, API keys, or sensitive data.<\/p>\n    <p><strong>Don&#8217;t rely on persistence:<\/strong> Binder sessions are ephemeral; data is lost when closed.<\/p>\n    <p><strong>Don&#8217;t store large files:<\/strong> Large files significantly increase build time; download on demand instead.<\/p>\n    <p><strong>Don&#8217;t over-rely on network:<\/strong> Network access during sessions may be limited; pre-download data in postBuild.<\/p>\n    <p><strong>Don&#8217;t use for production:<\/strong> Binder resources are limited and not suitable for high-concurrency or long-running tasks.<\/p>\n  <\/div>\n<\/div>\n\n<h3>7.2 Usage Limits<\/h3>\n\n<div class=\"info-box warn\">\n  <strong>Resource Limits:<\/strong> mybinder.org is a free public service with strict limits on CPU, memory, and runtime per session. Typical limits include: 1-2 GB memory, ~10 minute idle timeout, one concurrent session per user.\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>Build Limits:<\/strong> If the repository is too large or dependency installation takes too long, the build may time out. Keep repo size under 100 MB and dependency installation under 10 minutes.\n<\/div>\n\n<div class=\"info-box\">\n  <strong>Caching:<\/strong> The same repository at the same commit is built only once. Subsequent visits use the cached Docker image for fast startup. However, pushing new code triggers a rebuild.\n<\/div>\n\n<h3>7.3 Self-hosting BinderHub<\/h3>\n\n<p>If mybinder.org&#8217;s public resources don&#8217;t meet your needs (e.g., you need more memory, longer sessions, or private repository support), you can deploy your own BinderHub instance. BinderHub is fully open-source, built on Kubernetes and JupyterHub, and can be deployed on any cloud platform.<sup><a href=\"#cite-1\">[1]<\/a><\/sup><\/p>\n\n<div class=\"card\">\n  <h4>BinderHub Core Components<\/h4>\n  <div class=\"flow-row\" style=\"justify-content:flex-start\">\n    <span class=\"flow-item\">BinderHub<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item purple\">repo2docker<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item green\">JupyterHub<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">Kubernetes<\/span>\n    <span class=\"flow-arrow\">+<\/span>\n    <span class=\"flow-item\">Docker Registry<\/span>\n  <\/div>\n  <p style=\"margin-top:.8rem;font-size:.85rem\">Self-hosting BinderHub requires a Kubernetes cluster, a Docker registry (e.g., Harbor, ACR), and BinderHub configuration. See <a href=\"https:\/\/binderhub.readthedocs.io\/\" target=\"_blank\" rel=\"noopener\">BinderHub documentation<\/a> for details.<\/p>\n<\/div>\n\n<\/div>\n\n<\/main>\n\n<footer>\n  <div class=\"sources\" style=\"max-width:var(--max-w);margin:0 auto;padding:0 1.5rem\">\n    <h2 style=\"border-bottom-color:var(--rule);margin-top:0\">\u53c2\u8003\u8d44\u6599 \/ References<\/h2>\n    <ol style=\"padding-left:1.2rem;font-size:.85rem;color:var(--muted)\">\n      <li id=\"cite-1\">\n        <span class=\"src-title\">The Binder Project, Binder Documentation. What is Binder, BinderHub, and the ecosystem.<\/span>\n        <a class=\"src-url\" href=\"https:\/\/mybinder.readthedocs.io\/en\/latest\/\" target=\"_blank\" rel=\"noopener\">https:\/\/mybinder.readthedocs.io\/en\/latest\/<\/a>\n      <\/li>\n      <li id=\"cite-2\">\n        <span class=\"src-title\">The Binder Project, Get started with Binder. Repository structure, build process, and usage.<\/span>\n        <a class=\"src-url\" href=\"https:\/\/mybinder.readthedocs.io\/en\/latest\/introduction.html\" target=\"_blank\" rel=\"noopener\">https:\/\/mybinder.readthedocs.io\/en\/latest\/introduction.html<\/a>\n      <\/li>\n      <li id=\"cite-3\">\n        <span class=\"src-title\">repo2docker Documentation, Configuration files supported by repo2docker. Complete list of environment configuration files.<\/span>\n        <a class=\"src-url\" href=\"https:\/\/repo2docker.readthedocs.io\/en\/latest\/configuration\/\" target=\"_blank\" rel=\"noopener\">https:\/\/repo2docker.readthedocs.io\/en\/latest\/configuration\/<\/a>\n      <\/li>\n    <\/ol>\n  <\/div>\n<\/footer>\n\n<script>\nfunction setLang(lang) {\n  document.querySelectorAll('.lang-section').forEach(function(el) {\n    el.classList.remove('active');\n  });\n  document.querySelectorAll('.lang-section[id=\"lang-' + lang + '\"]').forEach(function(el) {\n    el.classList.add('active');\n  });\n  document.querySelectorAll('.lang-switch button').forEach(function(btn) {\n    btn.classList.remove('active');\n  });\n  document.getElementById('btn-' + lang).classList.add('active');\n  localStorage.setItem('binder-lang', lang);\n}\nfunction toggleTheme() {\n  var html = document.documentElement;\n  var theme = html.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';\n  html.setAttribute('data-theme', theme);\n  localStorage.setItem('binder-theme', theme);\n}\n(function() {\n  var savedLang = localStorage.getItem('binder-lang');\n  if (savedLang) setLang(savedLang);\n  var savedTheme = localStorage.getItem('binder-theme');\n  if (savedTheme) document.documentElement.setAttribute('data-theme', savedTheme);\n})();\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Binder \u4ecb\u7ecd \u00b7 Binder Introduction &#128269; Binder \u4ecb\u7ecd \u4e2d\u6587  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-388","post","type-post","status-publish","format-standard","hentry","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=388"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/388\/revisions"}],"predecessor-version":[{"id":389,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/388\/revisions\/389"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}