-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDockerfile.snap
91 lines (81 loc) · 4.71 KB
/
Dockerfile.snap
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
ARG RISK=stable
ARG UBUNTU=jammy
FROM ubuntu:$UBUNTU as builder
ARG RISK
ARG UBUNTU
RUN echo "Building snapcraft:$RISK in ubuntu:$UBUNTU"
# Grab dependencies
RUN apt-get update
RUN apt-get dist-upgrade --yes
RUN apt-get install --yes \
curl \
jq \
squashfs-tools
# Grab the core22 snap (which snapcraft uses as a base) from the stable channel
# and unpack it in the proper place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22' | jq '.download_url' -r) --output core22.snap
RUN mkdir -p /snap/core22
RUN unsquashfs -d /snap/core22/current core22.snap
# Grab the snapcraft snap from the $RISK channel and unpack it in the proper
# place.
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/snapcraft?channel='$RISK | jq '.download_url' -r) --output snapcraft.snap
RUN mkdir -p /snap/snapcraft
RUN unsquashfs -d /snap/snapcraft/current snapcraft.snap
# Fix Python3 installation: Make sure we use the interpreter from
# the snapcraft snap:
RUN unlink /snap/snapcraft/current/usr/bin/python3
RUN ln -s /snap/snapcraft/current/usr/bin/python3.* /snap/snapcraft/current/usr/bin/python3
RUN echo /snap/snapcraft/current/lib/python3.*/site-packages >> /snap/snapcraft/current/usr/lib/python3/dist-packages/site-packages.pth
# Create a snapcraft runner (TODO: move version detection to the core of
# snapcraft).
RUN mkdir -p /snap/bin
RUN echo "#!/bin/sh" > /snap/bin/snapcraft
RUN snap_version="$(awk '/^version:/{print $2}' /snap/snapcraft/current/meta/snap.yaml | tr -d \')" && echo "export SNAP_VERSION=\"$snap_version\"" >> /snap/bin/snapcraft
RUN echo 'exec "$SNAP/usr/bin/python3" "$SNAP/bin/snapcraft" "$@"' >> /snap/bin/snapcraft
RUN chmod +x /snap/bin/snapcraft
# Workaround for old buggy version of patchelf
ADD https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz /opt/patchelf/patchelf.tar.gz
RUN cd /opt/patchelf && tar -xvf patchelf.tar.gz
RUN ln -s /snap/snapcraft/current/lib/python3.*/site-packages/snapcraft/elf/_patcher.py /opt/patchelf/_patcher.py
RUN echo 'Patcher._old_run_patchelf = Patcher._run_patchelf' >> /opt/patchelf/_patcher.py && \
echo 'def new_run_patchelf(self, patchelf_args, elf_file_path):' >> /opt/patchelf/_patcher.py && \
echo ' done = False' >> /opt/patchelf/_patcher.py && \
echo ' try:' >> /opt/patchelf/_patcher.py && \
echo ' i = patchelf_args.index("--set-rpath")' >> /opt/patchelf/_patcher.py && \
echo ' self._old_run_patchelf(' >> /opt/patchelf/_patcher.py && \
echo ' patchelf_args=["--force-rpath", "--set-rpath", patchelf_args[i + 1]],' >> /opt/patchelf/_patcher.py && \
echo ' elf_file_path=elf_file_path' >> /opt/patchelf/_patcher.py && \
echo ' )' >> /opt/patchelf/_patcher.py && \
echo ' done = True' >> /opt/patchelf/_patcher.py && \
echo ' except ValueError:' >> /opt/patchelf/_patcher.py && \
echo ' pass' >> /opt/patchelf/_patcher.py && \
echo ' try:' >> /opt/patchelf/_patcher.py && \
echo ' i = patchelf_args.index("--set-interpreter")' >> /opt/patchelf/_patcher.py && \
echo ' self._old_run_patchelf(' >> /opt/patchelf/_patcher.py && \
echo ' patchelf_args=["--set-interpreter", patchelf_args[i + 1]],' >> /opt/patchelf/_patcher.py && \
echo ' elf_file_path=elf_file_path' >> /opt/patchelf/_patcher.py && \
echo ' )' >> /opt/patchelf/_patcher.py && \
echo ' done = True' >> /opt/patchelf/_patcher.py && \
echo ' except ValueError:' >> /opt/patchelf/_patcher.py && \
echo ' pass' >> /opt/patchelf/_patcher.py && \
echo ' if not done:' >> /opt/patchelf/_patcher.py && \
echo ' self._old_run_patchelf(patchelf_args=patchelf_args, elf_file_path=elf_file_path)' >> /opt/patchelf/_patcher.py && \
echo 'Patcher._run_patchelf = new_run_patchelf' >> /opt/patchelf/_patcher.py
# Multi-stage build, only need the snaps from the builder. Copy them one at a
# time so they can be cached.
FROM ubuntu:$UBUNTU
COPY --from=builder /snap/core22 /snap/core22
COPY --from=builder /snap/snapcraft /snap/snapcraft
COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
COPY --from=builder /opt/patchelf/bin/patchelf /snap/snapcraft/current/bin
# Generate locale and install dependencies.
RUN apt-get update && apt-get dist-upgrade --yes && apt-get install --yes snapd sudo locales && locale-gen en_US.UTF-8 && \
apt-get install -y binutils curl unzip
# Set the proper environment.
ENV LANG="en_US.UTF-8"
ENV LANGUAGE="en_US:en"
ENV LC_ALL="en_US.UTF-8"
ENV PATH="/snap/bin:/snap/snapcraft/current/usr/bin:$PATH"
ENV SNAP="/snap/snapcraft/current"
ENV SNAP_NAME="snapcraft"
ENV SNAP_ARCH="amd64"