-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathDockerfile
163 lines (131 loc) · 4.39 KB
/
Dockerfile
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#
# nut Dockerfile
#
# https://github.com/shawly/docker-nut
#
# Set python image version
ARG PYTHON_VERSION=3.10-alpine3.19
# Set vars for s6 overlay
ARG S6_OVERLAY_VERSION=v2.2.0.3
ARG S6_OVERLAY_BASE_URL=https://github.com/just-containers/s6-overlay/releases/download/${S6_OVERLAY_VERSION}
# Set NUT vars
ARG NUT_BRANCH=heads/master
ARG NUT_RELEASE=https://github.com/blawar/nut/archive/refs/${NUT_BRANCH}.tar.gz
ARG TITLEDB_URL=https://github.com/blawar/titledb
# Set base images with s6 overlay download variable (necessary for multi-arch building via GitHub workflows)
FROM python:${PYTHON_VERSION} as python-amd64
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_BASE_URL
ENV S6_OVERLAY_RELEASE="${S6_OVERLAY_BASE_URL}/s6-overlay-amd64.tar.gz"
FROM python:${PYTHON_VERSION} as python-386
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_BASE_URL
ENV S6_OVERLAY_RELEASE="${S6_OVERLAY_BASE_URL}/s6-overlay-x86.tar.gz"
FROM python:${PYTHON_VERSION} as python-armv6
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_BASE_URL
ENV S6_OVERLAY_RELEASE="${S6_OVERLAY_BASE_URL}/s6-overlay-armhf.tar.gz"
FROM python:${PYTHON_VERSION} as python-armv7
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_BASE_URL
ENV S6_OVERLAY_RELEASE="${S6_OVERLAY_BASE_URL}/s6-overlay-arm.tar.gz"
FROM python:${PYTHON_VERSION} as python-arm64
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_BASE_URL
ENV S6_OVERLAY_RELEASE="${S6_OVERLAY_BASE_URL}/s6-overlay-aarch64.tar.gz"
FROM python:${PYTHON_VERSION} as python-ppc64le
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_BASE_URL
ENV S6_OVERLAY_RELEASE="${S6_OVERLAY_BASE_URL}/s6-overlay-ppc64le.tar.gz"
# Build nut
FROM python-${TARGETARCH:-amd64}${TARGETVARIANT} as builder
ARG NUT_RELEASE
# Change working dir
WORKDIR /nut
# Install build deps and install python dependencies
RUN \
set -ex && \
echo "Installing build dependencies..." && \
apk add --no-cache \
git \
build-base \
libusb-dev \
libffi-dev \
curl-dev \
jpeg-dev \
cargo \
rust \
zlib-dev && \
echo "Fixing armv6 and armv7 build by cloning cargo index manually" && \
git clone --bare https://github.com/rust-lang/crates.io-index.git ~/.cargo/registry/index/github.com-1285ae84e5963aae
# Download NUT
ADD ${NUT_RELEASE} /tmp/nut.tar.gz
# Build venv
RUN \
set -ex && \
echo "Extracting nut..." && \
tar xzf /tmp/nut.tar.gz --strip-components=1 -C /nut && \
echo "Upgrading pip..." && \
pip3 install --upgrade pip && \
echo "Removing pyqt5 from requirements.txt since we have no gui..." && \
sed -i '/pyqt5/d' requirements.txt && \
sed -i '/qt-range-slider/d' requirements.txt && \
echo "Upgrading pip..." && \
pip3 install --upgrade pip && \
echo "Setup venv..." && \
pip3 install virtualenv && \
python3 -m venv venv && \
source venv/bin/activate && \
echo "Building wheels for requirements..." && \
pip3 install -r requirements.txt && \
echo "Creating volume directories..." && \
mv -v conf conf_template && \
mkdir -p conf _NSPOUT titles titledb && \
echo "Cleaning up directories..." && \
rm -rf .github windows_driver gui tests tests-gui images && \
rm -f .coveragerc .editorconfig .gitignore .pep8 .pylintrc .pre-commit-config.yaml \
autoformat nut.pyproj nut.sln nut_gui.py tasks.py requirements_dev.txt setup.cfg pytest.ini *.md
# Setup nut image
FROM python-${TARGETARCH:-amd64}${TARGETVARIANT}
ARG TITLEDB_URL
ENV UMASK=022 \
FIX_OWNERSHIP=true \
PATH="/nut/venv/bin:$PATH" \
NUT_API_SCHEDULES='[{"scan": "0/30 * * * *"},{"updateDb": "22 0/6 * * *"}]'
# Download S6 Overlay
ADD ${S6_OVERLAY_RELEASE} /tmp/s6overlay.tar.gz
# Copy wheels & crafty-web
COPY --chown=1000:1000 --from=builder /nut /nut
# Change working dir
WORKDIR /nut
# Install deps and build binary
RUN \
set -ex && \
echo "Installing runtime dependencies..." && \
apk add --no-cache \
bash \
curl \
shadow \
coreutils \
libjpeg-turbo \
tzdata \
diffutils \
sed \
jq \
git && \
echo "Extracting s6 overlay..." && \
tar xzf /tmp/s6overlay.tar.gz -C / && \
echo "Creating nut user..." && \
useradd -u 1000 -U -M -s /bin/false nut && \
usermod -G users nut && \
echo "Cleaning up directories..." && \
rm -f /usr/bin/register && \
rm -rf /tmp/*
# Add files
COPY rootfs/ /
# Define mountable directories
VOLUME ["/nut/titles", "/nut/conf", "/nut/_NSPOUT"]
# Expose ports
EXPOSE 9000
# Start s6
ENTRYPOINT ["/init"]