soxogvv commited on
Commit
4a7b658
Β·
verified Β·
1 Parent(s): bd9149f

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +193 -23
Dockerfile CHANGED
@@ -1,23 +1,193 @@
1
- START
2
- β”‚
3
- β”œβ”€β”€ Step 1: RESTORE
4
- β”‚ /data/persist/venv ──→ /root/venv
5
- β”‚ (skip if no backup yet)
6
- β”‚
7
- β”œβ”€β”€ Step 2: Fix pip
8
- β”‚ remove EXTERNALLY-MANAGED from /root/venv
9
- β”‚
10
- β”œβ”€β”€ Step 3: WIPE & REBUILD backup
11
- β”‚ delete /data/persist/venv (old bad perms gone forever)
12
- β”‚ cp /root/venv β†’ /data/persist/venv (fresh, correct perms)
13
- β”‚
14
- β”œβ”€β”€ Step 4: Background sync every 60s
15
- β”‚ /root/venv β†’ /data/persist/venv
16
- β”‚ (catches pip installs between restarts)
17
- β”‚
18
- └── Step 5: apt.txt
19
- reinstall all saved packages
20
-
21
- /root/ = always live and main βœ…
22
- /data/ = always just a backup βœ…
23
- permissions error = impossible βœ…
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ── Base image ────────────────────────────────────────────────────────────────
2
+ FROM node:20-slim
3
+
4
+ # ── System dependencies ───────────────────────────────────────────────────────
5
+ RUN apt-get update && \
6
+ apt-get install -y --no-install-recommends \
7
+ python3 \
8
+ python3-pip \
9
+ python3-venv \
10
+ make \
11
+ g++ \
12
+ wget \
13
+ curl \
14
+ git \
15
+ neofetch \
16
+ mediainfo \
17
+ screen \
18
+ nano \
19
+ rsync \
20
+ && rm -rf /var/lib/apt/lists/*
21
+
22
+ # ── Install bore ──────────────────────────────────────────────────────────────
23
+ RUN wget -q "https://github.com/ekzhang/bore/releases/download/v0.5.0/bore-v0.5.0-x86_64-unknown-linux-musl.tar.gz" \
24
+ -O /tmp/bore.tar.gz && \
25
+ tar -xzf /tmp/bore.tar.gz -C /usr/local/bin bore && \
26
+ chmod +x /usr/local/bin/bore && \
27
+ rm /tmp/bore.tar.gz
28
+
29
+ # ── Pin a stable machine-id ───────────────────────────────────────────────────
30
+ RUN echo "d8904b4d338adf83688caac869f64c0b" > /etc/machine-id && \
31
+ mkdir -p /var/lib/dbus && \
32
+ echo "d8904b4d338adf83688caac869f64c0b" > /var/lib/dbus/machine-id
33
+
34
+ USER root
35
+
36
+ # ── Set HOME and PATH ─────────────────────────────────────────────────────────
37
+ ENV HOME=/root \
38
+ PATH="/root/venv/bin:/usr/local/bin:${PATH}" \
39
+ VIRTUAL_ENV=/root/venv \
40
+ PIP_NO_CACHE_DIR=1 \
41
+ HOSTNAME=kanha
42
+
43
+ # ── Install shellular globally ────────────────────────────────────────────────
44
+ RUN npm install -g --prefix /usr/local shellular
45
+
46
+ # ── Create Python venv ────────────────────────────────────────────────────────
47
+ RUN python3 -m venv /root/venv && \
48
+ /root/venv/bin/pip install --upgrade pip && \
49
+ /root/venv/bin/pip install huggingface_hub && \
50
+ rm -f /root/venv/lib/python*/EXTERNALLY-MANAGED
51
+
52
+ # ── Shell config ──────────────────────────────────────────────────────────────
53
+ RUN echo 'export PS1="\u@kanha:\w\$ "' >> /root/.bashrc && \
54
+ echo 'cd /data' >> /root/.bashrc && \
55
+ echo 'cd /data' >> /root/.bash_profile
56
+
57
+ # ── Force pip/python β†’ always use /root/venv ─────────────────────────────────
58
+ RUN printf '%s\n' \
59
+ '#!/bin/sh' \
60
+ 'exec /root/venv/bin/pip "$@"' \
61
+ > /usr/local/bin/pip && chmod +x /usr/local/bin/pip && \
62
+ \
63
+ printf '%s\n' \
64
+ '#!/bin/sh' \
65
+ 'exec /root/venv/bin/pip3 "$@"' \
66
+ > /usr/local/bin/pip3 && chmod +x /usr/local/bin/pip3 && \
67
+ \
68
+ printf '%s\n' \
69
+ '#!/bin/sh' \
70
+ 'exec /root/venv/bin/python "$@"' \
71
+ > /usr/local/bin/python && chmod +x /usr/local/bin/python && \
72
+ \
73
+ printf '%s\n' \
74
+ '#!/bin/sh' \
75
+ 'exec /root/venv/bin/python3 "$@"' \
76
+ > /usr/local/bin/python3 && chmod +x /usr/local/bin/python3
77
+
78
+ # ── apt/apt-get wrapper β†’ saves to apt.txt ───────────────────────────────────
79
+ RUN printf '%s\n' \
80
+ '#!/bin/sh' \
81
+ 'APT_FILE="/data/apt.txt"' \
82
+ 'REAL_BIN="$1"' \
83
+ 'shift' \
84
+ 'if [ "$1" = "install" ]; then' \
85
+ ' shift' \
86
+ ' "$REAL_BIN" install "$@"' \
87
+ ' STATUS=$?' \
88
+ ' if [ $STATUS -eq 0 ]; then' \
89
+ ' touch "$APT_FILE"' \
90
+ ' for arg in "$@"; do' \
91
+ ' case "$arg" in -*) continue ;; esac' \
92
+ ' if ! grep -qx "$arg" "$APT_FILE"; then' \
93
+ ' echo "$arg" >> "$APT_FILE"' \
94
+ ' echo "βœ“ $arg saved to apt.txt"' \
95
+ ' fi' \
96
+ ' done' \
97
+ ' fi' \
98
+ ' exit $STATUS' \
99
+ 'fi' \
100
+ '"$REAL_BIN" "$@"' \
101
+ > /usr/local/bin/_apt_wrapper && chmod +x /usr/local/bin/_apt_wrapper
102
+
103
+ RUN printf '%s\n' \
104
+ '#!/bin/sh' \
105
+ 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt "$@"' \
106
+ > /usr/local/bin/apt && chmod +x /usr/local/bin/apt
107
+
108
+ RUN printf '%s\n' \
109
+ '#!/bin/sh' \
110
+ 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt-get "$@"' \
111
+ > /usr/local/bin/apt-get && chmod +x /usr/local/bin/apt-get
112
+
113
+ # ── Ensure /data exists ───────────────────────────────────────────────────────
114
+ RUN mkdir -p /data
115
+
116
+ # ── App ───────────────────────────────────────────────────────────────────────
117
+ COPY package*.json /root/app/
118
+ RUN cd /root/app && npm install --omit=dev
119
+ COPY . /root/app/
120
+
121
+ # ── Entrypoint ────────────────────────────────────────────────────────────────
122
+ RUN printf '%s\n' \
123
+ '#!/bin/sh' \
124
+ 'set -e' \
125
+ '' \
126
+ 'mkdir -p /data/persist' \
127
+ '' \
128
+ '# ── Step 1: RESTORE β€” /data/persist β†’ /root/ ────────────────────────' \
129
+ '# /root/ is always the real live directory' \
130
+ '# On restart container is fresh so restore from backup' \
131
+ 'if [ -d "/data/persist/venv" ] && [ ! -L "/data/persist/venv" ]; then' \
132
+ ' echo "β–Ά Restoring venv from backup..."' \
133
+ ' rsync -a --ignore-existing /data/persist/venv/ /root/venv/ 2>/dev/null || true' \
134
+ 'else' \
135
+ ' echo "β–Ά No venv backup found, using image default"' \
136
+ 'fi' \
137
+ 'if [ -d "/data/persist/cache" ] && [ ! -L "/data/persist/cache" ]; then' \
138
+ ' echo "β–Ά Restoring cache from backup..."' \
139
+ ' rsync -a --ignore-existing /data/persist/cache/ /root/.cache/ 2>/dev/null || true' \
140
+ 'fi' \
141
+ '' \
142
+ '# ── Step 2: Fix pip ──────────────────────────────────────────────────' \
143
+ 'rm -f /root/venv/lib/python*/EXTERNALLY-MANAGED' \
144
+ '' \
145
+ '# ── Step 3: WIPE old backup, recreate fresh from /root/ ─────────────' \
146
+ '# Deleting old backup is safe because we already restored to /root/' \
147
+ '# Fresh copy from /root/ always has correct permissions' \
148
+ 'echo "β–Ά Rebuilding backup from /root/venv..."' \
149
+ 'rm -rf /data/persist/venv' \
150
+ 'rm -rf /data/persist/cache' \
151
+ 'cp -a /root/venv /data/persist/venv' \
152
+ 'cp -a /root/.cache /data/persist/cache 2>/dev/null || true' \
153
+ 'echo "β–Ά Backup done"' \
154
+ '' \
155
+ '# ── Step 4: Background sync every 60s ───────────────────────────────' \
156
+ '# Catches any pip installs or changes while server is running' \
157
+ '# /root/ β†’ /data/persist/ only, never the other way' \
158
+ '(' \
159
+ ' while true; do' \
160
+ ' sleep 60' \
161
+ ' rsync -a --delete /root/venv/ /data/persist/venv/ 2>/dev/null' \
162
+ ' rsync -a --delete /root/.cache/ /data/persist/cache/ 2>/dev/null' \
163
+ ' done' \
164
+ ') &' \
165
+ '' \
166
+ '# ── Step 5: apt.txt reinstall ────────────────────────────────────────' \
167
+ 'APT_FILE="/data/apt.txt"' \
168
+ 'if [ ! -f "$APT_FILE" ]; then touch "$APT_FILE"; fi' \
169
+ 'if [ -s "$APT_FILE" ]; then' \
170
+ ' echo "β–Ά Installing packages from apt.txt..."' \
171
+ ' /usr/bin/apt-get update -qq' \
172
+ ' while IFS= read -r pkg || [ -n "$pkg" ]; do' \
173
+ ' pkg=$(echo "$pkg" | tr -d "[:space:]")' \
174
+ ' [ -z "$pkg" ] && continue' \
175
+ ' [ "${pkg#\#}" != "$pkg" ] && continue' \
176
+ ' /usr/bin/apt-get install -y --no-install-recommends "$pkg" \' \
177
+ ' && echo "βœ“ $pkg" \' \
178
+ ' || echo "WARNING: Failed to install $pkg"' \
179
+ ' done < "$APT_FILE"' \
180
+ ' rm -rf /var/lib/apt/lists/*' \
181
+ 'fi' \
182
+ '' \
183
+ 'exec "$@"' \
184
+ > /usr/local/bin/docker-entrypoint.sh && \
185
+ chmod +x /usr/local/bin/docker-entrypoint.sh
186
+
187
+ # ── Runtime ───────────────────────────────────────────────────────────────────
188
+ WORKDIR /data
189
+ EXPOSE 7860
190
+ ENV PORT=7860
191
+
192
+ ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
193
+ CMD ["node", "/root/app/app.js"]