1# syntax=docker/dockerfile:1
2
3# Docker file to create an environment to build yocto with virtualization
4#
5# Arguments that can be passed during image creation using --build-arg:
6# "host_uid=$(id -u)": to use current user uid for build user in the image
7# "host_gid=$(id -g)": to use current user gid for build user in the image
8# "ubuntu_version=VERS": to select the ubuntu version number
9
10# Use standard ubuntu minimal.
11ARG ubuntu_version=22.04
12From ##DOCKERPLAT##ubuntu:$ubuntu_version AS base
13LABEL maintainer.name="The Xen Project " \
14      maintainer.email="xen-devel@lists.xenproject.org"
15
16ENV DEBIAN_FRONTEND=noninteractive
17
18# Install minimal ubuntu requirements for yocto and other tools we need.
19# See https://docs.yoctoproject.org/4.0.1/brief-yoctoprojectqs/index.html#build-host-packages
20RUN apt-get update && \
21    apt-get --quiet --yes install \
22        gawk \
23        wget \
24        git \
25        diffstat \
26        unzip \
27        texinfo \
28        gcc \
29        build-essential \
30        chrpath \
31        socat \
32        cpio \
33        python3 \
34        python3-pip \
35        python3-pexpect \
36        xz-utils \
37        debianutils \
38        iputils-ping \
39        python3-git \
40        python3-jinja2 \
41        libegl1-mesa \
42        libsdl1.2-dev \
43        python3-subunit \
44        mesa-common-dev \
45        zstd \
46        liblz4-tool \
47        file \
48        vim \
49        bison \
50        expect \
51        locales \
52        liblz4-tool \
53        zstd \
54        openssl \
55        libssl3 \
56        ca-certificates \
57        && \
58        apt-get autoremove -y && \
59        apt-get clean && \
60        rm -rf /var/lib/apt/lists* /tmp/* /var/tmp/*
61
62# Use bash as shell.
63RUN rm /bin/sh && ln -s bash /bin/sh
64
65# Fix local for yocto.
66RUN locale-gen en_US.UTF-8 && update-locale LC_ALL=en_US.UTF-8 \
67    LANG=en_US.UTF-8
68ENV LANG en_US.UTF-8
69ENV LC_ALL en_US.UTF-8
70
71# Create a user for the build (we don't want to build as root).
72ENV USER_NAME docker-build
73ARG host_uid=1000
74ARG host_gid=1000
75RUN groupadd -g $host_gid $USER_NAME && \
76    useradd -g $host_gid -m -s /bin/bash -u $host_uid $USER_NAME
77
78# Switch to our user instead of root and start in its home.
79USER $USER_NAME
80WORKDIR /home/$USER_NAME
81
82# Create needed directories
83RUN mkdir -p /home/$USER_NAME/yocto-layers \
84             /home/$USER_NAME/yocto-cache \
85             /home/$USER_NAME/logs \
86             /home/$USER_NAME/bin \
87             /home/$USER_NAME/xen && \
88    chown $USER_NAME.$USER_NAME /home/$USER_NAME/*
89
90# clone yocto repositories we need.
91RUN for rep in \
92                https://github.com/openembedded/meta-openembedded \
93                https://git.yoctoproject.org/poky \
94                https://git.yoctoproject.org/meta-virtualization \
95            ; do \
96        git -C /home/$USER_NAME/yocto-layers \
97            clone -b ##YOCTOVERSION## --single-branch $rep; \
98    done
99
100# The builder stage is building an initial cache state that we include in the
101# final image.
102From base AS builder
103
104# This step can take one to several hours depending on your download bandwith
105# and the speed of your computer.
106COPY ./build-yocto.sh /
107RUN /build-yocto.sh --dump-log ##YOCTOTARGET##
108
109From base
110
111# Only copy the cache status.
112COPY --from=builder /home/$USER_NAME/yocto-cache /home/$USER_NAME/yocto-cache/.
113
114LABEL maintainer.name="The Xen Project " \
115      maintainer.email="xen-devel@lists.xenproject.org"
116
117