11# syntax = docker/dockerfile:experimental
2- FROM ubuntu:20 .04 AS build-base-stage
2+ FROM ubuntu:22 .04 AS build-base-stage
33
44WORKDIR /
55
6- ENV BUILDKIT_VERSION "v0.8.2"
7- ENV BUILDCTL_SHA256 "b64aec46fb438ea844616b3205c33b01a3a49ea7de1f8539abd0daeb4f07b9f9"
8- ENV INDENT_SHA256 "12185be748db620f8f7799ea839f0d10ce643b9f5ab1805c960e56eb27941236"
9- ENV LIBC_SHA256 "9a8caf9f33448a8f2f526e94d00c70cdbdd735caec510df57b3283413df7882a"
10- # Go version in ppa:longsleep/golang-backports
11- ENV GO_PACKAGE "golang-1.22-go"
12-
13- COPY vpp/Makefile /vpp-src/Makefile
14- COPY vpp/build/external /vpp-src/build/external
15-
16- RUN echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections
17-
18- # netbase is needed for Scapy
196RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
207 --mount=target=/var/cache/apt,type=cache,sharing=private \
8+ echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections && \
9+ echo "debconf debconf/frontend select Noninteractive" | debconf-set-selections && \
2110 apt-get update && \
11+ apt-get install -y software-properties-common && \
2212 apt-get dist-upgrade -yy && \
23- apt-get install -y software-properties-common ccache && \
13+ # add reporistory for newer golang releases
2414 add-apt-repository ppa:longsleep/golang-backports && \
2515 apt-get update && \
26- DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
27- build-essential sudo git netbase curl ca-certificates \
28- ${GO_PACKAGE} iproute2 gdb tcpdump iputils-ping libpcap-dev \
29- dumb-init gdbserver clang-11 libasan6 && \
30- curl -sSL "https://github.com/moby/buildkit/releases/download/${BUILDKIT_VERSION}/buildkit-${BUILDKIT_VERSION}.linux-amd64.tar.gz" | \
31- tar -xvz -C /usr/local bin/buildctl && \
32- echo "${BUILDCTL_SHA256} /usr/local/bin/buildctl" | sha256sum -c && \
16+ apt-get install -y --no-install-recommends \
17+ software-properties-common build-essential sudo git \
18+ # netbase is needed for Scapy
19+ netbase curl ca-certificates iproute2 gdb tcpdump iputils-ping \
20+ # use ccache for clang object files caching
21+ ccache libpcap-dev dumb-init gdbserver \
22+ # golang installed from ppa
23+ golang-1.23-go \
24+ # clang also installed in vpp Makefile, make sure to match versions
25+ clang \
26+ # llvm provides llc for xdp-tools build
27+ llvm \
28+ # golang installs gcc-12 which clang uses via auto-detection for stdc++ library.
29+ # But gcc-12 omits c++ stuff, so we add it manually. libstdc++-12-dev should be enough, but entire g++ is not that heavy to add.
30+ g++-12 \
31+ && \
32+ ln -s /usr/lib/go-1.23/bin/go /usr/bin/go && \
33+ ln -s /usr/lib/go-1.23/bin/gofmt /usr/bin/gofmt && \
34+ # set clang as default C and C++ compiler
35+ update-alternatives --set c++ /usr/bin/clang++ && \
36+ update-alternatives --set cc /usr/bin/clang &&\
37+ apt-get clean
38+
39+ ENV PATH="/usr/lib/ccache:$PATH" \
40+ CCACHE_DIR=/ccache \
41+ CCACHE_MAXSIZE=400M \
42+ CCACHE_COMPRESS=true \
43+ CCACHE_COMPRESSLEVEL=6 \
44+ GOPATH=/go
45+
46+ RUN go install github.com/onsi/ginkgo/
[email protected] && \
47+ mv /go/bin/ginkgo /usr/local/bin && \
48+ go install golang.org/x/tools/
[email protected] && \
49+ mv /go/bin/gopls /usr/local/bin
50+
51+ COPY vpp/Makefile /vpp-src/Makefile
52+ COPY vpp/build/external /vpp-src/build/external
53+
54+ RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
55+ --mount=target=/var/cache/apt,type=cache,sharing=private \
56+ --mount=target=/ccache,type=cache \
3357 cd /vpp-src && \
34- curl -sSL -O http://mirrors.kernel.org/ubuntu/pool/main/i/indent/indent_2.2.12-1_amd64.deb && \
35- echo "${INDENT_SHA256} /vpp-src/indent_2.2.12-1_amd64.deb" | sha256sum -c && \
36- apt-get install -y --no-install-recommends \
37- /vpp-src/indent_2.2.12-1_amd64.deb && \
38- rm /vpp-src/indent_2.2.12-1_amd64.deb && \
3958 git config --global user.email
"[email protected] " && \
4059 git config --global user.name "dummy user" && \
4160 git init && \
4261 git add Makefile && \
4362 git commit -m "dummy commit" && \
44- git tag -a v20.05-rc0 -m "dummy tag" && \
63+ # version requred to have this format
64+ git tag -a v24.02-rc0 -m "dummy tag" && \
4565 make UNATTENDED=yes install-dep install-ext-dep && \
46- apt-get clean && \
4766 rm -rf /vpp-src && \
48- ln -s /usr/lib/go-1.22/bin/go /usr/bin/go && \
49- ln -s /usr/lib/go-1.22/bin/gofmt /usr/bin/gofmt
50-
51- ENV PATH="/usr/lib/ccache:$PATH"
52- ENV CCACHE_DIR=/ccache
53- ENV CCACHE_MAXSIZE=400M
54- ENV CCACHE_COMPRESS=true
55- ENV CCACHE_COMPRESSLEVEL=6
56-
57- ENV GOPATH /go
58-
59- RUN go install github.com/onsi/ginkgo/
[email protected] && \
60- mv /go/bin/ginkgo /usr/local/bin
61-
62- RUN go install golang.org/x/tools/
[email protected] && \
63- mv /go/bin/gopls /usr/local/bin
67+ apt-get clean
6468
6569FROM build-base-stage AS build-stage
6670
@@ -72,11 +76,19 @@ ARG BUILD_TYPE
7276RUN --mount=target=/vpp-src/build-root/.ccache,type=cache \
7377 --mount=target=/ccache,type=cache \
7478 case ${BUILD_TYPE} in \
75- debug) target="pkg-deb-debug" ; args="-DVPP_ENABLE_TRAJECTORY_TRACE=1 -DVPP_ENABLE_SANITIZE_ADDR=ON" ;; \
76- release) target="pkg-deb" ; args="" ;; \
77- *) echo >&2 "Bad BUILD_TYPE: ${BUILD_TYPE}" ;; \
79+ debug) \
80+ target="pkg-deb-debug" ; \
81+ args="-DVPP_ENABLE_TRAJECTORY_TRACE=1 -DVPP_ENABLE_SANITIZE_ADDR=ON" ; \
82+ ;; \
83+ release) \
84+ target="pkg-deb" ; \
85+ args="" ; \
86+ ;; \
87+ *) \
88+ echo >&2 "Bad BUILD_TYPE: ${BUILD_TYPE}" ; \
89+ ;; \
7890 esac; \
79- echo "TARGET : ${target}" && \
91+ echo "Building target : ${target} with flags ${args }" && \
8092 make -C /vpp-src "${target}" V=1 VPP_EXTRA_CMAKE_ARGS="${args}" && \
8193 ccache -s && \
8294 mkdir -p /out/debs && \
@@ -89,62 +101,78 @@ COPY --from=build-stage /out/debs .
89101
90102# dev image starts here
91103FROM build-base-stage AS dev-stage
104+ ARG BUILD_TYPE
92105
93106RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
94107 --mount=target=/var/cache/apt,type=cache,sharing=private \
95108 --mount=target=/debs,source=/out/debs,from=build-stage,type=bind \
96109 apt-get install --no-install-recommends -yy \
97- /debs/vpp_*.deb \
98- /debs/vpp-dbg_*.deb \
99- /debs/vpp-plugin-core_*.deb \
100- /debs/vpp-plugin-devtools_*.deb \
101- /debs/vpp-plugin-dpdk*.deb \
102- /debs/libvppinfra_*.deb \
103- /debs/python3-vpp-api_*.deb \
104- /debs/vpp-dev_*.deb \
105- /debs/libvppinfra-dev_*.deb && \
110+ /debs/vpp_*.deb \
111+ /debs/vpp-dbg_*.deb \
112+ /debs/vpp-plugin-core_*.deb \
113+ /debs/vpp-plugin-devtools_*.deb \
114+ /debs/vpp-plugin-dpdk*.deb \
115+ /debs/libvppinfra_*.deb \
116+ /debs/python3-vpp-api_*.deb \
117+ /debs/vpp-dev_*.deb \
118+ /debs/libvppinfra-dev_*.deb && \
119+ if [ "${BUILD_TYPE}" = "debug" ]; then \
120+ # Add stdc++ as dependency to vpp, so ASAN can intercept c++ stuff
121+ apt-get install --no-install-recommends -yy patchelf && \
122+ patchelf --add-needed $(realpath -s $(clang -print-file-name=libstdc++.so)) $(which vpp) && true; \
123+ fi && \
106124 apt-get clean
107125
108126# use clean vpp source so as not to make the image too bloated
109127ADD vpp /vpp-src
110128# provide symlinks needed for running the Pythonic integration tests
111129RUN mkdir -p /vpp-src/build-root/build-test/src && \
112- ln -fs /vpp-src/test/* /vpp-src/build-root/build-test/src/
113- # fix git repo ownership issue
114- RUN git config --global --add safe.directory /src
130+ ln -fs /vpp-src/test/* /vpp-src/build-root/build-test/src/ && \
131+ # fix git repo ownership issue
132+ git config --global --add safe.directory /src
115133
116134# final image starts here
117- FROM ubuntu:20 .04 AS final-stage
135+ FROM ubuntu:22 .04 AS final-stage
118136ARG BUILD_TYPE
119137WORKDIR /
120138
121139ENV VPP_INSTALL_SKIP_SYSCTL=1
122140RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
123141 --mount=target=/var/cache/apt,type=cache,sharing=private \
124142 apt-get update && apt-get dist-upgrade -yy && \
125- apt-get install --no-install-recommends -yy liblz4-tool tar gdb gdbserver strace \
126- libhyperscan5 libmbedcrypto3 libmbedtls12 libmbedx509-0 apt-utils \
127- libpython3-stdlib libasan6 \
128- python3 python3-minimal python3.6 python3-minimal \
129- python3-cffi python3-cffi-backend libnuma1 \
130- libnl-3-200 libnl-route-3-200 libpcap0.8
143+ apt-get install --no-install-recommends -yy \
144+ liblz4-tool tar gdb gdbserver strace apt-utils \
145+ libhyperscan5 libmbedcrypto7 libmbedtls-dev libmbedx509-1 \
146+ python3 python3-minimal libpython3-stdlib \
147+ python3-cffi python3-cffi-backend libnuma1 \
148+ libnl-3-200 libnl-route-3-200 libpcap0.8
131149
132150RUN --mount=target=/var/lib/apt/lists,type=cache,sharing=private \
133151 --mount=target=/var/cache/apt,type=cache,sharing=private \
134152 --mount=target=/debs,source=/out/debs,from=build-stage,type=bind \
135153 extra_debs=; \
136154 if [ "${BUILD_TYPE}" = "debug" ]; then \
137- extra_debs="/debs/vpp-dev_*.deb /debs/libvppinfra-dev_*.deb" ; \
155+ extra_debs="${extra_debs} /debs/vpp-dev_*.deb" ; \
156+ extra_debs="${extra_debs} /debs/libvppinfra-dev_*.deb" ; \
157+ # libasan8 compatible with clang-14/gcc-12
158+ extra_debs="${extra_debs} libasan8" ; \
159+ # Add stdc++ as dependency to vpp, so ASAN can intercept c++ stuff
160+ extra_debs="${extra_debs} patchelf" ; \
161+ extra_debs="${extra_debs} libstdc++6" ; \
138162 fi && \
139163 apt-get install --no-install-recommends -yy \
140- /debs/vpp_*.deb \
141- /debs/vpp-dbg_*.deb \
142- /debs/vpp-plugin-core_*.deb \
143- /debs/vpp-plugin-devtools_*.deb \
144- /debs/vpp-plugin-dpdk*.deb \
145- /debs/libvppinfra_*.deb \
146- /debs/python3-vpp-api_*.deb \
147- ${extra_debs} && \
164+ /debs/vpp_*.deb \
165+ /debs/vpp-dbg_*.deb \
166+ /debs/vpp-plugin-core_*.deb \
167+ /debs/vpp-plugin-devtools_*.deb \
168+ /debs/vpp-plugin-dpdk*.deb \
169+ /debs/libvppinfra_*.deb \
170+ /debs/python3-vpp-api_*.deb \
171+ ${extra_debs} && \
172+ if [ "${BUILD_TYPE}" = "debug" ]; then \
173+ # Add stdc++ as dependency to vpp, so ASAN can intercept c++ stuff
174+ patchelf --add-needed /usr/lib/gcc/x86_64-linux-gnu/12/libstdc++.so $(which vpp) && true; \
175+ fi && \
148176 apt-get clean
149177
150178ENTRYPOINT /usr/bin/vpp
0 commit comments