镜像构建历史
# 2026-05-22 05:43:47 0.00B 设置默认要执行的命令
CMD ["sh" "/app/start.sh"]
# 2026-05-22 05:43:47 0.00B 声明容器运行时监听的端口
EXPOSE [4000/tcp 80/tcp 9000/tcp]
# 2026-05-22 05:43:47 0.00B 设置环境变量 PORT LEARNHOUSE_PORT COLLAB_PORT HOSTNAME LEARNHOUSE_OSS NEXT_PUBLIC_LEARNHOUSE_OSS
ENV PORT=8000 LEARNHOUSE_PORT=9000 COLLAB_PORT=4000 HOSTNAME=0.0.0.0 LEARNHOUSE_OSS=true NEXT_PUBLIC_LEARNHOUSE_OSS=true
# 2026-05-22 05:43:47 3.70KB 执行命令并创建新的镜像层
RUN |1 LEARNHOUSE_PUBLIC=true /bin/sh -c chmod +x /app/api/docker-entrypoint.sh /app/start.sh # buildkit
# 2026-05-22 05:43:47 1.20KB 复制新文件或目录到容器中
COPY ./docker/start.sh /app/start.sh # buildkit
# 2026-05-22 05:43:47 0.00B 复制新文件或目录到容器中
COPY ./apps/api/docker-entrypoint.sh /app/api/docker-entrypoint.sh # buildkit
# 2026-05-22 05:43:47 3.16KB 复制新文件或目录到容器中
COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf # buildkit
# 2026-05-22 05:43:47 0.00B 设置工作目录为/app
WORKDIR /app
# 2026-05-22 05:43:47 8.03MB 执行命令并创建新的镜像层
RUN |1 LEARNHOUSE_PUBLIC=true /bin/sh -c bun install --production # buildkit
# 2026-05-22 05:43:46 16.84KB 复制新文件或目录到容器中
COPY apps/collab/package.json apps/collab/bun.lock* ./ # buildkit
# 2026-05-22 05:43:46 13.78KB 复制新文件或目录到容器中
COPY /app/dist ./dist # buildkit
# 2026-05-22 05:43:46 0.00B 设置工作目录为/app/collab
WORKDIR /app/collab
# 2026-05-22 05:43:46 0.00B 执行命令并创建新的镜像层
RUN |1 LEARNHOUSE_PUBLIC=true /bin/sh -c if [ "$LEARNHOUSE_PUBLIC" = "true" ]; then rm -rf /app/api/ee; fi # buildkit
# 2026-05-22 05:43:46 0.00B 定义构建参数
ARG LEARNHOUSE_PUBLIC=true
# 2026-05-22 05:43:46 5.22MB 复制新文件或目录到容器中
COPY ./apps/api ./ # buildkit
# 2026-05-22 05:43:46 469.84MB 执行命令并创建新的镜像层
RUN /bin/sh -c pip install --no-cache-dir --upgrade pip uv && uv sync --no-dev # buildkit
# 2026-05-22 05:42:49 259.87KB 复制新文件或目录到容器中
COPY ./apps/api/uv.lock ./apps/api/pyproject.toml ./ # buildkit
# 2026-05-22 05:42:49 0.00B 设置工作目录为/app/api
WORKDIR /app/api
# 2026-05-22 05:42:49 119.07MB 复制新文件或目录到容器中
COPY /app /app/web # buildkit
# 2026-05-22 05:42:49 0.00B 设置环境变量 PATH
ENV PATH=/root/.bun/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-05-22 05:41:39 655.22MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update && apt-get install -y --no-install-recommends nginx curl netcat-openbsd ca-certificates gnupg unzip build-essential && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt-get install -y --no-install-recommends nodejs && npm install -g pm2 && curl -fsSL https://bun.sh/install | bash && apt-get purge -y gnupg && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /root/.npm && rm /etc/nginx/sites-enabled/default # buildkit
# 2026-04-07 10:26:10 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2026-04-07 10:26: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-04-07 10:26:10 37.76MB 执行命令并创建新的镜像层
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 libzstd-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 -; 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-04-07 10:16:38 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=a97d5549e9ad81fe17159ed02c68774ad5d266c72f8d9a0b5a9c371fe85d902b
# 2026-04-07 10:16:38 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.14.3
# 2026-04-07 10:16:38 9.26MB 执行命令并创建新的镜像层
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-04-07 10:16:38 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-04-06 08:00:00 74.83MB
# debian.sh --arch 'amd64' out/ 'bookworm' '@1775433600'
镜像信息
{
"Id": "sha256:568f23db6e7b28128217ae30a88b3999d203e72242a93ade0652e858831fe6f6",
"RepoTags": [
"ghcr.io/learnhouse/app:1.2.2",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/learnhouse/app:1.2.2"
],
"RepoDigests": [
"ghcr.io/learnhouse/app@sha256:74bd882628fb1bf13781d7cf685ec24f35bfe5a0b048db0b1fd012faed44f9f7",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/learnhouse/app@sha256:85ed2564c4948438fb5c4b3bf76f5346f3b14c55345cd8c7f35bbe5dff60b93a"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-05-21T21:43:47.364567308Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"4000/tcp": {},
"80/tcp": {},
"9000/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/root/.bun/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"PYTHON_VERSION=3.14.3",
"PYTHON_SHA256=a97d5549e9ad81fe17159ed02c68774ad5d266c72f8d9a0b5a9c371fe85d902b",
"PORT=8000",
"LEARNHOUSE_PORT=9000",
"COLLAB_PORT=4000",
"HOSTNAME=0.0.0.0",
"LEARNHOUSE_OSS=true",
"NEXT_PUBLIC_LEARNHOUSE_OSS=true"
],
"Cmd": [
"sh",
"/app/start.sh"
],
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1379517517,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/1cebc5dc6072751e175c80c70caba7385ca91a8fdd673d6d5547d233520cacf6/diff:/var/lib/docker/overlay2/2dabdae65bcbb83bc02d7e3424181450343761666f72ad2ec485fe7a71d4966b/diff:/var/lib/docker/overlay2/73670cb29132f94309d7b26cd95be1961ba1f0839f040b3f1075f91c91efe444/diff:/var/lib/docker/overlay2/524ab29b51bd2030420b9e7206f8599ae166a8190e37ba1a8d02a0e45b8eda42/diff:/var/lib/docker/overlay2/074c8e40a82e0c31880461d23a91466183afd256fb8d26146a7b1272f0f968b9/diff:/var/lib/docker/overlay2/04b36a5ed503435d604e8276c286fa8cdbdedf94f98634903f39078d97aaeb93/diff:/var/lib/docker/overlay2/cb87a03736560a0016255b81cfe54ae284107c96e2864bc899dd3afc13ca4ec1/diff:/var/lib/docker/overlay2/b11f84d4184f9cf5f051d325ed277519e34fa0c8a847a57102e140ba0d713a87/diff:/var/lib/docker/overlay2/c217b80f27c961707474d56793c6fc471e690c97c53957727dbc2df80e955a52/diff:/var/lib/docker/overlay2/af11eaf4f24bd8dc623307f5be34c1f6939a52edac06b41914b44f3a1b89ec72/diff:/var/lib/docker/overlay2/fab72fc68c4c9375447122317fca29e4f5950dc0e0099df2a591bbc2ca18a949/diff:/var/lib/docker/overlay2/8c595be2803e83a1c970fee345f33fdd96157d9105fabd22ed54aeacdfd696b9/diff:/var/lib/docker/overlay2/ad7c8615925b90ab8e40c8478cd0348e67c7d72249a15a81ee64fb77683d6d4b/diff:/var/lib/docker/overlay2/853d8ef43c5997526d47ecc538f6c61c35aa96f64d4976ac6dcd4185a764611f/diff:/var/lib/docker/overlay2/daf49aae056a0cf1ca8e20508e7196e79c3e95887d6936dd6b3b4e7af93f60c7/diff:/var/lib/docker/overlay2/0d418c1310d155fffdceb4172a1737f62978e1654f155029d5ffed3ea6dce5e8/diff:/var/lib/docker/overlay2/9f67cb9dd1dca35037682066fe694293231ec68faf81a362417ca86662ef579b/diff:/var/lib/docker/overlay2/b34a2f06b5183fbf0038e04444d8359770bbae962ce0326d4484256a0584b098/diff:/var/lib/docker/overlay2/a3d6da37fc1a80bcdf27b467ab53fbd78923ca49c0a86db9c9a643ce471d792f/diff",
"MergedDir": "/var/lib/docker/overlay2/77c9096353e393e1f4df6feb171d5f3da30a6b7e5220a94abdce7aca9f65c3e8/merged",
"UpperDir": "/var/lib/docker/overlay2/77c9096353e393e1f4df6feb171d5f3da30a6b7e5220a94abdce7aca9f65c3e8/diff",
"WorkDir": "/var/lib/docker/overlay2/77c9096353e393e1f4df6feb171d5f3da30a6b7e5220a94abdce7aca9f65c3e8/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:335fc45cf5e8eaa6d5b19a54b16db34311ce0d7a068eb2a9222eab4ddd3c216d",
"sha256:593e745a46ef3e8e8c95c7796042275dcffd2f45d45bf6ff251679cb89140cdc",
"sha256:6650fd9c513b12d7ff4a83b8cd7ced9eb3dfcaadc19f930019195a1b70db64a7",
"sha256:55d7b61e3455536d6f29868188764f1ff70090ecafe8b9ba4f36e571ed05c497",
"sha256:e6ff613673583168e1162e84a358b47e47f427e6f0f2b79c3be493b359324c37",
"sha256:7e8c1d9b75d5fd9dcc02c3ad4d0101dbadc70aabcba7df5eceb2346b474116e0",
"sha256:9eb0669788250348a0e8366a868d282079126bbd34e660183ab0efaaa2c89408",
"sha256:5f722369e5b71ab5483a8bcef3311ab49f6169a171a39b3e02367d5a4b13fb80",
"sha256:04bbb5c53c77d0ee1adbe5ebd6996a33b45900eeda0d76c79daaca60fa88efc7",
"sha256:45f80b73d3176c1d85a2c388abd3900d315f2ade106b189bd51b01409cf0e06a",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:03e3760b20aa16c8a281e5269aeed8795826143e6e57e473876980a710423464",
"sha256:645312b8492d3ea76aceb114c91290f9a2256b99782caa7dcd8494661a164445",
"sha256:9138df9928bc5b923c9b1b939d3e07f8deb90e563961827f5de5714be23fc542",
"sha256:d5f9467e46250dd7922a2be9a83225a36283e2c3bb8dbd9b6df9b2df4ea0a8a8",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:3f38f7049dd96ad8907ee686f27d6e9313e23f9a5c3858d6ae059c2388b7d30a",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:d1f3b1c79e1c9927ab23469068fb38b9ebf1be50106e747e45e4b5cd276edb1b",
"sha256:07ba2439506d67e2a0dbed59fbf749234e3affb21ad208d16f7811de23bc0feb"
]
},
"Metadata": {
"LastTagTime": "2026-06-18T17:12:46.000774954+08:00"
}
}