@@ -13,11 +13,63 @@ USERNAME="${USERNAME:-"${_REMOTE_USER:-"automatic"}"}"
13
13
UPDATE_RC=" ${UPDATE_RC:- " true" } "
14
14
CONDA_DIR=" ${CONDA_DIR:- " /usr/local/conda" } "
15
15
16
- set -eux
16
+ set -euo pipefail
17
17
export DEBIAN_FRONTEND=noninteractive
18
18
19
+ # Detect package manager and set install command
20
+ detect_package_manager () {
21
+ if command -v apt-get > /dev/null; then
22
+ PKG_MANAGER=" apt-get"
23
+ PKG_UPDATE=" apt-get update -y"
24
+ PKG_INSTALL=" apt-get -y install --no-install-recommends"
25
+ PKG_CLEAN=" apt-get -y clean"
26
+ PKG_LISTS=" /var/lib/apt/lists/*"
27
+ PKG_QUERY=" dpkg -s"
28
+ elif command -v apk > /dev/null; then
29
+ PKG_MANAGER=" apk"
30
+ PKG_UPDATE=" apk update"
31
+ PKG_INSTALL=" apk add --no-cache"
32
+ PKG_CLEAN=" rm -rf /var/cache/apk/*"
33
+ PKG_LISTS=" /var/cache/apk/*"
34
+ PKG_QUERY=" apk info -e"
35
+ elif command -v dnf > /dev/null; then
36
+ PKG_MANAGER=" dnf"
37
+ PKG_UPDATE=" dnf -y makecache"
38
+ PKG_INSTALL=" dnf -y install"
39
+ PKG_CLEAN=" dnf clean all"
40
+ PKG_LISTS=" /var/cache/dnf/*"
41
+ PKG_QUERY=" rpm -q"
42
+ elif command -v microdnf > /dev/null; then
43
+ PKG_MANAGER=" microdnf"
44
+ PKG_UPDATE=" microdnf update"
45
+ PKG_INSTALL=" microdnf install -y"
46
+ PKG_CLEAN=" microdnf clean all"
47
+ PKG_LISTS=" /var/cache/yum/*"
48
+ PKG_QUERY=" rpm -q"
49
+ elif command -v tdnf > /dev/null; then
50
+ PKG_MANAGER=" tdnf"
51
+ PKG_UPDATE=" tdnf makecache"
52
+ PKG_INSTALL=" tdnf install -y"
53
+ PKG_CLEAN=" tdnf clean all"
54
+ PKG_LISTS=" /var/cache/tdnf/*"
55
+ PKG_QUERY=" rpm -q"
56
+ elif command -v yum > /dev/null; then
57
+ PKG_MANAGER=" yum"
58
+ PKG_UPDATE=" yum -y makecache"
59
+ PKG_INSTALL=" yum -y install"
60
+ PKG_CLEAN=" yum clean all"
61
+ PKG_LISTS=" /var/cache/yum/*"
62
+ PKG_QUERY=" rpm -q"
63
+ else
64
+ echo " No supported package manager found (apt-get, apk, dnf, microdnf, tdnf, yum)."
65
+ exit 1
66
+ fi
67
+ }
68
+
69
+ detect_package_manager
70
+
19
71
# Clean up
20
- rm -rf /var/lib/apt/lists/ *
72
+ eval " $PKG_CLEAN "
21
73
22
74
if [ " $( id -u) " -ne 0 ]; then
23
75
echo -e ' Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
@@ -47,7 +99,12 @@ elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then
47
99
fi
48
100
49
101
architecture=" $( uname -m) "
50
- if [ " ${architecture} " != " x86_64" ]; then
102
+ # Normalize arm64 to aarch64 for consistency
103
+ if [ " ${architecture} " = " arm64" ]; then
104
+ architecture=" aarch64"
105
+ fi
106
+
107
+ if [ " ${architecture} " != " x86_64" ] && [ " ${architecture} " != " aarch64" ]; then
51
108
echo " (!) Architecture $architecture unsupported"
52
109
exit 1
53
110
fi
@@ -66,12 +123,76 @@ updaterc() {
66
123
67
124
# Checks if packages are installed and installs them if not
68
125
check_packages () {
69
- if ! dpkg -s " $@ " > /dev/null 2>&1 ; then
70
- if [ " $( find /var/lib/apt/lists/* | wc -l) " = " 0" ]; then
71
- echo " Running apt-get update..."
72
- apt-get update -y
126
+ for pkg in " $@ " ; do
127
+ # Use PKG_QUERY variable to check if package is installed
128
+ if ! eval " $PKG_QUERY $pkg " > /dev/null 2>&1 ; then
129
+ # Package not installed, check if we need to update package lists
130
+ if [ " $PKG_MANAGER " = " apt-get" ]; then
131
+ # For apt-get, check if package lists are empty
132
+ if [ " $( find " $PKG_LISTS " | wc -l) " = " 0" ]; then
133
+ echo " Running $PKG_UPDATE ..."
134
+ eval " $PKG_UPDATE "
135
+ fi
136
+ else
137
+ # For other package managers, always update before installing
138
+ echo " Running $PKG_UPDATE ..."
139
+ eval " $PKG_UPDATE "
140
+ fi
141
+
142
+ # Install the package
143
+ echo " Installing package: $pkg "
144
+ eval " $PKG_INSTALL $pkg "
145
+ else
146
+ echo " Package $pkg is already installed"
73
147
fi
74
- apt-get -y install --no-install-recommends " $@ "
148
+ done
149
+ }
150
+
151
+ sudo_if () {
152
+ COMMAND=" $* "
153
+ if [ " $( id -u) " -eq 0 ] && [ " $USERNAME " != " root" ]; then
154
+ if command -v runuser > /dev/null; then
155
+ runuser -l " $USERNAME " -c " $COMMAND "
156
+ elif command -v su > /dev/null; then
157
+ su - " $USERNAME " -c " $COMMAND "
158
+ elif command -v sudo > /dev/null; then
159
+ sudo -u " $USERNAME " -i bash -c " $COMMAND "
160
+ else
161
+ # Fallback: execute as root (not ideal but works in containers)
162
+ echo " Warning: No user switching command available, running as root"
163
+ eval " $COMMAND "
164
+ fi
165
+ else
166
+ eval " $COMMAND "
167
+ fi
168
+ }
169
+
170
+ run_as_user () {
171
+ local user=" $1 "
172
+ shift
173
+ local cmd=" $* "
174
+
175
+ if command -v runuser > /dev/null; then
176
+ if [ " $PKG_MANAGER " = " apk" ]; then
177
+ runuser " $user " -c " $cmd "
178
+ else
179
+ runuser -l " $user " -c " $cmd "
180
+ fi
181
+ elif command -v su > /dev/null; then
182
+ if [ " $PKG_MANAGER " = " apk" ]; then
183
+ su " $user " -c " $cmd "
184
+ else
185
+ su --login -c " $cmd " " $user "
186
+ fi
187
+ elif command -v sudo > /dev/null; then
188
+ if [ " $PKG_MANAGER " = " apk" ]; then
189
+ sudo -u " $user " sh -c " $cmd "
190
+ else
191
+ sudo -u " $user " -i bash -c " $cmd "
192
+ fi
193
+ else
194
+ echo " Warning: No user switching command available, running as root"
195
+ eval " $cmd "
75
196
fi
76
197
}
77
198
@@ -83,30 +204,46 @@ if ! conda --version &> /dev/null ; then
83
204
usermod -a -G conda " ${USERNAME} "
84
205
85
206
# Install dependencies
86
- check_packages wget ca-certificates
207
+ if [ " $PKG_MANAGER " = " apt-get" ]; then
208
+ check_packages wget ca-certificates libgtk-3-0
209
+ elif [ " $PKG_MANAGER " = " apk" ]; then
210
+ check_packages wget ca-certificates gtk+3.0
211
+ else
212
+ check_packages wget ca-certificates gtk3
213
+ fi
87
214
88
215
mkdir -p $CONDA_DIR
216
+
89
217
chown -R " ${USERNAME} :conda" " ${CONDA_DIR} "
90
- chmod -R g+r+w " ${CONDA_DIR} "
91
-
92
- find " ${CONDA_DIR} " -type d -print0 | xargs -n 1 -0 chmod g+s
218
+ chmod -R g+r+w " ${CONDA_DIR} "
219
+
93
220
echo " Installing Anaconda..."
94
221
95
222
CONDA_VERSION=$VERSION
96
223
if [ " ${VERSION} " = " latest" ] || [ " ${VERSION} " = " lts" ]; then
97
- CONDA_VERSION=" 2021.11 "
224
+ CONDA_VERSION=" 2024.10-1 "
98
225
fi
99
226
100
- su --login -c " export http_proxy=${http_proxy:- } && export https_proxy=${https_proxy:- } \
101
- && wget -q https://repo.anaconda.com/archive/Anaconda3-${CONDA_VERSION} -Linux-x86_64.sh -O /tmp/anaconda-install.sh \
102
- && /bin/bash /tmp/anaconda-install.sh -u -b -p ${CONDA_DIR} " ${USERNAME} 2>&1
227
+ if [ " ${architecture} " = " x86_64" ]; then
228
+ run_as_user " ${USERNAME} " " export http_proxy=${http_proxy:- } && export https_proxy=${https_proxy:- } \
229
+ && wget -q https://repo.anaconda.com/archive/Anaconda3-${CONDA_VERSION} -Linux-x86_64.sh -O /tmp/anaconda-install.sh \
230
+ && /bin/bash /tmp/anaconda-install.sh -u -b -p ${CONDA_DIR} "
231
+ elif [ " ${architecture} " = " aarch64" ]; then
232
+ run_as_user " ${USERNAME} " " export http_proxy=${http_proxy:- } && export https_proxy=${https_proxy:- } \
233
+ && wget -q https://repo.anaconda.com/archive/Anaconda3-${CONDA_VERSION} -Linux-aarch64.sh -O /tmp/anaconda-install.sh \
234
+ && /bin/bash /tmp/anaconda-install.sh -u -b -p ${CONDA_DIR} "
235
+ fi
103
236
104
237
if [ " ${VERSION} " = " latest" ] || [ " ${VERSION} " = " lts" ]; then
105
238
PATH=$PATH :${CONDA_DIR} /bin
106
239
conda update -y conda
107
240
fi
108
241
109
- rm /tmp/anaconda-install.sh
242
+ chown -R " ${USERNAME} :conda" " ${CONDA_DIR} "
243
+ chmod -R g+r+w " ${CONDA_DIR} "
244
+
245
+
246
+ rm /tmp/anaconda-install.sh
110
247
updaterc " export CONDA_DIR=${CONDA_DIR} /bin"
111
248
fi
112
249
@@ -135,7 +272,6 @@ if [ -f "/etc/bash.bashrc" ]; then
135
272
echo " ${notice_script} " | tee -a /etc/bash.bashrc
136
273
fi
137
274
138
- # Clean up
139
- rm -rf /var/lib/apt/lists/*
140
-
275
+ # Final clean up
276
+ eval " $PKG_CLEAN "
141
277
echo " Done!"
0 commit comments