soxogvv commited on
Commit
0befb19
Β·
verified Β·
1 Parent(s): 55e54e8

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +62 -27
Dockerfile CHANGED
@@ -39,7 +39,7 @@ ENV HOME=/root \
39
  PIP_NO_CACHE_DIR=1 \
40
  HOSTNAME=kanha
41
 
42
- # ── Install shellular globally into /usr/local (never persisted, always works) ─
43
  RUN npm install -g --prefix /usr/local shellular
44
 
45
  # ── Create Python venv ────────────────────────────────────────────────────────
@@ -51,31 +51,57 @@ RUN python3 -m venv /root/venv && \
51
  # ── Shell config ──────────────────────────────────────────────────────────────
52
  RUN echo 'export PS1="\u@kanha:\w\$ "' >> /root/.bashrc && \
53
  echo 'cd /data' >> /root/.bashrc && \
54
- echo '. /root/venv/bin/activate' >> /root/.bashrc && \
55
- echo 'cd /data' >> /root/.bash_profile && \
56
- echo '. /root/venv/bin/activate' >> /root/.bash_profile
57
 
58
- # ── apt-install wrapper ───────────────────────────────────────────────────────
 
 
59
  RUN printf '%s\n' \
60
  '#!/bin/sh' \
61
- 'set -e' \
62
  'APT_FILE="/data/apt.txt"' \
63
- 'touch "$APT_FILE"' \
64
- 'apt-get update -qq' \
65
- 'for pkg in "$@"; do' \
66
- ' pkg=$(echo "$pkg" | tr -d "[:space:]")' \
67
- ' [ -z "$pkg" ] && continue' \
68
- ' apt-get install -y --no-install-recommends "$pkg"' \
69
- ' if ! grep -qx "$pkg" "$APT_FILE"; then' \
70
- ' echo "$pkg" >> "$APT_FILE"' \
71
- ' echo "βœ“ $pkg saved to apt.txt"' \
72
- ' else' \
73
- ' echo "βœ“ $pkg installed (already in apt.txt)"' \
 
 
 
 
 
 
 
 
 
 
74
  ' fi' \
75
- 'done' \
76
- 'rm -rf /var/lib/apt/lists/*' \
77
- > /usr/local/bin/apt-install && \
78
- chmod +x /usr/local/bin/apt-install
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
80
  # ── Ensure /data exists ───────────────────────────────────────────────────────
81
  RUN mkdir -p /data
@@ -112,21 +138,30 @@ RUN printf '%s\n' \
112
  '' \
113
  'rm -f /data/persist/venv/lib/python*/EXTERNALLY-MANAGED' \
114
  '' \
 
 
115
  'export VIRTUAL_ENV=/data/persist/venv' \
116
  'export PATH="/data/persist/venv/bin:$PATH"' \
 
117
  '' \
118
- '# ── apt.txt auto-install on every restart ────────────────────────────' \
 
 
 
 
 
119
  'APT_FILE="/data/apt.txt"' \
120
- 'if [ ! -f "$APT_FILE" ]; then' \
121
- ' touch "$APT_FILE"' \
122
- 'fi' \
123
  'if [ -s "$APT_FILE" ]; then' \
124
- ' apt-get update -qq' \
 
125
  ' while IFS= read -r pkg || [ -n "$pkg" ]; do' \
126
  ' pkg=$(echo "$pkg" | tr -d "[:space:]")' \
127
  ' [ -z "$pkg" ] && continue' \
128
  ' [ "${pkg#\#}" != "$pkg" ] && continue' \
129
- ' apt-get install -y --no-install-recommends "$pkg" || echo "WARNING: Failed to install $pkg"' \
 
 
130
  ' done < "$APT_FILE"' \
131
  ' rm -rf /var/lib/apt/lists/*' \
132
  'fi' \
 
39
  PIP_NO_CACHE_DIR=1 \
40
  HOSTNAME=kanha
41
 
42
+ # ── Install shellular globally ────────────────────────────────────────────────
43
  RUN npm install -g --prefix /usr/local shellular
44
 
45
  # ── Create Python venv ────────────────────────────────────────────────────────
 
51
  # ── Shell config ──────────────────────────────────────────────────────────────
52
  RUN echo 'export PS1="\u@kanha:\w\$ "' >> /root/.bashrc && \
53
  echo 'cd /data' >> /root/.bashrc && \
54
+ echo 'cd /data' >> /root/.bash_profile
 
 
55
 
56
+ # ── Intercept apt and apt-get β†’ save packages to apt.txt ─────────────────────
57
+ # Moves real binaries to /usr/bin/apt.real and /usr/bin/apt-get.real
58
+ # Our wrappers sit in /usr/local/bin which is higher priority in PATH
59
  RUN printf '%s\n' \
60
  '#!/bin/sh' \
61
+ '# Wrapper for apt and apt-get β€” intercepts install and saves to apt.txt' \
62
  'APT_FILE="/data/apt.txt"' \
63
+ 'REAL_BIN="$1"' \
64
+ 'shift' \
65
+ 'if [ "$1" = "install" ]; then' \
66
+ ' shift' \
67
+ ' # Run the real apt/apt-get install' \
68
+ ' "$REAL_BIN" install "$@"' \
69
+ ' STATUS=$?' \
70
+ ' # Only save if install succeeded' \
71
+ ' if [ $STATUS -eq 0 ]; then' \
72
+ ' touch "$APT_FILE"' \
73
+ ' for arg in "$@"; do' \
74
+ ' # Skip flags like -y --no-install-recommends' \
75
+ ' case "$arg" in' \
76
+ ' -*) continue ;;' \
77
+ ' esac' \
78
+ ' # Skip if already in apt.txt' \
79
+ ' if ! grep -qx "$arg" "$APT_FILE"; then' \
80
+ ' echo "$arg" >> "$APT_FILE"' \
81
+ ' echo "βœ“ $arg saved to apt.txt"' \
82
+ ' fi' \
83
+ ' done' \
84
  ' fi' \
85
+ ' exit $STATUS' \
86
+ 'fi' \
87
+ '# For all other apt commands (update, remove, etc) just pass through' \
88
+ '"$REAL_BIN" "$@"' \
89
+ > /usr/local/bin/_apt_wrapper && \
90
+ chmod +x /usr/local/bin/_apt_wrapper
91
+
92
+ # apt wrapper
93
+ RUN printf '%s\n' \
94
+ '#!/bin/sh' \
95
+ 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt "$@"' \
96
+ > /usr/local/bin/apt && \
97
+ chmod +x /usr/local/bin/apt
98
+
99
+ # apt-get wrapper
100
+ RUN printf '%s\n' \
101
+ '#!/bin/sh' \
102
+ 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt-get "$@"' \
103
+ > /usr/local/bin/apt-get && \
104
+ chmod +x /usr/local/bin/apt-get
105
 
106
  # ── Ensure /data exists ───────────────────────────────────────────────────────
107
  RUN mkdir -p /data
 
138
  '' \
139
  'rm -f /data/persist/venv/lib/python*/EXTERNALLY-MANAGED' \
140
  '' \
141
+ '# Write real venv path to every shell automatically' \
142
+ 'cat > /etc/profile.d/venv.sh << EOF' \
143
  'export VIRTUAL_ENV=/data/persist/venv' \
144
  'export PATH="/data/persist/venv/bin:$PATH"' \
145
+ 'EOF' \
146
  '' \
147
+ 'grep -qx "source /etc/profile.d/venv.sh" /root/.bashrc || echo "source /etc/profile.d/venv.sh" >> /root/.bashrc' \
148
+ '' \
149
+ 'export VIRTUAL_ENV=/data/persist/venv' \
150
+ 'export PATH="/data/persist/venv/bin:$PATH"' \
151
+ '' \
152
+ '# ── apt.txt: reinstall saved packages on every restart ───────────────' \
153
  'APT_FILE="/data/apt.txt"' \
154
+ 'if [ ! -f "$APT_FILE" ]; then touch "$APT_FILE"; fi' \
 
 
155
  'if [ -s "$APT_FILE" ]; then' \
156
+ ' echo "β–Ά Installing packages from apt.txt..."' \
157
+ ' /usr/bin/apt-get update -qq' \
158
  ' while IFS= read -r pkg || [ -n "$pkg" ]; do' \
159
  ' pkg=$(echo "$pkg" | tr -d "[:space:]")' \
160
  ' [ -z "$pkg" ] && continue' \
161
  ' [ "${pkg#\#}" != "$pkg" ] && continue' \
162
+ ' /usr/bin/apt-get install -y --no-install-recommends "$pkg" \' \
163
+ ' && echo "βœ“ $pkg" \' \
164
+ ' || echo "WARNING: Failed to install $pkg"' \
165
  ' done < "$APT_FILE"' \
166
  ' rm -rf /var/lib/apt/lists/*' \
167
  'fi' \