镜像构建历史
# 2026-06-19 20:33:24 0.00B 设置默认要执行的命令
CMD []
# 2026-06-19 20:33:24 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["/usr/local/bin/enhanced-entrypoint.sh"]
# 2026-06-19 20:33:24 0.00B 声明容器运行时监听的端口
EXPOSE map[7861/tcp:{} 8732/tcp:{}]
# 2026-06-19 20:33:24 284.44MB 执行命令并创建新的镜像层
RUN |1 PI_WEB_VERSION=latest /bin/sh -c wget -q https://kod.ktsee.eu.org/app/enhance-docker/script.txt -O /tmp/enhance-docker.sh && chmod +x /tmp/enhance-docker.sh && /tmp/enhance-docker.sh --backup-dirs="/root/projects" --original-cmd="/home/surenkid/bin/caddy run --config /home/surenkid/Caddyfile --pidfile /home/surenkid/caddy.pid & mkdir -p /root/projects && cd /root/projects && exec /home/surenkid/bin/pi-web --host 127.0.0.1 --port 8732" --backup-frequency="hourly" --non-root-uid=1000 --non-root-gid=1000 && rm /tmp/enhance-docker.sh # buildkit
# 2026-06-19 20:33:12 166.58MB 执行命令并创建新的镜像层
RUN |1 PI_WEB_VERSION=latest /bin/sh -c mkdir -p /root/projects && openssl req -x509 -sha256 -nodes -newkey rsa:2048 -days 3650 -keyout /home/surenkid/localhost.key -out /home/surenkid/localhost.crt -subj "/CN=localhost" && echo "{" > /home/surenkid/Caddyfile && echo " admin off" >> /home/surenkid/Caddyfile && echo " log {" >> /home/surenkid/Caddyfile && echo " level ERROR" >> /home/surenkid/Caddyfile && echo " }" >> /home/surenkid/Caddyfile && echo "}" >> /home/surenkid/Caddyfile && echo "" >> /home/surenkid/Caddyfile && echo "https://:7861 {" >> /home/surenkid/Caddyfile && echo " basic_auth {" >> /home/surenkid/Caddyfile && echo " s \$2a\$14\$u43d9HCl3XRNES9lOs5pVehkzdiq7qq7E7bg62HQvARFLFC6xOGG6" >> /home/surenkid/Caddyfile && echo " }" >> /home/surenkid/Caddyfile && echo " tls /home/surenkid/localhost.crt /home/surenkid/localhost.key" >> /home/surenkid/Caddyfile && echo " reverse_proxy 127.0.0.1:8732" >> /home/surenkid/Caddyfile && echo "}" >> /home/surenkid/Caddyfile && chown -R 1000:1000 /home/surenkid # buildkit
# 2026-06-19 20:33:11 136.26MB 执行命令并创建新的镜像层
RUN |1 PI_WEB_VERSION=latest /bin/sh -c set -eux; plugin_root="/home/surenkid/pi-web-default-plugins"; metadata_root="$plugin_root/.metadata"; mkdir -p "$plugin_root" "$metadata_root"; for plugin_url in https://github.com/Epsilondelta-ai/pi-web-toast-noti https://github.com/Epsilondelta-ai/pi-web-file-browser https://github.com/Epsilondelta-ai/pi-web-git-viewer https://github.com/Epsilondelta-ai/pi-web-sidebar https://github.com/Epsilondelta-ai/pi-web-chat https://github.com/Epsilondelta-ai/pi-web-discord-noti https://github.com/Epsilondelta-ai/pi-web-telegram-noti; do tmp_dir="$(mktemp -d)"; git clone --depth 1 "$plugin_url" "$tmp_dir"; plugin_id="$(sed -n 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$tmp_dir/plugin.json" | head -n 1)"; case "$plugin_id" in ""|*/*|*\\*|*..*) echo "Invalid plugin id from $plugin_url: $plugin_id" >&2; exit 1 ;; esac; rm -rf "$plugin_root/$plugin_id"; mkdir -p "$plugin_root/$plugin_id"; cp -R "$tmp_dir/." "$plugin_root/$plugin_id/"; printf '{\n "source": "github",\n "url": "%s"\n}\n' "$plugin_url" > "$metadata_root/$plugin_id.json"; rm -rf "$tmp_dir"; done # buildkit
# 2026-06-19 20:33:05 30.31MB 执行命令并创建新的镜像层
RUN |1 PI_WEB_VERSION=latest /bin/sh -c set -eux; case "$(dpkg --print-architecture)" in amd64) pi_web_arch="amd64" ;; arm64) pi_web_arch="arm64" ;; *) echo "Unsupported architecture: $(dpkg --print-architecture)" >&2; exit 1 ;; esac; if [ "$PI_WEB_VERSION" = "latest" ]; then pi_web_version="$(curl -fsSL https://api.github.com/repos/Epsilondelta-ai/pi-web/releases/latest | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1)"; else pi_web_version="$PI_WEB_VERSION"; fi; [ -n "$pi_web_version" ]; pi_web_asset_version="${pi_web_version#v}"; pi_web_asset="pi-web_${pi_web_asset_version}_linux_${pi_web_arch}.tar.gz"; pi_web_url="https://github.com/Epsilondelta-ai/pi-web/releases/download/${pi_web_version}/${pi_web_asset}"; tmp_dir="$(mktemp -d)"; curl -fsSL "$pi_web_url" -o "$tmp_dir/$pi_web_asset"; tar -xzf "$tmp_dir/$pi_web_asset" -C "$tmp_dir"; mkdir -p /home/surenkid/bin; pi_web_bin="$(find "$tmp_dir" -type f -name pi-web | head -n 1)"; [ -n "$pi_web_bin" ]; cp "$pi_web_bin" /home/surenkid/bin/pi-web; chmod +x /home/surenkid/bin/pi-web; rm -rf "$tmp_dir" # buildkit
# 2026-06-19 20:33:03 127.23MB 执行命令并创建新的镜像层
RUN |1 PI_WEB_VERSION=latest /bin/sh -c npm install -g --ignore-scripts @earendil-works/pi-coding-agent && npm cache clean --force # buildkit
# 2026-06-19 20:32:53 104.58MB 执行命令并创建新的镜像层
RUN |1 PI_WEB_VERSION=latest /bin/sh -c apt update && apt --yes --no-install-recommends install ca-certificates curl git openssl wget ripgrep jq fd-find && rm -rf /var/lib/apt/lists/* # buildkit
# 2026-06-19 20:32:53 0.00B 指定运行容器时使用的用户
USER root
# 2026-06-19 20:32:53 0.00B 设置环境变量 TZ
ENV TZ=Asia/Shanghai
# 2026-06-19 20:32:53 0.00B 定义构建参数
ARG PI_WEB_VERSION=latest
# 2026-06-18 21:45:31 0.00B 设置默认要执行的命令
CMD ["node"]
# 2026-06-18 21:45:31 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["docker-entrypoint.sh"]
# 2026-06-18 21:45:31 388.00B 复制新文件或目录到容器中
COPY docker-entrypoint.sh /usr/local/bin/ # buildkit
# 2026-06-18 21:45:31 7.18MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -ex && savedAptMark="$(apt-mark showmanual)" && apt-get update && apt-get install -y ca-certificates curl wget gnupg dirmngr --no-install-recommends && rm -rf /var/lib/apt/lists/* && export GNUPGHOME="$(mktemp -d)" && for key in 6A010C5166006599AA17F08146C2130DFD2497F5 ; do { gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" && gpg --batch --fingerprint "$key"; } || { gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" && gpg --batch --fingerprint "$key"; } ; done && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz && gpgconf --kill all && rm -rf "$GNUPGHOME" && mkdir -p /opt && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz && apt-mark auto '.*' > /dev/null && { [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; } && find /usr/local -type f -executable -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); print so }' | sort -u | xargs -r dpkg-query --search | cut -d: -f1 | sort -u | xargs -r apt-mark manual && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && yarn --version && rm -rf /tmp/* # buildkit
# 2026-06-18 21:45:18 0.00B 设置环境变量 YARN_VERSION
ENV YARN_VERSION=1.22.22
# 2026-06-18 21:45:18 143.84MB 执行命令并创建新的镜像层
RUN /bin/sh -c ARCH= OPENSSL_ARCH= && dpkgArch="$(dpkg --print-architecture)" && case "${dpkgArch##*-}" in amd64) ARCH='x64' OPENSSL_ARCH='linux-x86_64';; ppc64el) ARCH='ppc64le' OPENSSL_ARCH='linux-ppc64le';; s390x) ARCH='s390x' OPENSSL_ARCH='linux*-s390x';; arm64) ARCH='arm64' OPENSSL_ARCH='linux-aarch64';; armhf) ARCH='armv7l' OPENSSL_ARCH='linux-armv4';; *) echo "unsupported architecture"; exit 1 ;; esac && set -ex && apt-get update && apt-get install -y ca-certificates curl wget gnupg dirmngr xz-utils libatomic1 --no-install-recommends && rm -rf /var/lib/apt/lists/* && export GNUPGHOME="$(mktemp -d)" && for key in 5BE8A3F6C8A5C01D106C0AD820B1A390B168D356 DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 CC68F5A3106FF448322E48ED27F5E38D5B0A215F 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C 108F52B48DB57BB0CC439B2997B01419BD92F80A A363A499291CBBC940DD62E41F10027AF002F8B0 ; do { gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" && gpg --batch --fingerprint "$key"; } || { gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" && gpg --batch --fingerprint "$key"; } ; done && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc && gpgconf --kill all && rm -rf "$GNUPGHOME" && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt && find /usr/local/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; && apt-mark auto '.*' > /dev/null && find /usr/local -type f -executable -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); print so }' | sort -u | xargs -r dpkg-query --search | cut -d: -f1 | sort -u | xargs -r apt-mark manual && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && ln -s /usr/local/bin/node /usr/local/bin/nodejs && node --version && npm --version && rm -rf /tmp/* # buildkit
# 2026-06-18 21:45:18 0.00B 设置环境变量 NODE_VERSION
ENV NODE_VERSION=24.17.0
# 2026-06-18 21:44:59 8.90KB 执行命令并创建新的镜像层
RUN /bin/sh -c groupadd --gid 1000 node && useradd --uid 1000 --gid node --shell /bin/bash --create-home node # buildkit
# 2026-06-10 08:00:00 74.83MB
# debian.sh --arch 'amd64' out/ 'bookworm' '@1781049600'
镜像信息
{
"Id": "sha256:37844ef89ef4e7690dd75ef10fbf2c612ad3a6c1179c095936be277ac3a6a5b9",
"RepoTags": [
"7x24/pi-web:20260619",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/7x24/pi-web:20260619"
],
"RepoDigests": [
"7x24/pi-web@sha256:43141a92c1d0750f9bf06a23eeb5b738748d6b5e9b3edf567a33c0a028e29fef",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/7x24/pi-web@sha256:a45ee822081ea9a666f1ec6821fe2ca72d84d897509c0314975aaa40e3b44256"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-06-19T12:33:24.29734107Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "root",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"7861/tcp": {},
"8732/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NODE_VERSION=24.17.0",
"YARN_VERSION=1.22.22",
"TZ=Asia/Shanghai"
],
"Cmd": null,
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/usr/local/bin/enhanced-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1075278055,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/f24dd117eaed8888250e9da465f1c8de7ea52bc51c1e589040d36893ecccf0fa/diff:/var/lib/docker/overlay2/66422e8cf337775e2a012d5f717094ae83a3f05ded2e7de694574d6b4ba5d0ba/diff:/var/lib/docker/overlay2/b75f0c4a52ddec08e136a26944173ae328a923b7d312ee9e5671b5fe33d0a8ca/diff:/var/lib/docker/overlay2/1dbee294783ef5b417821f21356d290c41e7345331b0c194f6f033e31a70f4cc/diff:/var/lib/docker/overlay2/00318ff60d50e89565d826c3011265d91f538a839e81b797a2c59ccbd33a1fc0/diff:/var/lib/docker/overlay2/1fc3ba400d16d9d8074cc50a2a10e591e681ba3d8ff69b7e21595dd2131960fb/diff:/var/lib/docker/overlay2/8d06ac85eb78ce63c60a0fbad4e09b84dd8cb25901020b3f94514d59334f323d/diff:/var/lib/docker/overlay2/a2751b9b02f9667692f1524c87b719763758ed15578b52440a7311421f00f32e/diff:/var/lib/docker/overlay2/2b4592f9317b3ec86aff55b4e6d5af0ebc6202a3f99324655a4500e5b37a0746/diff:/var/lib/docker/overlay2/de06ee2ab9626b59dbac8101b2bccaaa53635b22551577c999ee6e51d7fd4d86/diff",
"MergedDir": "/var/lib/docker/overlay2/88b8c76f2d22af8657cefa032e61b7ce250ba527aeea9cc7621a56182bfd0245/merged",
"UpperDir": "/var/lib/docker/overlay2/88b8c76f2d22af8657cefa032e61b7ce250ba527aeea9cc7621a56182bfd0245/diff",
"WorkDir": "/var/lib/docker/overlay2/88b8c76f2d22af8657cefa032e61b7ce250ba527aeea9cc7621a56182bfd0245/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:8db1b4d0e54f2fbc2baf1563e57d88a8e72d3c79a72a38b9e4dee36e84f1d8ce",
"sha256:af588789b7606c5b031309399477e3264e8ed3827d20a0d0028f23909cf78a50",
"sha256:e1d445cda84eaee01bc8ec28599034db34ba22b94aadff85b1704deabf9b1bbe",
"sha256:92cc31d8cf8119bdd91d9dec8a763036010526cb073fb67e9b7314d2d0cd2a05",
"sha256:b337da10638c767285fb4cd79e1c9492baa4d583d4f070bfc76b2b80f7ba47ee",
"sha256:f631aed204fca443ba0787583073fb479e6ccb5d978b1f7b66d842ac6b822528",
"sha256:649a77487b4cac9f8b622ffaceef0c60dd4dd95440344b29afc32a6320ccc6db",
"sha256:71d847882312abbf90a14cbd5864ab3c207e2cb682af0516b4b21419f853531b",
"sha256:47fab27a4404bf2b021a7b203a843e41a87de48d1e330d800330e25b8834909a",
"sha256:d402e954c7ddc1cc0ea013288d8ce88e8112be6a3366b1dadc42bc958e3f9662",
"sha256:121004fcfbf03b6c94e311bc3d85f5ce69aaa0f40a5a726c55db1478dc0f25e8"
]
},
"Metadata": {
"LastTagTime": "2026-08-12T16:59:59.116723315+08:00"
}
}