xref: /cloud-hypervisor/resources/Dockerfile (revision 9af2968a7dc47b89bf07ea9dc5e735084efcfa3a)
1FROM ubuntu:20.04 as dev
2
3ARG TARGETARCH
4ARG RUST_TOOLCHAIN="1.52.1"
5ARG CLH_SRC_DIR="/cloud-hypervisor"
6ARG CLH_BUILD_DIR="$CLH_SRC_DIR/build"
7ARG CARGO_REGISTRY_DIR="$CLH_BUILD_DIR/cargo_registry"
8ARG CARGO_GIT_REGISTRY_DIR="$CLH_BUILD_DIR/cargo_git_registry"
9
10ENV CARGO_HOME=/usr/local/rust
11ENV RUSTUP_HOME=$CARGO_HOME
12ENV PATH="$PATH:$CARGO_HOME/bin"
13
14# Install all CI dependencies
15RUN apt-get update \
16	&& apt-get -yq upgrade \
17	&& DEBIAN_FRONTEND=noninteractive apt-get install -yq \
18	build-essential \
19	bc \
20	docker.io \
21	curl \
22	wget \
23	sudo \
24	mtools \
25	musl-tools \
26	libssl-dev \
27	pkg-config \
28	flex \
29	bison \
30	libelf-dev \
31	qemu-utils \
32	qemu-system \
33	libglib2.0-dev \
34	libpixman-1-dev \
35	libseccomp-dev \
36	libcap-ng-dev \
37	socat \
38	dosfstools \
39	cpio \
40	python \
41	python3 \
42	python3-setuptools \
43	ntfs-3g \
44	openvswitch-switch-dpdk \
45	python3-distutils \
46	uuid-dev \
47    && apt-get clean \
48    && rm -rf /var/lib/apt/lists/*
49
50RUN update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk
51
52RUN if [ "$TARGETARCH" = "amd64" ]; then \
53	apt-get update \
54	&& apt-get -yq upgrade \
55	&& DEBIAN_FRONTEND=noninteractive apt-get install -yq gcc-multilib \
56	&& apt-get clean \
57    && rm -rf /var/lib/apt/lists/*;	fi
58
59RUN if [ "$TARGETARCH" = "arm64" ]; then \
60        # On AArch64, `setcap` binary should be installed via `libcap2-bin`.
61        # The `setcap` binary is used in integration tests.
62        apt-get update \
63        && apt-get -yq upgrade \
64        && DEBIAN_FRONTEND=noninteractive apt-get install -yq libcap2-bin \
65        && apt-get clean \
66        && rm -rf /var/lib/apt/lists/*;	fi
67
68# Fix the libssl-dev install
69RUN export ARCH="$(uname -m)" \
70    && cp /usr/include/$ARCH-linux-gnu/openssl/opensslconf.h /usr/include/openssl/
71ENV X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/
72ENV X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/
73ENV AARCH64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu/
74ENV AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu/
75ENV OPENSSL_INCLUDE_DIR=/usr/include/
76
77# Install the rust toolchain
78RUN export ARCH="$(uname -m)" \
79    && nohup curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain "$RUST_TOOLCHAIN" \
80    && rustup target add $ARCH-unknown-linux-musl --toolchain "$RUST_TOOLCHAIN" \
81    && if [ "$TARGETARCH" = "amd64" ]; then rustup toolchain add $RUST_TOOLCHAIN-x86_64-unknown-linux-musl; fi \
82    && if [ "$TARGETARCH" = "amd64" ]; then rustup component add rustfmt; fi \
83    && if [ "$TARGETARCH" = "amd64" ]; then rustup component add clippy; fi \
84    && cargo install cargo-audit \
85    && rm -rf "$CARGO_HOME/registry" \
86    && ln -s "$CARGO_REGISTRY_DIR" "$CARGO_HOME/registry" \
87    && rm -rf "$CARGO_HOME/git" \
88    && ln -s "$CARGO_GIT_REGISTRY_DIR" "$CARGO_HOME/git"
89
90# Set the rust environment
91RUN echo 'source $CARGO_HOME/env' >> $HOME/.bashrc \
92    && mkdir $HOME/.cargo \
93    && ln -s $CARGO_HOME/env $HOME/.cargo/env
94