File size: 6,314 Bytes
04d40ec
 
e24259d
 
04d40ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e24259d
 
04d40ec
 
 
 
 
e24259d
 
04d40ec
e24259d
 
04d40ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# ── Base image ────────────────────────────────────────────────────────────────
FROM node:20-slim


# ── System dependencies ───────────────────────────────────────────────────────
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y --no-install-recommends \
        python3 \
        python3-pip \
        python3-venv \
        make \
        g++ \
        wget \
        curl \
        git \
        neofetch \
        mediainfo \
        screen \
        nano \
        rsync \
    && rm -rf /var/lib/apt/lists/*


# ── Generate a unique 64-char Machine ID ─────────────────────────────────────
# This creates a valid, random 64-character hex string (SHA-256 format)
RUN mkdir -p /var/lib/dbus && \
    head -c 512 /dev/urandom | sha256sum | cut -d' ' -f1 > /etc/machine-id && \
    cp /etc/machine-id /var/lib/dbus/machine-id


USER root


# ── Set HOME and PATH ─────────────────────────────────────────────────────────
ENV HOME=/root \
    PATH="/root/venv/bin:/usr/local/bin:${PATH}" \
    VIRTUAL_ENV=/root/venv \
    PIP_NO_CACHE_DIR=1 \
    HOSTNAME=kanha


# ── Install shellular globally ────────────────────────────────────────────────
RUN npm install -g --prefix /usr/local shellular


# ── Create Python venv ────────────────────────────────────────────────────────
RUN python3 -m venv /root/venv && \
    /root/venv/bin/pip install --upgrade pip && \
    /root/venv/bin/pip install huggingface_hub && \
    rm -f /root/venv/lib/python*/EXTERNALLY-MANAGED


# ── Shell config ──────────────────────────────────────────────────────────────
RUN echo 'export PS1="\u@kanha:\w\$ "' >> /root/.bashrc && \
    echo 'cd /data' >> /root/.bashrc && \
    echo 'cd /data' >> /root/.bash_profile


# ── Force pip/python β†’ always use /root/venv ─────────────────────────────────
RUN printf '%s\n' '#!/bin/sh' 'exec /root/venv/bin/pip "$@"'     > /usr/local/bin/pip     && chmod +x /usr/local/bin/pip     && \
    printf '%s\n' '#!/bin/sh' 'exec /root/venv/bin/pip3 "$@"'    > /usr/local/bin/pip3    && chmod +x /usr/local/bin/pip3    && \
    printf '%s\n' '#!/bin/sh' 'exec /root/venv/bin/python "$@"'  > /usr/local/bin/python  && chmod +x /usr/local/bin/python  && \
    printf '%s\n' '#!/bin/sh' 'exec /root/venv/bin/python3 "$@"' > /usr/local/bin/python3 && chmod +x /usr/local/bin/python3


# ── apt/apt-get wrapper β†’ saves installed packages to /data/apt.txt ──────────
RUN printf '%s\n' \
    '#!/bin/sh' \
    'APT_FILE="/data/apt.txt"' \
    'REAL_BIN="$1"' \
    'shift' \
    'if [ "$1" = "install" ]; then' \
    '    shift' \
    '    "$REAL_BIN" install "$@"' \
    '    STATUS=$?' \
    '    if [ $STATUS -eq 0 ]; then' \
    '        touch "$APT_FILE"' \
    '        for arg in "$@"; do' \
    '            case "$arg" in -*) continue ;; esac' \
    '            if ! grep -qx "$arg" "$APT_FILE"; then' \
    '                echo "$arg" >> "$APT_FILE"' \
    '            fi' \
    '        done' \
    '    fi' \
    '    exit $STATUS' \
    'fi' \
    '"$REAL_BIN" "$@"' \
    > /usr/local/bin/_apt_wrapper && chmod +x /usr/local/bin/_apt_wrapper


RUN printf '%s\n' '#!/bin/sh' 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt "$@"' \
    > /usr/local/bin/apt && chmod +x /usr/local/bin/apt
RUN printf '%s\n' '#!/bin/sh' 'exec /usr/local/bin/_apt_wrapper /usr/bin/apt-get "$@"' \
    > /usr/local/bin/apt-get && chmod +x /usr/local/bin/apt-get


# ── Create entrypoint script ──────────────────────────────────────────────────
RUN printf '%s\n' \
    '#!/bin/sh' \
    'set -e' \
    'exec "$@"' \
    > /usr/local/bin/docker-entrypoint.sh && \
    chmod +x /usr/local/bin/docker-entrypoint.sh


# ── Ensure /data exists ───────────────────────────────────────────────────────
RUN mkdir -p /data


# ── Git safe directory fix ────────────────────────────────────────────────────
RUN git config --system --add safe.directory '*'


# ── App ───────────────────────────────────────────────────────────────────────
# Note: Ensure package.json exists in your build context
COPY package*.json /root/app/
RUN cd /root/app && npm install --omit=dev
COPY . /root/app/


# ── Runtime ───────────────────────────────────────────────────────────────────
WORKDIR /data
EXPOSE 7860
ENV PORT=7860
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]


CMD ["bash", "-c", "\
    { \
        chown -R root:root /data 2>/dev/null; \
        chmod -R 755 /data 2>/dev/null; \
        git config --global --add safe.directory '*' 2>/dev/null; \
        if [ -f /data/apt.txt ]; then \
            apt-get update -qq 2>/dev/null; \
            while IFS= read -r pkg || [ -n \"$pkg\" ]; do \
                [ -z \"$pkg\" ] && continue; \
                apt-get install -y -qq \"$pkg\" 2>/dev/null || true; \
            done < /data/apt.txt; \
        fi \
    } & \
    exec node /root/app/app.js"]