镜像构建历史
# 2026-05-16 17:56:40 0.00B 设置默认要执行的命令
CMD ["pnpm" "start"]
# 2026-05-16 17:56:40 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# 2026-05-16 17:56:40 0.00B 声明容器运行时监听的端口
EXPOSE [3000/tcp]
# 2026-05-16 17:56:40 1.44KB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c chmod +x /usr/local/bin/entrypoint.sh # buildkit
# 2026-05-16 17:56:40 1.44KB 复制新文件或目录到容器中
COPY entrypoint.sh /usr/local/bin/entrypoint.sh # buildkit
# 2026-05-16 17:56:40 10.16MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm frontend:build && pnpm build # buildkit
# 2026-05-16 17:53:03 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-05-16 17:53:02 7.51MB 复制新文件或目录到容器中
COPY . . # buildkit
# 2026-05-16 17:53:01 936.62MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c pnpm install # buildkit
# 2026-05-16 17:51:49 334.62KB 复制新文件或目录到容器中
COPY package.json pnpm-lock.yaml ./ # buildkit
# 2026-05-16 17:51:49 0.00B 设置工作目录为/app
WORKDIR /app
# 2026-05-16 17:51:49 71.36MB 执行命令并创建新的镜像层
RUN |1 INSTALL_EXT=true /bin/sh -c uv tool install mcp-server-fetch # buildkit
# 2026-05-16 17:51:41 393.41MB 执行命令并创建新的镜像层
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 && 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-05-16 17:51:41 0.00B 定义构建参数
ARG INSTALL_EXT=true
# 2026-05-16 17:50:08 28.29MB 执行命令并创建新的镜像层
RUN /bin/sh -c npm install -g pnpm # buildkit
# 2026-05-16 17:49:59 586.18MB 执行命令并创建新的镜像层
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-05-16 17:46:47 49.80MB 复制新文件或目录到容器中
COPY /uv /uvx /bin/ # buildkit
# 2026-05-09 04:12:59 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2026-05-09 04:12:59 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-05-09 04:12:59 39.77MB 执行命令并创建新的镜像层
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-05-09 03:59:49 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=2ab91ff401783ccca64f75d10c882e957bdfd60e2bf5a72f8421793729b78a71
# 2026-05-09 03:59:49 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.13.13
# 2026-05-09 03:59:49 0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305
# 2026-05-09 03:59:49 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-05-09 03:59:49 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-05-05 08:00:00 97.21MB
# debian.sh --arch 'arm64' out/ 'bookworm' '@1777939200'
镜像信息
{
"Id": "sha256:5c23015f3975c8415b271816ed94da3504f84b308cca954b57016df6ab9c1a4a",
"RepoTags": [
"samanhappy/mcphub:1.0.0-full",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/samanhappy/mcphub:1.0.0-full-linuxarm64"
],
"RepoDigests": [
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/samanhappy/mcphub@sha256:04bcbb63069bd3c1ab53a1cbd84769991d00d6f98b5fc13fc53cedc054d73b83"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-05-16T09:56:40.460751987Z",
"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/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
"PYTHON_VERSION=3.13.13",
"PYTHON_SHA256=2ab91ff401783ccca64f75d10c882e957bdfd60e2bf5a72f8421793729b78a71"
],
"Cmd": [
"pnpm",
"start"
],
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": [
"/usr/local/bin/entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"org.opencontainers.image.created": "2026-05-16T09:46:42.040Z",
"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": "da23f691f6203e907b5ed27bfb54d5ac0bdf80e5",
"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.0-full"
}
},
"Architecture": "arm64",
"Os": "linux",
"Size": 2232904829,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/5871a5c050416d74b7ad3d4d0aaa432747f01eeb2cabea063698c0ac4dc45340/diff:/var/lib/docker/overlay2/04c2efd19d275723968b209b34184d66d1dad5e6430485e510f1264c232c8505/diff:/var/lib/docker/overlay2/6ffc30998efb1c4490ec3ed31f892f005e5eea31ed89b0d1fc7e0e9993dfb67c/diff:/var/lib/docker/overlay2/7c194984e18e378b0bb3b332f1fd76bc707778a2116f98949e798261dfd83ea1/diff:/var/lib/docker/overlay2/7308779058bec25911602d3333397464531199c68a076f7d0367e38b4677e1fd/diff:/var/lib/docker/overlay2/3a39085c110b1069cd14f29c6e8befbf532c15b893a6955bbc71514c91ffe93f/diff:/var/lib/docker/overlay2/573d4f93f4cf545a38c08cba33333f46673ac71a695ed6a7f786fffe5d2c2552/diff:/var/lib/docker/overlay2/fbbf8fcedbdb7de39f03a775f19f0f6018f365239221bb81bce280a217467f22/diff:/var/lib/docker/overlay2/04241c03c384373ec6ab6aa401154b9a26e58eafad125d33ee50bc666511a615/diff:/var/lib/docker/overlay2/2b9cae70e8a0c0ff2cbb8858d0a283cecb69d27ffd7b76d32d5dd68f179994c3/diff:/var/lib/docker/overlay2/c6fdc5ae97f97052a2b91e9eed87f24a2722e178f7d656ee63ab7f748b47c27e/diff:/var/lib/docker/overlay2/9701423a6f37f7e212b20b5fee39bccb15ebdf08538210e4f1ca345c199480dd/diff:/var/lib/docker/overlay2/58b8e62be965ff879069d98a1871ea71ae7924a962290ab5ecadd7cf1466bdd3/diff:/var/lib/docker/overlay2/687ecf83d389d264af4864d604a8b0df574ac8c011d4c388a739be6575b26d5c/diff:/var/lib/docker/overlay2/1b69e02f0227d6709133d5bfab1eeb6c76e30c07ea2f4b58f5ab0b97464fa6a0/diff:/var/lib/docker/overlay2/6a014c16758175763d8113818d7104404d8338bcc8eef6eef862d367abf1dc6a/diff",
"MergedDir": "/var/lib/docker/overlay2/2ef84bf44dcbf2688262762773213f6bab0016ee2dbc47270e6bd1bf098c9fa2/merged",
"UpperDir": "/var/lib/docker/overlay2/2ef84bf44dcbf2688262762773213f6bab0016ee2dbc47270e6bd1bf098c9fa2/diff",
"WorkDir": "/var/lib/docker/overlay2/2ef84bf44dcbf2688262762773213f6bab0016ee2dbc47270e6bd1bf098c9fa2/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:7a926e09be014ed6f5df3666f96de7cf91f8452492a7fd714d42eeee9c6ee246",
"sha256:63ac1e98764742c1a2ade30b2704caffefded0ede89a127dbb1dcd0859967ef0",
"sha256:e56958367dc51ac293d9ece0be30ecf03bd9679c7f861cdbdf938a5f4193384c",
"sha256:43215945cb4525826b0d2b548bb91bea51f85380564ab2af565cebf0681566f5",
"sha256:39fcb04bce66e8dccb7bc6250e739ffcdbd6c4e1b05102f34cf926f7773e0954",
"sha256:1b0258fb65f3dedf4c9298d09903dead44c9274221fea7558e856cd47cc6aff4",
"sha256:ed8c2e6eda521f9990d3dc02d455805c54e36265f5b4c65602c948c8116d05a6",
"sha256:ecc2608a365859885fc798d412a69699dd48ae0ca066b903e7eb1e4e951ccd68",
"sha256:64818cdb5f7a674f47b884008d1a34793ba3aa10aeb5cb1c8accdddf0e803e1a",
"sha256:55220d5ba21d11ba0c1ff13044b997080092f391a66ce1abdbf72afd773dace1",
"sha256:df6a8e07b86e6da9ee8f99cdf758d0d9f42cb0ce9f21f5bbf492f7cd7b3099ea",
"sha256:0acb07c12785f6e3fe857c8622c82c8327a6f1915626287291ae4abcbfea591f",
"sha256:c42c78391cc8bac11f52fee43f2c4eaae92eecfcbc4dc0ab555699330fc2d78f",
"sha256:e91fdd3c214320c416be21556045169ccafc4300660af48039feb29615e6bf4b",
"sha256:f580ef9157aba1cacbb0fc8e11fb5319ea949312d70fc7d68ec53e3921efc9f7",
"sha256:999fb8594611a4df9b6ad678aadd24e223b44b420478a6abc4a26c3d07bee99c",
"sha256:6fbed318985b6e8cb07167c12f64e5005cc741a03023f89b33aba59de5137822"
]
},
"Metadata": {
"LastTagTime": "2026-05-19T15:10:36.958876137+08:00"
}
}