镜像构建历史
# 2025-12-18 10:59:23 2.61MB 执行命令并创建新的镜像层
RUN /bin/sh -c cd /tmp/frontend && npm run build && cp -r dist/* /usr/share/nginx/html/ && rm -rf /tmp/frontend # buildkit
# 2025-12-18 10:59:05 2.91MB 复制新文件或目录到容器中
COPY frontend/ /tmp/frontend/ # buildkit
# 2025-12-18 10:59:05 60.55KB 复制新文件或目录到容器中
COPY alembic/ ./alembic/ # buildkit
# 2025-12-18 10:59:05 985.00B 复制新文件或目录到容器中
COPY alembic.ini ./ # buildkit
# 2025-12-18 10:59:05 2.21MB 复制新文件或目录到容器中
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:af44db43fde43f6f22fbfbe68a33118c7ff733732dcc0ad2cdaf4ad9aa876acf",
"RepoTags": [
"ghcr.io/fawney19/aether:0.1.11",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/fawney19/aether:0.1.11"
],
"RepoDigests": [
"ghcr.io/fawney19/aether@sha256:73634a05633c71af712a0ab25eb872966888e756bc192294ea0007709c053f3a",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/fawney19/aether@sha256:288cd540f6417c60e9bebb96b7a9cd17dac7514b3a313cbb459ec95ec8c854d2"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2025-12-18T02:59:23.087702907Z",
"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-18T02:58:36.217Z",
"org.opencontainers.image.description": "",
"org.opencontainers.image.licenses": "NOASSERTION",
"org.opencontainers.image.revision": "21587449c867ffaeff2206e38b179560de76f624",
"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.11"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1588525763,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/d46a2f85081b4fa4266b5b3c19b0fbfac0e0eb2b9b0d57a89ce0ea62ddc3d2df/diff:/var/lib/docker/overlay2/5ece1499a5700670e3ec7e376484e4bd706d0733539aa8c323819ca48cbb2367/diff:/var/lib/docker/overlay2/fbd57d6991f2d314c70c79ed39b1cb3d1e323e95dca8aad5c6e285be09daa34b/diff:/var/lib/docker/overlay2/f59c9492d171bd1f35cf90ffbe0c42dc7e7c004cb5fb852ed5a98f7ccc79699e/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/550cdfcae347067291a6ab77e1a1a89a4733fcf4c400c5cd7c6cae2f3c27e876/merged",
"UpperDir": "/var/lib/docker/overlay2/550cdfcae347067291a6ab77e1a1a89a4733fcf4c400c5cd7c6cae2f3c27e876/diff",
"WorkDir": "/var/lib/docker/overlay2/550cdfcae347067291a6ab77e1a1a89a4733fcf4c400c5cd7c6cae2f3c27e876/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:e670f41f568fd7a8f25cac729aa68cfb9f75c640286ef055c5378933b9185ab8",
"sha256:1e08e5c1d89b1c2a9c61d437769b1cc834566723d4c3c785372f8f70716069f6",
"sha256:e94e2fe5b6f9c1454e82f5891c98469852735205307caa2b9176456f7a77ce19",
"sha256:d4f318b53892be24f64c9e17cf52384c360367a1aa6789b7de00b2cc52f5ada0",
"sha256:043268aff85db36313b075cef71b02700b9b95e763c514a52c3229233c341d6e"
]
},
"Metadata": {
"LastTagTime": "2025-12-18T15:34:48.482475154+08:00"
}
}