镜像构建历史
# 2026-07-28 22:05:37 0.00B 设置默认要执行的命令
CMD ["pnpm" "start"]
# 2026-07-28 22:05:37 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# 2026-07-28 22:05:37 0.00B 声明容器运行时监听的端口
EXPOSE map[3000/tcp:{}]
# 2026-07-28 22:05:37 1.44KB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c chmod +x /usr/local/bin/entrypoint.sh # buildkit
# 2026-07-28 22:05:36 1.44KB 复制新文件或目录到容器中
COPY entrypoint.sh /usr/local/bin/entrypoint.sh # buildkit
# 2026-07-28 22:05:36 11.00MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm build # buildkit
# 2026-07-28 22:02: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-07-28 22:02:54 8.49MB 复制新文件或目录到容器中
COPY . . # buildkit
# 2026-07-28 22:02:54 516.67KB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm config set store-dir /pnpm/store && pnpm install --frozen-lockfile --offline # buildkit
# 2026-07-28 22:02:35 477.07MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm config set store-dir /pnpm/store && pnpm fetch --frozen-lockfile # buildkit
# 2026-07-28 22:01:52 333.95KB 复制新文件或目录到容器中
COPY package.json pnpm-lock.yaml ./ # buildkit
# 2026-07-28 22:01:52 0.00B 设置工作目录为/app
WORKDIR /app
# 2026-07-28 22:01:52 59.11MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c uv tool install mcp-server-fetch # buildkit
# 2026-07-28 22:01:43 961.54MB 执行命令并创建新的镜像层
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 firefox; else echo "Skipping Chrome and Firefox installation on non-amd64 architecture: $ARCH"; fi; apt-get update && apt-get install -y ca-certificates curl iptables && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal && cargo --version && rustc --version && 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 $(. /etc/os-release && echo "$VERSION_CODENAME") 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-07-28 22:01:43 0.00B 定义构建参数
ARG INSTALL_EXT=false
# 2026-07-28 22:01:43 0.00B 设置环境变量 RUSTUP_HOME CARGO_HOME PATH
ENV RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo PATH=/usr/local/cargo/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-07-28 21:59:11 17.80MB 执行命令并创建新的镜像层
RUN /bin/sh -c corepack enable && corepack prepare pnpm@10.12.4 --activate # buildkit
# 2026-07-28 21:59:02 592.85MB 执行命令并创建新的镜像层
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-07-28 21:54:30 45.30MB 复制新文件或目录到容器中
COPY /uv /uvx /bin/ # buildkit
# 2026-07-14 10:17:43 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2026-07-14 10:17:43 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-07-14 10:17:43 38.79MB 执行命令并创建新的镜像层
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; apt-get dist-clean; export PYTHONDONTWRITEBYTECODE=1; python3 --version; pip3 --version # buildkit
# 2026-07-14 10:03:51 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=639e43243c620a308f968213df9e00f2f8f62332f7adbaa7a7eeb9783057c690
# 2026-07-14 10:03:51 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.13.14
# 2026-07-14 10:03:51 0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305
# 2026-07-14 10:03:51 3.86MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates netbase tzdata ; apt-get dist-clean # buildkit
# 2026-07-14 10:03:51 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-07-13 08:00:00 100.49MB
# debian.sh --arch 'arm64' out/ 'trixie' '@1783900800'
镜像信息
{
"Id": "sha256:40cdcf1321b21464a5dad730a4befda118b4f6cc1fc1cf321a744572078a37f0",
"RepoTags": [
"samanhappy/mcphub:1.0.26-full",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/samanhappy/mcphub:1.0.26-full-linuxarm64"
],
"RepoDigests": [
"samanhappy/mcphub@sha256:f10c1f0669f162121804527a7a3277c3cc255bc5e7b9b7f60d8d56105b5a9015",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/samanhappy/mcphub@sha256:45f047705c03282c294951bbdd31c4055c1444f5b5a04d4e79cc451227175bb2"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-07-28T14:05:37.111679962Z",
"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/cargo/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
"PYTHON_VERSION=3.13.14",
"PYTHON_SHA256=639e43243c620a308f968213df9e00f2f8f62332f7adbaa7a7eeb9783057c690",
"RUSTUP_HOME=/usr/local/rustup",
"CARGO_HOME=/usr/local/cargo"
],
"Cmd": [
"pnpm",
"start"
],
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": [
"/usr/local/bin/entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"org.opencontainers.image.created": "2026-07-28T13:54:19.318Z",
"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": "bb72a8c243a739ec1a09e6ddf57b201b63cdcc5a",
"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": "1.0.26-full"
}
},
"Architecture": "arm64",
"Os": "linux",
"Size": 2320158886,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/353eb268cd47ebce2ae8b80d1dcfab46607fa5fe0d178ef766190086d37ec334/diff:/var/lib/docker/overlay2/683c100833e4449a991d6dda2163f1bd91c1823fcc4e6977d04151a92ab5fe9f/diff:/var/lib/docker/overlay2/1e92d65e991be6141f6c978b03aa5e3772d74c5e7ac96fa2e6efdd841c7f3227/diff:/var/lib/docker/overlay2/835da5f4aba9a0b18d187a47b18bbc4034d6c91388fff5b101e4d7f068c8c6d2/diff:/var/lib/docker/overlay2/3d5f20dbaa7e2630d9a5e13240d9c9b39e924784ec4f528a6d454e939de6531f/diff:/var/lib/docker/overlay2/ca3aab9155e6021e5567eeac5a6396057601caba487dc0d7276e65e058e048f2/diff:/var/lib/docker/overlay2/6482f408b220551ed9ff919c09c9cb22023ff5982d074d7a417cadd925414d36/diff:/var/lib/docker/overlay2/4c6bb4001df8567037e20dc07abe368aa698c4985515f8caa6f24f06d9dbcf1b/diff:/var/lib/docker/overlay2/f0cd59992b548c1023fa9e14c13f69e9b47be46fdec57e6358ad46a243be54f8/diff:/var/lib/docker/overlay2/45eead8c3d4df7325b40b4b6a791978a26cf2c3ab446f6163bd1b2767538dc71/diff:/var/lib/docker/overlay2/cb194af8a402e81c925e89d971af42e02510c3968de3424336bb42baa1be44c2/diff:/var/lib/docker/overlay2/093520e06de6f41f9d0d3b743b2880a0c61d9dd959d5a8cf33667ba7e30c9f44/diff:/var/lib/docker/overlay2/cc4e395d5636e440a22c9ba2988151deb170de9d303f7e73894325197bcfce01/diff:/var/lib/docker/overlay2/f7a67a9bcfb403dd27889178da972e41455ff2c5dd9480b136c6df0f9906a488/diff:/var/lib/docker/overlay2/7a51b8cb76b32c72cfeba5684057ec0d24444c509738c1c968dc4be26cc1ccef/diff:/var/lib/docker/overlay2/2fc5c9e746396604bebe1fcc8d51a1fb2ec48a0b4c512cf1e017f550c05faabc/diff:/var/lib/docker/overlay2/7e4f64ce57f2feed57b0bee55fe8f7bf2099e9b551498ad0c0d3966b59c6dbfb/diff",
"MergedDir": "/var/lib/docker/overlay2/a406d097c8b8109cc233c66f69cdf8cb700076b74be26639c73e40ba7e861e8a/merged",
"UpperDir": "/var/lib/docker/overlay2/a406d097c8b8109cc233c66f69cdf8cb700076b74be26639c73e40ba7e861e8a/diff",
"WorkDir": "/var/lib/docker/overlay2/a406d097c8b8109cc233c66f69cdf8cb700076b74be26639c73e40ba7e861e8a/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:4e6fee325600a0377566ca159a4da9833f6e35e04eaa4194c47dd3b2fe901717",
"sha256:40b80d951936c6dcdfe52490c5a373af23cf0fc656dff2674ed3ae2bb963636a",
"sha256:ee525c32493ed1ead1ccfe2e83c5315448fc713083533fc4c36dc294317d17b6",
"sha256:c1b6a374b2eb7c634a77f74e1ca2e54b9f54e868efca937dd2886af3190b65ae",
"sha256:7f0dbaf655b7c06c14a3729b8c955640a9e8a1a00d2a2d6a5254a72776f9c08c",
"sha256:482201dc654819159e5d9c4ab117b24fc42f80f9bd0f6ca23af62b05e1efc162",
"sha256:30ec71bff409e0e28c9e277e0e816aed843e54dc70ae90e41dad3b742fe9b273",
"sha256:3c00f2cf61df0852089dcd3a9f54174c52243cb3b2c9721350ab64d4005fccce",
"sha256:780f0d79d2d099099523304e296bcdc5b6862618dffa7df22dfab333d193780e",
"sha256:512e133bc02de65fcdd10a1f3bcba93ae22620f2c18160ac3e5681484b315174",
"sha256:86c252307ec61e0b49aa7e5d86c74aa747ac9d650bebab1a2fcdf36f82d3d6fd",
"sha256:6f1e8456e32b08f6cb6e7daa2d3f0fdea94a5b77b2d12c8f1856b3d3a3ba2b07",
"sha256:08bd34972981bce28096d5406eee80b444de14130decb23a7a831bc1b57e3177",
"sha256:292be4ad4abc7c5b23a31051719be15d9b46402b281dd72d0351a573744f73a8",
"sha256:2e16e57805c422ec1843e522d371c2458b24b88c78dd6d1da27d0ff44d76a9ea",
"sha256:aee53ae22d4d06f6e46820542672c5d8ef78d20e420bd5127da5d9eaa09216a6",
"sha256:8e5a10037698772c3dbdba65f6aa7adb9083e4ca4613fc9536e8f06b82c3b0cf",
"sha256:9d1f9b08f695cc99857e9e59483e170b41f81d97cc00b1a6f3b5327bf088c8e9"
]
},
"Metadata": {
"LastTagTime": "2026-08-03T14:53:49.043512661+08:00"
}
}