@@ -18,25 +18,37 @@ RUN apt update && \
1818 curl
1919
2020
21- # Install Java 24.x
22- # http://jdk.java.net/24/
21+ # Install Go 1.26.x
22+ # https://go.dev/dl/
23+ RUN cd /tmp && \
24+ curl --remote-name --location https://go.dev/dl/go1.26.8.linux-${BUILDARCH}.tar.gz && \
25+ tar xzf go1.26.8.linux-${BUILDARCH}.tar.gz && \
26+ rm --force go1.26.8.linux-${BUILDARCH}.tar.gz && \
27+ mv go /opt/ && \
28+ mkdir --parent /opt/bin && \
29+ ln --symbolic /opt/go/bin/* /opt/bin/ && \
30+ chmod a+rx /opt/bin/*
31+
32+
33+ # Install Java 25.x
34+ # https://jdk.java.net/25/
2335RUN cd /tmp && \
2436 if [ "$BUILDARCH" = "arm64" ]; then ARCH="aarch64" ; else ARCH="x64" ; fi && \
25- curl --remote-name https://download.java.net/java/GA/jdk24 .0.2/fdc5d0102fe0414db21410ad5834341f/12 /GPL/openjdk-24 .0.2_linux-${ARCH}_bin.tar.gz && \
26- tar xzf openjdk-24 .0.2_linux-${ARCH}_bin.tar.gz && \
27- rm --force openjdk-24 .0.2_linux-${ARCH}_bin.tar.gz && \
28- mv jdk-24 .0.2 /opt/jdk && \
37+ curl --remote-name https://download.java.net/java/GA/jdk25 .0.2/b1e0dfa218384cb9959bdcb897162d4e/10 /GPL/openjdk-25 .0.2_linux-${ARCH}_bin.tar.gz && \
38+ tar xzf openjdk-25 .0.2_linux-${ARCH}_bin.tar.gz && \
39+ rm --force openjdk-25 .0.2_linux-${ARCH}_bin.tar.gz && \
40+ mv jdk-25 .0.2 /opt/jdk && \
2941 mkdir --parent /opt/bin && \
3042 ln --symbolic /opt/jdk/bin/* /opt/bin/ && \
3143 chmod a+rx /opt/bin/*
3244
3345
34- # Install Node.js 22 .x
46+ # Install Node.js 24 .x
3547# https://nodejs.dev/en/download/
3648# https://github.com/tj/n#installation
3749RUN curl --location https://raw.githubusercontent.com/tj/n/master/bin/n --output /usr/local/bin/n && \
3850 chmod a+x /usr/local/bin/n && \
39- n 22.21.1
51+ n 24.20.0
4052
4153
4254# Install Node.js packages
@@ -64,22 +76,22 @@ RUN apt update && \
6476# Install Python 3.13.x
6577# https://www.python.org/downloads/
6678RUN cd /tmp && \
67- curl --remote-name https://www.python.org/ftp/python/3.13.11 /Python-3.13.11 .tgz && \
68- tar xzf Python-3.13.11 .tgz && \
69- rm --force Python-3.13.11 .tgz && \
70- cd Python-3.13.11 && \
79+ curl --remote-name https://www.python.org/ftp/python/3.13.15 /Python-3.13.15 .tgz && \
80+ tar xzf Python-3.13.15 .tgz && \
81+ rm --force Python-3.13.15 .tgz && \
82+ cd Python-3.13.15 && \
7183 CFLAGS="-Os" ./configure --disable-static --enable-optimizations --enable-shared --with-lto --without-tests && \
7284 ./configure && \
7385 make && \
7486 make install && \
7587 cd .. && \
76- rm --force --recursive Python-3.13.11 && \
88+ rm --force --recursive Python-3.13.15 && \
7789 ln --relative --symbolic /usr/local/bin/pip3 /usr/local/bin/pip && \
7890 ln --relative --symbolic /usr/local/bin/python3 /usr/local/bin/python && \
7991 pip3 install --no-cache-dir --upgrade pip
8092
8193
82- # Install Ruby 3.4 .x
94+ # Install Ruby 4.0 .x
8395# https://www.ruby-lang.org/en/downloads/
8496# https://bugs.ruby-lang.org/issues/20085#note-5
8597RUN apt update && \
@@ -89,42 +101,42 @@ RUN apt update && \
89101 apt clean && \
90102 rm --force --recursive /var/lib/apt/lists/* && \
91103 cd /tmp && \
92- curl https://cache.ruby-lang.org/pub/ruby/3.4 /ruby-3.4.8. tar.gz --output ruby-3.4.8 .tar.gz && \
93- tar xzf ruby-3.4.8 .tar.gz && \
94- rm --force ruby-3.4.8 .tar.gz && \
95- cd ruby-3.4.8 && \
104+ curl https://cache.ruby-lang.org/pub/ruby/4.0 /ruby-4.0.6. tar.gz --output ruby-4.0.6 .tar.gz && \
105+ tar xzf ruby-4.0.6 .tar.gz && \
106+ rm --force ruby-4.0.6 .tar.gz && \
107+ cd ruby-4.0.6 && \
96108 if [ "$BUILDARCH" = "arm64" ]; then ASFLAGS=-mbranch-protection=pac-ret; else ASFLAGS=; fi && \
97109 ASFLAGS=${ASFLAGS} CFLAGS=-Os ./configure --disable-install-doc --enable-load-relative && \
98110 make && \
99111 make install && \
100112 cd .. && \
101- rm --force --recursive ruby-3.4.8
113+ rm --force --recursive ruby-4.0.6
102114
103115
104116# Install Ruby packages
105117RUN echo "gem: --no-document" > /etc/gemrc && \
106- gem install \
118+ gem update --system 4.0.20 && \
119+ gem install --force \
107120 jekyll \
108- minitest `# So that Bundler needn't install` \
109121 pygments.rb \
110122 specific_install && \
111123 gem specific_install https://github.com/cs50/jekyll-theme-cs50 develop && \
112124 gem cleanup
113125
114126
115- # Install SQLite 3.4x
127+ # Install SQLite 3.5x
116128# https://www.sqlite.org/download.html
117129# https://www.sqlite.org/howtocompile.html#compiling_the_command_line_interface
118130COPY shell.c.patch /tmp
119131RUN cd /tmp && \
120- curl --remote-name https://www.sqlite.org/2025 /sqlite-amalgamation-3510100 .zip && \
121- unzip sqlite-amalgamation-3510100 .zip && \
122- rm --force sqlite-amalgamation-3510100 .zip && \
123- cd sqlite-amalgamation-3510100 && \
132+ curl --remote-name https://www.sqlite.org/2026 /sqlite-amalgamation-3530400 .zip && \
133+ unzip sqlite-amalgamation-3530400 .zip && \
134+ rm --force sqlite-amalgamation-3530400 .zip && \
135+ cd sqlite-amalgamation-3530400 && \
124136 patch shell.c < /tmp/shell.c.patch && \
125137 gcc -D HAVE_READLINE -D SQLITE_DEFAULT_FOREIGN_KEYS=1 -D SQLITE_OMIT_DYNAPROMPT=1 shell.c sqlite3.c -lpthread -ldl -lm -lreadline -lncurses -o /usr/local/bin/sqlite3 && \
126138 cd .. && \
127- rm --force --recursive sqlite-amalgamation-3510100 && \
139+ rm --force --recursive sqlite-amalgamation-3530400 && \
128140 rm --force /tmp/shell.c.patch
129141
130142
@@ -229,6 +241,30 @@ RUN curl https://packagecloud.io/install/repositories/cs50/repo/script.deb.sh |
229241 libcs50
230242
231243
244+ # Install Python packages
245+ RUN pip3 install --no-cache-dir \
246+ autopep8 \
247+ cachelib \
248+ "check50<4" \
249+ cli50 \
250+ compare50 \
251+ cs50==9.5.0 \
252+ Flask \
253+ Flask-Session \
254+ pytest \
255+ render50 \
256+ setuptools \
257+ "style50>=3.0.0" \
258+ "submit50<4" \
259+ lib50
260+
261+
262+ # Install BFG
263+ # https://rtyley.github.io/bfg-repo-cleaner/
264+ RUN mkdir --parents /opt/share && \
265+ curl --location https://repo1.maven.org/maven2/com/madgag/bfg/1.15.0/bfg-1.15.0.jar --output /opt/share/bfg.jar
266+
267+
232268# Install Docker CLI
233269# https://docs.docker.com/engine/install/ubuntu/
234270# https://docs.docker.com/engine/install/linux-postinstall/
@@ -247,29 +283,15 @@ RUN apt update && \
247283 groupadd docker
248284
249285
250- # Install BFG
251- # https://rtyley.github.io/bfg-repo-cleaner/
252- RUN mkdir --parents /opt/share && \
253- curl --location https://repo1.maven.org/maven2/com/madgag/bfg/1.15.0/bfg-1.15.0.jar --output /opt/share/bfg.jar
254-
286+ # Install GitHub CLI
287+ # https://github.com/cli/cli/blob/trunk/docs/install_linux.md#debian
288+ RUN cd /tmp && \
289+ curl --remote-name https://cli.github.com/packages/githubcli-archive-keyring.gpg && \
290+ mv githubcli-archive-keyring.gpg /etc/apt/keyrings/ && \
291+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \
292+ apt update && \
293+ apt install gh --no-install-recommends --no-install-suggests --yes
255294
256- # Install Python packages
257- RUN pip3 install --no-cache-dir \
258- autopep8 \
259- cachelib \
260- "check50<4" \
261- cli50 \
262- compare50 \
263- cs50==9.4.0 \
264- Flask \
265- Flask-Session \
266- pytest \
267- render50 \
268- setuptools \
269- "style50>2.10.0" \
270- "submit50<4" \
271- lib50
272-
273295
274296# Copy files to image
275297COPY ./etc /etc
0 commit comments