镜像构建历史
# 2025-12-14 20:06:49 2.59MB 执行命令并创建新的镜像层
RUN /bin/sh -c cd /tmp/frontend && npm run build && cp -r dist/* /usr/share/nginx/html/ && rm -rf /tmp/frontend # buildkit
# 2025-12-14 20:06:31 2.86MB 复制新文件或目录到容器中
COPY frontend/ /tmp/frontend/ # buildkit
# 2025-12-14 20:06:31 43.25KB 复制新文件或目录到容器中
COPY alembic/ ./alembic/ # buildkit
# 2025-12-14 20:06:31 985.00B 复制新文件或目录到容器中
COPY alembic.ini ./ # buildkit
# 2025-12-14 20:06:31 2.18MB 复制新文件或目录到容器中
COPY src/ ./src/ # buildkit
# 2025-12-12 16:39:29 0.00B 设置工作目录为/app
WORKDIR /app
# 2025-12-12 16:23:27 0.00B 设置默认要执行的命令
CMD ["/usr/bin/supervisord" "-c" "/etc/supervisor/conf.d/supervisord.conf"]
# 2025-12-12 16:23:27 0.00B 指定检查容器健康状态的命令
HEALTHCHECK &{["CMD-SHELL" "curl -f http://localhost/health || exit 1"] "30s" "10s" "5s" "0s" '\x03'}
# 2025-12-12 16:23:27 0.00B 声明容器运行时监听的端口
EXPOSE [80/tcp]
# 2025-12-12 16:23:27 0.00B 设置环境变量 PYTHONUNBUFFERED PYTHONDONTWRITEBYTECODE PYTHONIOENCODING LANG LC_ALL PORT
ENV PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1 PYTHONIOENCODING=utf-8 LANG=C.UTF-8 LC_ALL=C.UTF-8 PORT=8084
# 2025-12-12 16:23:27 0.00B 设置工作目录为/app
WORKDIR /app
# 2025-12-12 16:23:27 0.00B 执行命令并创建新的镜像层
RUN /bin/sh -c mkdir -p /var/log/supervisor /app/logs /app/data /usr/share/nginx/html # buildkit
# 2025-12-12 16:23:27 879.00B 执行命令并创建新的镜像层
RUN /bin/sh -c printf '%s\n' '[supervisord]' 'nodaemon=true' 'logfile=/var/log/supervisor/supervisord.log' 'pidfile=/var/run/supervisord.pid' '' '[program:nginx]' 'command=/bin/bash -c "sed \"s/PORT_PLACEHOLDER/${PORT:-8084}/g\" /etc/nginx/sites-available/default.template > /etc/nginx/sites-available/default && /usr/sbin/nginx -g \"daemon off;\""' 'autostart=true' 'autorestart=true' 'stdout_logfile=/var/log/nginx/access.log' 'stderr_logfile=/var/log/nginx/error.log' '' '[program:app]' 'command=gunicorn src.main:app -w %(ENV_GUNICORN_WORKERS)s -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:%(ENV_PORT)s --timeout 120 --access-logfile - --error-logfile - --log-level info' 'directory=/app' 'autostart=true' 'autorestart=true' 'stdout_logfile=/dev/stdout' 'stdout_logfile_maxbytes=0' 'stderr_logfile=/dev/stderr' 'stderr_logfile_maxbytes=0' 'environment=PYTHONUNBUFFERED=1,PYTHONIOENCODING=utf-8,LANG=C.UTF-8,LC_ALL=C.UTF-8,DOCKER_CONTAINER=true' > /etc/supervisor/conf.d/supervisord.conf # buildkit
# 2025-12-12 16:23:27 1.37KB 执行命令并创建新的镜像层
RUN /bin/sh -c printf '%s\n' 'server {' ' listen 80;' ' server_name _;' ' root /usr/share/nginx/html;' ' index index.html;' ' client_max_body_size 100M;' '' ' location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {' ' expires 1y;' ' add_header Cache-Control "public, no-transform";' ' try_files $uri =404;' ' }' '' ' location ~ ^/(src|node_modules)/ {' ' deny all;' ' return 404;' ' }' '' ' location ~ ^/(dashboard|admin|login)(/|$) {' ' try_files $uri $uri/ /index.html;' ' }' '' ' location / {' ' try_files $uri $uri/ @backend;' ' }' '' ' location @backend {' ' proxy_pass http://127.0.0.1:PORT_PLACEHOLDER;' ' proxy_http_version 1.1;' ' proxy_set_header Host $host;' ' proxy_set_header X-Real-IP $remote_addr;' ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' ' proxy_set_header X-Forwarded-Proto $scheme;' ' proxy_set_header Connection "";' ' proxy_set_header Accept $http_accept;' ' proxy_set_header Content-Type $content_type;' ' proxy_set_header Authorization $http_authorization;' ' proxy_set_header X-Api-Key $http_x_api_key;' ' proxy_buffering off;' ' proxy_cache off;' ' proxy_request_buffering off;' ' chunked_transfer_encoding on;' ' proxy_connect_timeout 600s;' ' proxy_send_timeout 600s;' ' proxy_read_timeout 600s;' ' }' '}' > /etc/nginx/sites-available/default.template # buildkit
# 2025-12-12 16:23:27 322.54MB 执行命令并创建新的镜像层
RUN /bin/sh -c npm ci # buildkit
# 2025-12-12 16:23:17 0.00B 设置工作目录为/tmp/frontend
WORKDIR /tmp/frontend
# 2025-12-12 16:23:17 234.55KB 复制新文件或目录到容器中
COPY frontend/package*.json /tmp/frontend/ # buildkit
# 2025-12-12 16:23:17 177.69MB 执行命令并创建新的镜像层
RUN /bin/sh -c mkdir -p src && touch src/__init__.py && pip install --no-cache-dir . # buildkit
# 2025-12-12 16:23:01 7.36KB 复制新文件或目录到容器中
COPY pyproject.toml README.md ./ # buildkit
# 2025-12-12 16:23:01 961.08MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update && apt-get install -y nginx supervisor libpq-dev gcc curl gettext-base nodejs npm && rm -rf /var/lib/apt/lists/* # buildkit
# 2025-12-12 16:22:08 0.00B 设置工作目录为/app
WORKDIR /app
# 2025-12-09 07:40:51 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2025-12-09 07:40:51 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
# 2025-12-09 07:40:50 36.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 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
# 2025-12-09 07:32:45 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=fb85a13414b028c49ba18bbd523c2d055a30b56b18b92ce454ea2c51edc656c4
# 2025-12-09 07:32:45 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.12.12
# 2025-12-09 07:32:45 0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305
# 2025-12-09 07:32:45 3.81MB 执行命令并创建新的镜像层
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
# 2025-12-09 07:32:45 0.00B 设置环境变量 LANG
ENV LANG=C.UTF-8
# 2025-12-09 07:32:45 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2025-12-08 08:00:00 78.62MB
# debian.sh --arch 'amd64' out/ 'trixie' '@1765152000'
镜像信息
{
"Id": "sha256:3a1378df805ef71792725edc1f922bb2b4c16bdcd3ea413303f26df4478d1ec7",
"RepoTags": [
"ghcr.io/fawney19/aether:0.1.1",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/fawney19/aether:0.1.1"
],
"RepoDigests": [
"ghcr.io/fawney19/aether@sha256:dae610ee8d57536059452afc995cae9545132b98608e1d453a7b346ece213413",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/fawney19/aether@sha256:e0b69b5eba9157df0dc3a2a0d9ae0fdaea2e2a53bb92c666d06083e4b1459869"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2025-12-14T12:06:49.530738544Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
"PYTHON_VERSION=3.12.12",
"PYTHON_SHA256=fb85a13414b028c49ba18bbd523c2d055a30b56b18b92ce454ea2c51edc656c4",
"PYTHONUNBUFFERED=1",
"PYTHONDONTWRITEBYTECODE=1",
"PYTHONIOENCODING=utf-8",
"LC_ALL=C.UTF-8",
"PORT=8084"
],
"Cmd": [
"/usr/bin/supervisord",
"-c",
"/etc/supervisor/conf.d/supervisord.conf"
],
"Healthcheck": {
"Test": [
"CMD-SHELL",
"curl -f http://localhost/health || exit 1"
],
"Interval": 30000000000,
"Timeout": 10000000000,
"StartPeriod": 5000000000,
"Retries": 3
},
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.opencontainers.image.created": "2025-12-14T12:05:46.770Z",
"org.opencontainers.image.description": "",
"org.opencontainers.image.licenses": "NOASSERTION",
"org.opencontainers.image.revision": "0ef6e045939cdd4fbe5b65f3985cc9b891cf67e8",
"org.opencontainers.image.source": "https://github.com/fawney19/Aether",
"org.opencontainers.image.title": "Aether",
"org.opencontainers.image.url": "https://github.com/fawney19/Aether",
"org.opencontainers.image.version": "0.1.1"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1588398920,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/e9ee54a5f59f682414ea76c70a861415fb2e2cf33894bb0e7f613dad17d50eb7/diff:/var/lib/docker/overlay2/2c1e87e4361318215605ad82f9697786721cf65cd55e47aa0e9cf4dfb87298fe/diff:/var/lib/docker/overlay2/c0b270f999a4be9771f52b92f942f298faced971f19d598bc9d9e891d6275f21/diff:/var/lib/docker/overlay2/ae863a4d808ba61423b514abb013d25c058a393ddc91095a7c5c4271dc88fd0c/diff:/var/lib/docker/overlay2/8fd0bdcfb2ee8befac756ecdd93f53ac29bab3b4f08381c23cd5d46d2234bc1d/diff:/var/lib/docker/overlay2/3b66b0d913961c070b76fe456751daa5a86b33fa8455d96011dc3128d8913682/diff:/var/lib/docker/overlay2/2c1f6a46e4fb3f47bff4703991f8276373b42130d3cc93644cf79a5d7109865a/diff:/var/lib/docker/overlay2/df65c7d8c12c10c5bba12b3a7919c46e9e1c28cfa8ad099b282d57cb00419972/diff:/var/lib/docker/overlay2/a248c0bd0d683b09be8afbe1faf1619eaca01651496456ccc51aca1cdf269f66/diff:/var/lib/docker/overlay2/c424720facb9485279f6d97865a7fe08f1974547902815d31c4f76cce63a7dd0/diff:/var/lib/docker/overlay2/5cacbad31665ccf00464ce579079639354280b1e663126ccbb0002347950f398/diff:/var/lib/docker/overlay2/f6cc129581e9495759c9c1819eef098774f10bec4ac5be9e03ee22c3f9165b65/diff:/var/lib/docker/overlay2/438f3f38fff8b0aa1cf7eaeb40bdce2f9046ee67c53685331597e22cd5d7f355/diff:/var/lib/docker/overlay2/7b295a8bb2ede8828c32240d8f003b2d05096ea3f427ddd29374c40e7f30a007/diff:/var/lib/docker/overlay2/bff89186b4d6045d3a903652704736a708a7f5e7513408aae55f2dcfc12d5978/diff:/var/lib/docker/overlay2/4d30b6fd8b5abc62543118885660f6b24935bfd06a85bdf14fcf449068bae839/diff:/var/lib/docker/overlay2/ef374ab1cc6432caade1be17b02801f51a0525d86a7a198dc417c756afb57fc7/diff:/var/lib/docker/overlay2/132e7670b9d2ad095cfcdab1db10d39f12336eb0cce658040f960e898f08b21b/diff:/var/lib/docker/overlay2/b7c9aed3b6d4f1d284f2fa48f8a636640b46a1e9d35da3a052ccf6ec2a33b53c/diff:/var/lib/docker/overlay2/b173045050bdb535e2417e2e5758bda8a33b23021d35b3dfdb02e5091986565d/diff",
"MergedDir": "/var/lib/docker/overlay2/cd795161b8efd4de04a3ab9a0b6017a3f0049fa9bf9b5182b513e29a17ba79a0/merged",
"UpperDir": "/var/lib/docker/overlay2/cd795161b8efd4de04a3ab9a0b6017a3f0049fa9bf9b5182b513e29a17ba79a0/diff",
"WorkDir": "/var/lib/docker/overlay2/cd795161b8efd4de04a3ab9a0b6017a3f0049fa9bf9b5182b513e29a17ba79a0/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:77a2b55fbe8b9984ce0af3ffc0b0ab62507668e63306ec161a585e587a3eb164",
"sha256:d3ed01caa08409d7ff04793f0b0dfb39c0d1939740be551109e87f0e62b0a9f0",
"sha256:644f9c869502a74da62088149065804b8cd717eb2cdb30bf1e59f05361cf4724",
"sha256:602c1c97924f2a6b937eaa66046c1207e4c3eb26f7c0e66c99cb456fea375715",
"sha256:c67a1aa8f607c82bc3d2cb0d41ef3bbbb4d23d96ceb7d14429112d5f665473a3",
"sha256:20917707965d90d167f5ac28fbf5b219d00e805af3fb0310f0a2824ac80e243f",
"sha256:ac2161b71faa14c3b3f8ded95238fc3a162602cc1ee13fbbd333fe8bdf6e0b59",
"sha256:5e0869ccccd1449ccb917a806f62e165447b2c03cb95aef503437a55ee1ec463",
"sha256:8693c3f174a69eb68d1a98ac98eaab40e394a69eee02ac88649cec4ba55e3d0b",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:14027a415a4d8c389f3b2cfb5b962c017b3d56c5fe5937775946961116fd4631",
"sha256:e66306603202680f5a71fe5dbe3f213929d40da017d22c2be7a794fb05723112",
"sha256:111778255f703a9826dad264c80d4201b720fe6590f5724c81d08348d6460163",
"sha256:c239e53ec87a404af4c0d5a40d9f03dcec37c4f5ba60658f7884dda3e9ed03de",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:965a436ee4063051272c1d6235bb8880ceb7cde50065a3c67d62c8b574885cf6",
"sha256:435be32546d27e1f49b87bbda70a4b4bdfefe15f6b90d2c1428daf1a2c4e8452",
"sha256:862582983f28b5832902cdedc583130e6a41f59977ba914bee1582f8f1f092c4",
"sha256:25450382026e154a805015dae78a3d4738e9e87ea8e108d7f6cc31a83c4d48d9",
"sha256:a601385bd2f898a2dca722874fc19a14600f21704ca7d398e776d0b154d061bc"
]
},
"Metadata": {
"LastTagTime": "2025-12-15T19:24:29.89674219+08:00"
}
}