镜像构建历史
# 2026-03-08 12:32:22 0.00B 设置默认要执行的命令
CMD ["pnpm" "start"]
# 2026-03-08 12:32:22 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# 2026-03-08 12:32:22 0.00B 声明容器运行时监听的端口
EXPOSE [3000/tcp]
# 2026-03-08 12:32:22 1.44KB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c chmod +x /usr/local/bin/entrypoint.sh # buildkit
# 2026-03-08 12:32:22 1.44KB 复制新文件或目录到容器中
COPY entrypoint.sh /usr/local/bin/entrypoint.sh # buildkit
# 2026-03-08 12:32:22 9.54MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm frontend:build && pnpm build # buildkit
# 2026-03-08 12:28:55 3.01MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c curl -s -f --connect-timeout 10 https://mcpm.sh/api/servers.json -o servers.json || echo "Failed to download servers.json, using bundled version" # buildkit
# 2026-03-08 12:28:54 6.65MB 复制新文件或目录到容器中
COPY . . # buildkit
# 2026-03-08 12:28:53 771.21MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm install # buildkit
# 2026-03-08 12:27:46 309.20KB 复制新文件或目录到容器中
COPY package.json pnpm-lock.yaml ./ # buildkit
# 2026-03-08 12:27:46 0.00B 设置工作目录为/app
WORKDIR /app
# 2026-03-08 12:27:46 68.47MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c uv tool install mcp-server-fetch # buildkit
# 2026-03-08 12:27:39 458.53MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c if [ "$INSTALL_EXT" = "true" ]; then ARCH=$(uname -m); if [ "$ARCH" = "x86_64" ]; then npx -y playwright install --with-deps chrome; else echo "Skipping Chrome installation on non-amd64 architecture: $ARCH"; fi; apt-get update && apt-get install -y ca-certificates curl iptables && install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && chmod a+r /etc/apt/keyrings/docker.asc && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io && apt-get clean && rm -rf /var/lib/apt/lists/*; fi # buildkit
# 2026-03-08 12:25:57 0.00B 定义构建参数
ARG INSTALL_EXT=true
# 2026-03-08 12:25:57 75.13MB 执行命令并创建新的镜像层
RUN /bin/sh -c mkdir -p $PNPM_HOME && pnpm add -g @amap/amap-maps-mcp-server @playwright/mcp@latest tavily-mcp@latest @modelcontextprotocol/server-github @modelcontextprotocol/server-slack # buildkit
# 2026-03-08 12:25:57 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/share/pnpm:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-03-08 12:25:57 0.00B 设置环境变量 PNPM_HOME
ENV PNPM_HOME=/usr/local/share/pnpm
# 2026-03-08 12:25:36 30.14MB 执行命令并创建新的镜像层
RUN /bin/sh -c npm install -g pnpm # buildkit
# 2026-03-08 12:25:27 586.80MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update && apt-get install -y curl gnupg git build-essential && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt-get install -y nodejs && apt-get clean && rm -rf /var/lib/apt/lists/* # buildkit
# 2026-03-08 12:22:11 46.29MB 复制新文件或目录到容器中
COPY /uv /uvx /bin/ # buildkit
# 2026-02-25 03:57:10 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2026-02-25 03:57:10 36.00B 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; for src in idle3 pip3 pydoc3 python3 python3-config; do dst="$(echo "$src" | tr -d 3)"; [ -s "/usr/local/bin/$src" ]; [ ! -e "/usr/local/bin/$dst" ]; ln -svT "$src" "/usr/local/bin/$dst"; done # buildkit
# 2026-02-25 03:57:10 39.62MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends dpkg-dev gcc gnupg libbluetooth-dev libbz2-dev libc6-dev libdb-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev make tk-dev uuid-dev wget xz-utils zlib1g-dev ; wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; echo "$PYTHON_SHA256 *python.tar.xz" | sha256sum -c -; wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; gpg --batch --verify python.tar.xz.asc python.tar.xz; gpgconf --kill all; rm -rf "$GNUPGHOME" python.tar.xz.asc; mkdir -p /usr/src/python; tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; rm python.tar.xz; cd /usr/src/python; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; ./configure --build="$gnuArch" --enable-loadable-sqlite-extensions --enable-optimizations --enable-option-checking=fatal --enable-shared $(test "${gnuArch%%-*}" != 'riscv64' && echo '--with-lto') --with-ensurepip ; nproc="$(nproc)"; EXTRA_CFLAGS="$(dpkg-buildflags --get CFLAGS)"; LDFLAGS="$(dpkg-buildflags --get LDFLAGS)"; LDFLAGS="${LDFLAGS:-} -Wl,--strip-all"; arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; case "$arch" in amd64|arm64) EXTRA_CFLAGS="${EXTRA_CFLAGS:-} -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"; ;; i386) ;; *) EXTRA_CFLAGS="${EXTRA_CFLAGS:-} -fno-omit-frame-pointer"; ;; esac; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-}" ; rm python; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-} -Wl,-rpath='\$\$ORIGIN/../lib'" python ; make install; cd /; rm -rf /usr/src/python; find /usr/local -depth \( \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \) -exec rm -rf '{}' + ; ldconfig; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark; find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); printf "*%s\n", so }' | sort -u | xargs -rt dpkg-query --search | awk 'sub(":$", "", $1) { print $1 }' | sort -u | xargs -r apt-mark manual ; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; rm -rf /var/lib/apt/lists/*; export PYTHONDONTWRITEBYTECODE=1; python3 --version; pip3 --version # buildkit
# 2026-02-25 03:44:20 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=2a84cd31dd8d8ea8aaff75de66fc1b4b0127dd5799aa50a64ae9a313885b4593
# 2026-02-25 03:44:20 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.13.12
# 2026-02-25 03:44:20 0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305
# 2026-02-25 03:44:20 9.25MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates netbase tzdata ; rm -rf /var/lib/apt/lists/* # buildkit
# 2026-02-25 03:44:20 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-02-23 08:00:00 97.21MB
# debian.sh --arch 'arm64' out/ 'bookworm' '@1771804800'
镜像信息
{
"Id": "sha256:11b3ebdecc34d0bb4b715001ad5cb9b79e353ca64a572c23915508d2985467eb",
"RepoTags": [
"samanhappy/mcphub:0.12.7-full",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/samanhappy/mcphub:0.12.7-full-linuxarm64"
],
"RepoDigests": [
"samanhappy/mcphub@sha256:72a06b0b7de2df7e3306d30958d58149f249ec06c37dc02aa382e8af4338788a",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/samanhappy/mcphub@sha256:90a6c78f5dc37f711435c7390638565758b1559d2b259cd36e6a0f71544a1667"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-03-08T04:32:22.855821773Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3000/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/share/pnpm:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
"PYTHON_VERSION=3.13.12",
"PYTHON_SHA256=2a84cd31dd8d8ea8aaff75de66fc1b4b0127dd5799aa50a64ae9a313885b4593",
"PNPM_HOME=/usr/local/share/pnpm"
],
"Cmd": [
"pnpm",
"start"
],
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": [
"/usr/local/bin/entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"org.opencontainers.image.created": "2026-03-08T04:22:05.939Z",
"org.opencontainers.image.description": "A unified hub for centrally managing and dynamically orchestrating multiple MCP servers/APIs into separate endpoints with flexible routing strategies",
"org.opencontainers.image.licenses": "Apache-2.0",
"org.opencontainers.image.revision": "51436c7818e0bd58f0e581a142bccd5b67513d80",
"org.opencontainers.image.source": "https://github.com/samanhappy/mcphub",
"org.opencontainers.image.title": "mcphub",
"org.opencontainers.image.url": "https://github.com/samanhappy/mcphub",
"org.opencontainers.image.version": "0.12.7-full"
}
},
"Architecture": "arm64",
"Os": "linux",
"Size": 2202163918,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/3281c687c6b8fff10f66ac8d065481d94503547aa0ad27c9f46dd04298f21f20/diff:/var/lib/docker/overlay2/072220d835533e8bbb3e7363c242cd6887d5966094b3d3fb8ffb237d8cb48af9/diff:/var/lib/docker/overlay2/10d017a347b4aa7b31f11fec0be6e1d5f8b9a426ec060e94208a0ae9519fb3a6/diff:/var/lib/docker/overlay2/e03915865d80edf681c001122a9145713648180cc517e3ef1cb95283eba0d72a/diff:/var/lib/docker/overlay2/88a39cc767868a6a36ed4fd57619d8eb4a6704df658170a57b3bc2d316530a4d/diff:/var/lib/docker/overlay2/d69ef39ba3909beb9f0f468986245095c6c05aa5dd86f6674321d47cba20cd18/diff:/var/lib/docker/overlay2/b997fb0d9ae251e1a09e5a74d0304ae03a411ea712c68eaa47d5843a4295d8d3/diff:/var/lib/docker/overlay2/5404595fb898caaf2a8a69888b490f975f98561f75347555855dfe312c926ce5/diff:/var/lib/docker/overlay2/629e8b2d38d603625687f2aee8e8f36e3e6faa95513943a6c2ea3716a02e4772/diff:/var/lib/docker/overlay2/2d204b1e55c856e4aa108eb3118a423e5f3e950700ee0d841e2e81a3b6143bd9/diff:/var/lib/docker/overlay2/12980a3f95489e08ea025d7b1163bfbb60b382d7d9831876a2f80c30f422f13e/diff:/var/lib/docker/overlay2/04e820294df9866d25f3df150a61fabd99b32f9760412fbf31379b5abdd66014/diff:/var/lib/docker/overlay2/d6fc842ed4669c7f75e913ed6f2331549a47feda537c6603ee3b40e4d28db4d3/diff:/var/lib/docker/overlay2/c46934c2bc40549c2d380319e57d94c1f9a2ccce9bf085170d9a9c59b22b7afa/diff:/var/lib/docker/overlay2/e75149595f1f057190209f8fe58d182ef3e8192bfb24766b372e80fa9b0c31de/diff:/var/lib/docker/overlay2/9c5eec10fe3fd19f9be35d2b948b28503f6be308390b547d5e37b59058adaf16/diff:/var/lib/docker/overlay2/c032995345dba53b861b5e3ca9b405de39d938575fa09a6f7fd9b251c8a647d9/diff",
"MergedDir": "/var/lib/docker/overlay2/8b6da608f0841b465611a3ae936b7d349bd7ec8e8e191e62ba84c94f9ec6bff6/merged",
"UpperDir": "/var/lib/docker/overlay2/8b6da608f0841b465611a3ae936b7d349bd7ec8e8e191e62ba84c94f9ec6bff6/diff",
"WorkDir": "/var/lib/docker/overlay2/8b6da608f0841b465611a3ae936b7d349bd7ec8e8e191e62ba84c94f9ec6bff6/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:100031c9cce7b091dd637c1afa21331c3448979cc0953828264b5868ec3f225e",
"sha256:83f8e5dc1948aab3a9808423d355083f304d70b0a126e994f3c0c497eab78eb3",
"sha256:867a395f1d2dfb5dfc47ad95e54bbbad26d7ed80fcb79d7b275aedd494d3c828",
"sha256:335dff2cf44d14e33208787dbce0dbcde83588ddacbde501f2a9581730f7db0e",
"sha256:a40864654398ac04ac89bcf885b98c11098aa66db7b1e52044a43c0bd658b301",
"sha256:0612781c7a12336c1affcca3d1f38ecd42481bbc4c055127b64573d692fbffb8",
"sha256:ae57e39e6e021cf92c4c2506513a02d5667bc478321f53b104b92eb164e7239e",
"sha256:4c2d6fb57f864c7ec217f8b72b8aa3515c10131ab3c08aeec8e80d34ccd1a98b",
"sha256:0a753451ad15e1608cc1ad52b1996a3d7dd68b554605a8c29f84f5a84b13c410",
"sha256:191bda5674286b859c1188da8671a6feb2d28f35d4819b1905c97e250adfe7d8",
"sha256:182f0de1729222cebc9c91860fdf9ecbaa9d2da35f7a977e9b2f2d649e7fec13",
"sha256:aa86d9b67dd7e103ef2ddb2e21e5e8789183602365baf956e2c35394a2d07dd9",
"sha256:320bcb3a9f6e093a74d1bd191fac8c1f6723cf14f3284f5ec18ea73cff43ecef",
"sha256:5ae91552f0ffb5669682edf2b4635de6470e709acf6bdfe93a40166d4a5045ac",
"sha256:9a37d48744bee96c84b93564408dfbbaa855c731f50dc19b159627fbbcad43e0",
"sha256:7b320d29c3cc24e3ba776a119faaee367c7683d8f5f824b50835880a0512f8bb",
"sha256:78ab323e62b379a98f8e9fbc1e9dc67f64a1d2b2ff777e94f0ad66eed12c6718",
"sha256:79e02cb55d42c60404e5dd72b19e34edeb8753cc65400fc0292d45f22b712b58"
]
},
"Metadata": {
"LastTagTime": "2026-03-13T14:22:59.933466512+08:00"
}
}