说明
domino是一款开源软件,代码仓库是https://github.com/Tauffer-Consulting/domino
,可对airflow的工作流程进行图形化优化。 airflow的代码仓库是https://github.com/apache/airflow/
。
domino使用了airflow的apache/airflow:2.7.2-python3.9 容器镜像。需使用专用工具部署,专用工具会拉取默认配置文件覆盖本地已经修改的文件。本地可指定部分配置参数,但受限。
使用docker部署domino
准备一台4C8G200GB的云主机。ubuntu24LTS系统。
检查DNS
bash
root@i-2geipmoh:~# cat /etc/resolv.conf | grep -v "#"| grep -v "^$"
nameserver 8.8.8.8
nameserver 223.5.5.5
安装基础软件
无python的应安装python3.10及以上版本,python3.12是当前环境已安装版本。
bash
root@i-2geipmoh:/opt# python3 --version
root@i-2geipmoh:~# apt update
root@i-2geipmoh:~# apt-get install ca-certificates curl iptables pip python3.12-venv -y
安装docker
参考https://docs.docker.com/engine/install/
启用虚拟环境
bash
root@i-2geipmoh:/opt/domino# python3 -m venv domino-env
root@i-2geipmoh:/opt/domino# source domino-env/bin/activate
(domino-env) root@i-2geipmoh:/opt/domino#
安装domino部署专用工具
bash
(domino-env) root@i-2geipmoh:/opt/domino# pip install domino-py[cli]
过程如下,
bash
(domino-env) root@i-2geipmoh:/opt/domino# pip install domino-py[cli]
Collecting domino-py[cli]
Using cached domino_py-0.9.4-py3-none-any.whl.metadata (24 kB)
Collecting pydantic==2.4.2 (from domino-py[cli])
Using cached pydantic-2.4.2-py3-none-any.whl.metadata (158 kB)
Collecting tomli==2.0.1 (from domino-py[cli])
Using cached tomli-2.0.1-py3-none-any.whl.metadata (8.9 kB)
Collecting tomli-w==1.0.0 (from domino-py[cli])
Using cached tomli_w-1.0.0-py3-none-any.whl.metadata (4.9 kB)
Collecting PyYAML==6.0.1 (from domino-py[cli])
Using cached PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)
Collecting jsonschema==4.18.0 (from domino-py[cli])
Using cached jsonschema-4.18.0-py3-none-any.whl.metadata (10 kB)
Collecting click==8.1.3 (from domino-py[cli])
Using cached click-8.1.3-py3-none-any.whl.metadata (3.2 kB)
Collecting rich>=13.4.2 (from domino-py[cli])
Using cached rich-14.1.0-py3-none-any.whl.metadata (18 kB)
Collecting colorama==0.4.6 (from domino-py[cli])
Using cached colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Collecting urllib3==1.26.15 (from domino-py[cli])
Using cached urllib3-1.26.15-py2.py3-none-any.whl.metadata (48 kB)
Collecting cryptography==39.0.1 (from domino-py[cli])
Using cached cryptography-39.0.1-cp36-abi3-manylinux_2_28_x86_64.whl.metadata (5.6 kB)
Collecting pyOpenSSL==23.1.1 (from domino-py[cli])
Using cached pyOpenSSL-23.1.1-py3-none-any.whl.metadata (10 kB)
Collecting PyGithub==1.55 (from domino-py[cli])
Using cached PyGithub-1.55-py3-none-any.whl.metadata (1.8 kB)
Collecting docker>=7.0.0 (from domino-py[cli])
Using cached docker-7.1.0-py3-none-any.whl.metadata (3.8 kB)
Collecting kubernetes==23.6.0 (from domino-py[cli])
Using cached kubernetes-23.6.0-py2.py3-none-any.whl.metadata (1.5 kB)
Collecting bottle==0.12.25 (from domino-py[cli])
Using cached bottle-0.12.25-py3-none-any.whl.metadata (1.8 kB)
Collecting requests==2.31.0 (from domino-py[cli])
Using cached requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)
Collecting cffi>=1.12 (from cryptography==39.0.1->domino-py[cli])
Using cached cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (2.6 kB)
Collecting attrs>=22.2.0 (from jsonschema==4.18.0->domino-py[cli])
Using cached attrs-25.3.0-py3-none-any.whl.metadata (10 kB)
Collecting jsonschema-specifications>=2023.03.6 (from jsonschema==4.18.0->domino-py[cli])
Using cached jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB)
Collecting referencing>=0.28.4 (from jsonschema==4.18.0->domino-py[cli])
Using cached referencing-0.36.2-py3-none-any.whl.metadata (2.8 kB)
Collecting rpds-py>=0.7.1 (from jsonschema==4.18.0->domino-py[cli])
Using cached rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.2 kB)
Collecting certifi>=14.05.14 (from kubernetes==23.6.0->domino-py[cli])
Using cached certifi-2025.8.3-py3-none-any.whl.metadata (2.4 kB)
Collecting six>=1.9.0 (from kubernetes==23.6.0->domino-py[cli])
Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting python-dateutil>=2.5.3 (from kubernetes==23.6.0->domino-py[cli])
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting setuptools>=21.0.0 (from kubernetes==23.6.0->domino-py[cli])
Using cached setuptools-80.9.0-py3-none-any.whl.metadata (6.6 kB)
Collecting google-auth>=1.0.1 (from kubernetes==23.6.0->domino-py[cli])
Using cached google_auth-2.40.3-py2.py3-none-any.whl.metadata (6.2 kB)
Collecting websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 (from kubernetes==23.6.0->domino-py[cli])
Using cached websocket_client-1.8.0-py3-none-any.whl.metadata (8.0 kB)
Collecting requests-oauthlib (from kubernetes==23.6.0->domino-py[cli])
Using cached requests_oauthlib-2.0.0-py2.py3-none-any.whl.metadata (11 kB)
Collecting annotated-types>=0.4.0 (from pydantic==2.4.2->domino-py[cli])
Using cached annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)
Collecting pydantic-core==2.10.1 (from pydantic==2.4.2->domino-py[cli])
Using cached pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.5 kB)
Collecting typing-extensions>=4.6.1 (from pydantic==2.4.2->domino-py[cli])
Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB)
Collecting deprecated (from PyGithub==1.55->domino-py[cli])
Using cached Deprecated-1.2.18-py2.py3-none-any.whl.metadata (5.7 kB)
Collecting pyjwt>=2.0 (from PyGithub==1.55->domino-py[cli])
Using cached PyJWT-2.10.1-py3-none-any.whl.metadata (4.0 kB)
Collecting pynacl>=1.4.0 (from PyGithub==1.55->domino-py[cli])
Using cached pynacl-1.6.0-cp38-abi3-manylinux_2_34_x86_64.whl.metadata (9.4 kB)
Collecting charset-normalizer<4,>=2 (from requests==2.31.0->domino-py[cli])
Using cached charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (36 kB)
Collecting idna<4,>=2.5 (from requests==2.31.0->domino-py[cli])
Using cached idna-3.10-py3-none-any.whl.metadata (10 kB)
Collecting markdown-it-py>=2.2.0 (from rich>=13.4.2->domino-py[cli])
Using cached markdown_it_py-4.0.0-py3-none-any.whl.metadata (7.3 kB)
Collecting pygments<3.0.0,>=2.13.0 (from rich>=13.4.2->domino-py[cli])
Using cached pygments-2.19.2-py3-none-any.whl.metadata (2.5 kB)
Collecting pycparser (from cffi>=1.12->cryptography==39.0.1->domino-py[cli])
Using cached pycparser-2.23-py3-none-any.whl.metadata (993 bytes)
Collecting cachetools<6.0,>=2.0.0 (from google-auth>=1.0.1->kubernetes==23.6.0->domino-py[cli])
Using cached cachetools-5.5.2-py3-none-any.whl.metadata (5.4 kB)
Collecting pyasn1-modules>=0.2.1 (from google-auth>=1.0.1->kubernetes==23.6.0->domino-py[cli])
Using cached pyasn1_modules-0.4.2-py3-none-any.whl.metadata (3.5 kB)
Collecting rsa<5,>=3.1.4 (from google-auth>=1.0.1->kubernetes==23.6.0->domino-py[cli])
Using cached rsa-4.9.1-py3-none-any.whl.metadata (5.6 kB)
Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich>=13.4.2->domino-py[cli])
Using cached mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)
Collecting wrapt<2,>=1.10 (from deprecated->PyGithub==1.55->domino-py[cli])
Using cached wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (6.4 kB)
Collecting oauthlib>=3.0.0 (from requests-oauthlib->kubernetes==23.6.0->domino-py[cli])
Using cached oauthlib-3.3.1-py3-none-any.whl.metadata (7.9 kB)
Collecting pyasn1<0.7.0,>=0.6.1 (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes==23.6.0->domino-py[cli])
Using cached pyasn1-0.6.1-py3-none-any.whl.metadata (8.4 kB)
Using cached bottle-0.12.25-py3-none-any.whl (90 kB)
Using cached click-8.1.3-py3-none-any.whl (96 kB)
Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Using cached cryptography-39.0.1-cp36-abi3-manylinux_2_28_x86_64.whl (4.2 MB)
Using cached jsonschema-4.18.0-py3-none-any.whl (81 kB)
Using cached kubernetes-23.6.0-py2.py3-none-any.whl (1.5 MB)
Using cached pydantic-2.4.2-py3-none-any.whl (395 kB)
Using cached PyGithub-1.55-py3-none-any.whl (291 kB)
Using cached pyOpenSSL-23.1.1-py3-none-any.whl (57 kB)
Using cached PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (724 kB)
Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Using cached tomli-2.0.1-py3-none-any.whl (12 kB)
Using cached tomli_w-1.0.0-py3-none-any.whl (6.0 kB)
Using cached urllib3-1.26.15-py2.py3-none-any.whl (140 kB)
Using cached pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)
Using cached docker-7.1.0-py3-none-any.whl (147 kB)
Using cached rich-14.1.0-py3-none-any.whl (243 kB)
Using cached domino_py-0.9.4-py3-none-any.whl (89 kB)
Using cached annotated_types-0.7.0-py3-none-any.whl (13 kB)
Using cached attrs-25.3.0-py3-none-any.whl (63 kB)
Using cached certifi-2025.8.3-py3-none-any.whl (161 kB)
Using cached cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (219 kB)
Using cached charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (151 kB)
Using cached google_auth-2.40.3-py2.py3-none-any.whl (216 kB)
Using cached idna-3.10-py3-none-any.whl (70 kB)
Using cached jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB)
Using cached markdown_it_py-4.0.0-py3-none-any.whl (87 kB)
Using cached pygments-2.19.2-py3-none-any.whl (1.2 MB)
Using cached PyJWT-2.10.1-py3-none-any.whl (22 kB)
Using cached pynacl-1.6.0-cp38-abi3-manylinux_2_34_x86_64.whl (1.4 MB)
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Using cached referencing-0.36.2-py3-none-any.whl (26 kB)
Using cached rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (386 kB)
Using cached setuptools-80.9.0-py3-none-any.whl (1.2 MB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB)
Using cached websocket_client-1.8.0-py3-none-any.whl (58 kB)
Using cached Deprecated-1.2.18-py2.py3-none-any.whl (10.0 kB)
Using cached requests_oauthlib-2.0.0-py2.py3-none-any.whl (24 kB)
Using cached cachetools-5.5.2-py3-none-any.whl (10 kB)
Using cached mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Using cached oauthlib-3.3.1-py3-none-any.whl (160 kB)
Using cached pyasn1_modules-0.4.2-py3-none-any.whl (181 kB)
Using cached rsa-4.9.1-py3-none-any.whl (34 kB)
Using cached wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (88 kB)
Using cached pycparser-2.23-py3-none-any.whl (118 kB)
Using cached pyasn1-0.6.1-py3-none-any.whl (83 kB)
Installing collected packages: bottle, wrapt, websocket-client, urllib3, typing-extensions, tomli-w, tomli, six, setuptools, rpds-py, PyYAML, pyjwt, pygments, pycparser, pyasn1, oauthlib, mdurl, idna, colorama, click, charset-normalizer, certifi, cachetools, attrs, annotated-types, rsa, requests, referencing, python-dateutil, pydantic-core, pyasn1-modules, markdown-it-py, deprecated, cffi, rich, requests-oauthlib, pynacl, pydantic, jsonschema-specifications, google-auth, docker, cryptography, pyOpenSSL, PyGithub, kubernetes, jsonschema, domino-py
Successfully installed PyGithub-1.55 PyYAML-6.0.1 annotated-types-0.7.0 attrs-25.3.0 bottle-0.12.25 cachetools-5.5.2 certifi-2025.8.3 cffi-2.0.0 charset-normalizer-3.4.3 click-8.1.3 colorama-0.4.6 cryptography-39.0.1 deprecated-1.2.18 docker-7.1.0 domino-py-0.9.4 google-auth-2.40.3 idna-3.10 jsonschema-4.18.0 jsonschema-specifications-2025.9.1 kubernetes-23.6.0 markdown-it-py-4.0.0 mdurl-0.1.2 oauthlib-3.3.1 pyOpenSSL-23.1.1 pyasn1-0.6.1 pyasn1-modules-0.4.2 pycparser-2.23 pydantic-2.4.2 pydantic-core-2.10.1 pygments-2.19.2 pyjwt-2.10.1 pynacl-1.6.0 python-dateutil-2.9.0.post0 referencing-0.36.2 requests-2.31.0 requests-oauthlib-2.0.0 rich-14.1.0 rpds-py-0.27.1 rsa-4.9.1 setuptools-80.9.0 six-1.17.0 tomli-2.0.1 tomli-w-1.0.0 typing-extensions-4.15.0 urllib3-1.26.15 websocket-client-1.8.0 wrapt-1.17.3
配置GitHub token
参考,https://docs.domino-workflows.io/settings/github_token
浏览器访问 https://github.com/settings/personal-access-tokens
生成密钥 关键配置下图所示,
保存生成的key。安装时会用。
配置环境变量
参考https://github.com/zhuyifeiRuichuang/k8s-script/tree/main/domino
bash
(domino-env) root@i-2geipmoh:/opt/domino#
cat > .env << 'EOF'
# Airflow配置
AIRFLOW_UID=50000
AIRFLOW_GID=0
# Domino配置
DOMINO_COMPOSE_DEV=true
DOMINO_DEFAULT_PIECES_REPOSITORY_TOKEN=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
DOMINO_CREATE_DEFAULT_USER=true
# 数据库配置
POSTGRES_USER=domino
POSTGRES_PASSWORD=domino_password
POSTGRES_DB=domino
# Redis配置
REDIS_PASSWORD=redis_password
# Domino管理员配置
DOMINO_ADMIN_EMAIL=admin@example.com
DOMINO_ADMIN_PASSWORD=admin
EOF
开始安装domino
github-token是前置步骤生成的key。
bash
(domino-env) root@i-2geipmoh:/opt/domino# domino platform run-compose --github-token github_pat_11BR44FEA0vn7xpy3phLie_hoCQCVqUXa
查看部署状态
bash
docker compose logs -f
若超过十分钟还是下图所示状态,则是部署失败,
部署成功应类似下图所示,

查询容器状态
应如下所示
bash
(domino-env) root@i-2geipmoh:/opt/domino# docker compose ps
WARN[0000] /opt/domino/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
airflow-domino-scheduler ghcr.io/tauffer-consulting/domino-airflow-base:latest "/usr/bin/dumb-init ..." airflow-scheduler 9 minutes ago Up 8 minutes (healthy) 8080/tcp
airflow-domino-worker ghcr.io/tauffer-consulting/domino-airflow-base:latest "/usr/bin/dumb-init ..." airflow-worker 9 minutes ago Up 8 minutes (healthy) 8080/tcp
airflow-postgres postgres:13 "docker-entrypoint.s..." postgres 9 minutes ago Up 9 minutes (healthy) 5432/tcp
airflow-redis redis:latest "docker-entrypoint.s..." redis 9 minutes ago Up 9 minutes (healthy) 6379/tcp
airflow-triggerer apache/airflow:2.7.2-python3.9 "/usr/bin/dumb-init ..." airflow-triggerer 9 minutes ago Up 8 minutes (healthy) 8080/tcp
airflow-webserver apache/airflow:2.7.2-python3.9 "/usr/bin/dumb-init ..." airflow-webserver 9 minutes ago Up 8 minutes (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp
domino-docker-proxy alpine/socat "socat TCP4-LISTEN:2..." docker-proxy 9 minutes ago Up 9 minutes 0.0.0.0:2376->2375/tcp, [::]:2376->2375/tcp
domino-frontend ghcr.io/tauffer-consulting/domino-frontend:compose "sh /usr/share/nginx..." domino_frontend 9 minutes ago Up 9 minutes 0.0.0.0:3000->80/tcp, [::]:3000->80/tcp
domino-postgres postgres:13 "docker-entrypoint.s..." domino_postgres 9 minutes ago Up 9 minutes (healthy) 0.0.0.0:5433->5432/tcp, [::]:5433->5432/tcp
domino-rest ghcr.io/tauffer-consulting/domino-rest:latest "bash -c 'alembic up..." domino_rest 9 minutes ago Up 9 minutes 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp
此时可在部署domino的机器访问。