aboutsummaryrefslogtreecommitdiff
path: root/Dockerfile
blob: 28a270785db7f22a47d57bbf14466cff27656873 (plain)
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
# SPDX-FileCopyrightText: Copyright 2022, Arm Limited and/or its affiliates.
# SPDX-FileCopyrightText: Copyright (c) 2013-2019 Yamashita, Yuu
# SPDX-FileCopyrightText: Copyright (c) 2013 Sam Stephenson
# SPDX-License-Identifier: Apache-2.0 AND MIT

# Execution environment for self-check and tests of this repository.
# The build context should be the MLIA repository.
#
# Example - Build the image with Python 3.10 installed:
#
# docker build \
#   --build-arg UID="$(id -u)" \
#   --build-arg GID="$(id -g)" \
#   --build-arg PYTHON_VERSIONS="3.10" \
#   --build-arg BASE_IMAGE="ubuntu:20.04" \
#   -t "mlia-test" \
#   .
#
# Example - Run the linters in the container:
#
# docker run --rm --user "$(id -u):$(id -g)" --pid=host \
#   -v "$PWD:/workspace" \
#   -w "/workspace" \
#   "mlia-test" \
#   tox --workdir /home/foo/tox/ -e lint

ARG BASE_IMAGE=ubuntu:20.04

FROM ${BASE_IMAGE}

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    git \
    locales \
    ruby-dev \
    shellcheck \
    cmake \
    # Dependencies required by pyenv to build Python
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    wget \
    curl \
    llvm \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libxml2-dev \
    libxmlsec1-dev \
    libffi-dev \
    liblzma-dev \
    && rm -rf /var/lib/apt/lists/*

RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

ARG UID
ARG GID

RUN groupadd -g ${GID} -o foo
RUN useradd -m -l -u ${UID} -g foo foo

USER foo
ENV HOME=/home/foo
ENV USER=foo
ENV PATH="/home/foo/.local/bin:${PATH}"

# Install pyenv
ENV PYENV_GIT_TAG v2.3.3
RUN curl https://pyenv.run | bash

ENV PYENV_ROOT /home/foo/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

# Python versions separated by commas, e.g. "3.8,3.9"
ARG PYTHON_VERSIONS
# Install Python versions and set them to be available globally
COPY docker/install_python_versions.sh /home/foo
RUN /home/foo/install_python_versions.sh "${PYTHON_VERSIONS}" --set-all-global

# Create a temporary mock MLIA repository to setup the tox and pre-commit
# environments. Copy only relevant files to facilitate caching.
ENV TMP_REPO /tmp/mlia/
RUN mkdir $TMP_REPO
WORKDIR $TMP_REPO
RUN git init \
    && mkdir src \
    && touch README.md
COPY pyproject.toml setup.cfg setup.py tox.ini ./

ENV TOX_WORK_DIR $HOME/tox
COPY .pre-commit-config.yaml .

# Install tox, create tox environment for linting (as this takes most time to set up)
# in a specific cache directory so that it is cached in the docker image.
# Set up pre-commit hooks to cache the hook environments

# pip.conf may contain sensitive information such as login information for the
# chosen pip index. By loading it as a secret, the secret information will not
# be leaked into the final build or cache.
RUN --mount=type=secret,id=pip_conf,mode=755,target=/home/foo/.pip/pip.conf \
    pip3 install -U tox~=3.27.1 &&\
    tox --workdir $TOX_WORK_DIR --notest --recreate -e lint &&\
    tox --workdir $TOX_WORK_DIR -e lint_setup

WORKDIR $HOME
RUN rm -r $TMP_REPO