-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDockerfile-ubuntu-24.04
235 lines (179 loc) · 10.2 KB
/
Dockerfile-ubuntu-24.04
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
FROM ubuntu:24.04 AS build
ARG TARGETOS
ARG TARGETARCH
ARG RUNNER_IMAGE_VERSION=20250302.1
ENV DEBIAN_FRONTEND=noninteractive
ENV RUNNER_MANUALLY_TRAP_SIG=1
ENV ACTIONS_RUNNER_PRINT_LOG_TO_STDOUT=1
ENV ImageOS=ubuntu24
# Install base packages required by GitHub's Runner Image scripts
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates git curl wget sudo gnupg lsb-release openssl software-properties-common apt-utils snap netcat-traditional \
&& rm -rf /var/lib/apt/lists/*
# Disable systemctl and journalctl by aliasing them to a dummy echo
RUN rm /usr/bin/systemctl \
&& ln -s /usr/bin/echo /usr/bin/systemctl \
&& rm /usr/bin/journalctl \
&& ln -s /usr/bin/echo /usr/bin/journalctl
# Fine-tune environment to match GitHub image
RUN mkdir /etc/cloud/templates && touch /.dockerenv
ARG IMAGE_FOLDER=/imagegeneration
RUN mkdir ${IMAGE_FOLDER} && chmod 777 ${IMAGE_FOLDER}
# Define user and grant sudo rights
RUN adduser --disabled-password --gecos "" --uid 1001 runner \
&& usermod -aG sudo runner \
&& echo "%sudo ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers \
&& echo "Defaults env_keep += \"DEBIAN_FRONTEND\"" >> /etc/sudoers
ENV SUDO_USER=runner
USER runner
WORKDIR /tmp
RUN curl -f -L -o runner-image.tar.gz https://github.com/actions/runner-images/archive/refs/tags/$ImageOS/${RUNNER_IMAGE_VERSION}.tar.gz \
&& tar xzf ./runner-image.tar.gz \
&& rm runner-image.tar.gz
ARG PATH_ROOT=runner-images-$ImageOS-${RUNNER_IMAGE_VERSION}/images/ubuntu/templates
RUN chmod +x ${PATH_ROOT}/../scripts/build/*.sh
ARG HELPER_SCRIPT_FOLDER=/imagegeneration/helpers
ENV HELPER_SCRIPTS=${HELPER_SCRIPT_FOLDER}
RUN cp -r ${PATH_ROOT}/../scripts/helpers ${HELPER_SCRIPT_FOLDER}
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-apt-mock.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-ms-repos.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-apt-sources.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-apt.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-limits.sh
ARG INSTALLER_SCRIPT_FOLDER=/imagegeneration/installers
RUN cp -r ${PATH_ROOT}/../scripts/build ${INSTALLER_SCRIPT_FOLDER}
RUN cp -r ${PATH_ROOT}/../assets/post-gen ${IMAGE_FOLDER}
RUN cp -r ${PATH_ROOT}/../scripts/tests ${IMAGE_FOLDER}
RUN cp -r ${PATH_ROOT}/../scripts/docs-gen ${IMAGE_FOLDER}
RUN cp -r ${PATH_ROOT}/../../../helpers/software-report-base ${IMAGE_FOLDER}/docs-gen/
RUN cp ${PATH_ROOT}/../toolsets/toolset-2404.json ${INSTALLER_SCRIPT_FOLDER}/toolset.json
RUN mv ${IMAGE_FOLDER}/docs-gen ${IMAGE_FOLDER}/SoftwareReport \
&& mv ${IMAGE_FOLDER}/post-gen ${IMAGE_FOLDER}/post-generation
ENV IMAGE_VERSION=${RUNNER_IMAGE_VERSION}
ENV IMAGEDATA_FILE=/imagegeneration/imagedata.json
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-image-data.sh
ENV IMAGE_OS=$ImageOS
# Adjust environment for Docker <-> VM differences
# 1. Create a dummy Azure Linux VM Agent config file
# 2. Create a dummy MOTD config file
# 3. Avoid modifying the real /etc/hosts as Docker prohibits this
RUN sudo touch /etc/waagent.conf \
&& sudo touch /etc/default/motd-news \
&& sed -i 's,/etc/hosts,/etc/hosts0,g' ${PATH_ROOT}/../scripts/build/configure-environment.sh \
&& sudo touch /etc/hosts0 \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-environment.sh
ENV INSTALLER_SCRIPT_FOLDER=${INSTALLER_SCRIPT_FOLDER}
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-apt-vital.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-powershell.sh
RUN sudo -E sh -c "pwsh -f ${PATH_ROOT}/../scripts/build/Install-PowerShellModules.ps1"
RUN sudo -E sh -c "pwsh -f ${PATH_ROOT}/../scripts/build/Install-PowerShellAzModules.ps1"
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-actions-cache.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-runner-package.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-apt-common.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-azcopy.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-azure-cli.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-azure-devops-cli.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-bicep.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-apache.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-aws-tools.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-clang.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-swift.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-cmake.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-codeql-bundle.sh
# Skip tests due to Docker <-> VM differences
RUN sed -i 's,invoke_tests,#invoke_tests,g' ${PATH_ROOT}/../scripts/build/install-container-tools.sh \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-container-tools.sh
# Make list of extracted sdk archives more specific to prevent accidentally picking up tar.gz files from other tools
RUN sed -i 's,*.tar.gz,dotnet-*.tar.gz,g' ${PATH_ROOT}/../scripts/build/install-dotnetcore-sdk.sh \
&& sudo mkdir -p /usr/share/dotnet/shared \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-dotnetcore-sdk.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-microsoft-edge.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-gcc-compilers.sh
# Skip tests due to Docker <-> VM differences
RUN sed -i 's,invoke_tests,#invoke_tests,g' ${PATH_ROOT}/../scripts/build/install-firefox.sh \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-firefox.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-gfortran.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-git.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-git-lfs.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-github-cli.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-google-chrome.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-haskell.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-java-tools.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-kubernetes-tools.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-miniconda.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-kotlin.sh
# Skip tests due to lack of systemd
RUN sed -i 's,invoke_tests,#invoke_tests,g' ${PATH_ROOT}/../scripts/build/install-mysql.sh \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-mysql.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-nginx.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-nodejs.sh
# Fix permissions in home directory
RUN sudo chown -R runner:runner /home/runner \
&& ${PATH_ROOT}/../scripts/build/install-bazel.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-php.sh
## Skip tests due to lack of systemd
RUN sed -i 's,invoke_tests,#invoke_tests,g' ${PATH_ROOT}/../scripts/build/install-postgresql.sh \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-postgresql.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-pulumi.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-ruby.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-rust.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-julia.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-selenium.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-packer.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-vcpkg.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-dpkg.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-yq.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-android-sdk.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-pypy.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-python.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-zstd.sh
# Prevent Docker startup and skip tests due to Docker <-> VM differences
RUN sed -i 's,docker info,#docker info,g' ${PATH_ROOT}/../scripts/build/install-docker.sh \
&& sed -i 's,invoke_tests,echo Skipping tests #invoke_tests,g' ${PATH_ROOT}/../scripts/build/install-docker.sh \
&& DOCKERHUB_PULL_IMAGES=no sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-docker.sh
# Add runner user to Docker Group
RUN sudo -E sh -c "usermod -aG docker runner"
RUN sudo -E sh -c "pwsh -f ${PATH_ROOT}/../scripts/build/Install-Toolset.ps1"
RUN sudo -E sh -c "pwsh -f ${PATH_ROOT}/../scripts/build/Configure-Toolset.ps1"
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-pipx-packages.sh
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/install-homebrew.sh
## Skip tests due to lack of systemd
RUN sed -i 's,snap set,#snap set,g' ${PATH_ROOT}/../scripts/build/configure-snap.sh \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-snap.sh
# Skip due to Docker <-> VM differences
# echo 'Reboot VM
# sudo reboot
# Skip due to Docker <-> VM differences
# pwsh -File ${IMAGE_FOLDER}/SoftwareReport/Generate-SoftwareReport.ps1 -OutputDirectory ${IMAGE_FOLDER}
# pwsh -File ${IMAGE_FOLDER}/tests/RunAll-Tests.ps1 -OutputDirectory ${IMAGE_FOLDER}
RUN sed -i 's,sed -i,echo disabled #sed -i,g' ${PATH_ROOT}/../scripts/build/configure-system.sh \
&& sudo -E sh -c ${PATH_ROOT}/../scripts/build/configure-system.sh
# Extract runner to get it ready to use
RUN sudo -E tar xzf /opt/runner-cache/actions-runner-linux-*.tar.gz -C /home/runner \
&& sudo -E sh -c "rm -Rf /opt/runner-cache"
RUN sudo -E sh -c ${PATH_ROOT}/../scripts/build/cleanup.sh
ENV HISTSIZE=0
COPY --chmod=555 entrypoint.sh /entrypoint.sh
COPY --chmod=555 start-docker.sh /start-docker.sh
COPY --chmod=555 job-started.sh /job-started.sh
COPY --chmod=555 job-completed.sh /job-completed.sh
FROM scratch AS image
ARG TARGETOS
ARG TARGETARCH
ARG RUNNER_IMAGE_VERSION
ENV DEBIAN_FRONTEND=noninteractive
ENV RUNNER_MANUALLY_TRAP_SIG=1
ENV ACTIONS_RUNNER_PRINT_LOG_TO_STDOUT=1
ENV ImageOS=ubuntu24
ENV ACTIONS_RUNNER_HOOK_JOB_STARTED=/job-started.sh
ENV ACTIONS_RUNNER_HOOK_JOB_COMPLETED=/job-completed.sh
LABEL org.opencontainers.image.source=https://github.com/sprinters-sh/sprinters-images
LABEL org.opencontainers.image.description="sprinters.sh runner"
LABEL org.opencontainers.image.licenses=MIT
LABEL sh.sprinters.runner-image.version=$RUNNER_IMAGE_VERSION
COPY --from=build / /
USER runner
WORKDIR /home/runner
# Quick sanity check ensuring the runner is fully functional
RUN ./config.sh --version
CMD ["/entrypoint.sh"]