File size: 6,420 Bytes
a432725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96d37b1
285250b
a432725
 
 
 
 
 
 
 
 
 
96d37b1
 
 
 
a432725
285250b
a432725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96d37b1
a432725
 
96d37b1
 
 
 
a432725
 
96d37b1
 
 
 
a432725
 
 
 
285250b
 
 
a432725
 
 
285250b
a432725
 
 
 
285250b
a432725
 
 
 
285250b
 
96d37b1
 
 
 
 
 
 
 
 
 
 
 
 
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
# ── 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/*

# ── Install bore ──────────────────────────────────────────────────────────────
# ── Pin a stable machine-id ───────────────────────────────────────────────────
RUN echo "d8904b4d338adf83688caac869f64c0b" > /etc/machine-id && \
    mkdir -p /var/lib/dbus && \
    echo "d8904b4d338adf83688caac869f64c0b" > /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 ───────────────────────────────────────────────────────────────────────
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"]