e160d30f9f9624c2f4a2d48ad27a4f76f0c61682
[ric-plt/a1.git] / Dockerfile
1 # ==================================================================================
2 #       Copyright (c) 2019-2020 Nokia
3 #       Copyright (c) 2018-2020 AT&T Intellectual Property.
4 #
5 #   Licensed under the Apache License, Version 2.0 (the "License");
6 #   you may not use this file except in compliance with the License.
7 #   You may obtain a copy of the License at
8 #
9 #          http://www.apache.org/licenses/LICENSE-2.0
10 #
11 #   Unless required by applicable law or agreed to in writing, software
12 #   distributed under the License is distributed on an "AS IS" BASIS,
13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 #   See the License for the specific language governing permissions and
15 #   limitations under the License.
16 # ==================================================================================
17
18 # This builds an image for A1 based on ubuntu. The build takes between three and four
19 # minutes depending on what was previously cached, and results in an image that is
20 # roughly 260 MiB in size (as of May 2021)
21 #
22
23 FROM python:3.8 as build
24
25 # upgrade pip as root
26 RUN pip install --upgrade pip
27
28 # pick up things for gevent build
29 #
30 RUN apt-get update
31 RUN apt-get install -y gcc musl-dev make file libffi-dev g++
32
33 # --- all root operations must be above this line ------------------------------------
34
35
36 # create a simple user.  This is only really needed in stage 2,
37 # however this makes the copying easier and straighttforward;
38 # the 'pip option --user' command  doesn't do the same thing when
39 # run as root.
40 #
41 RUN addgroup a1user && adduser --ingroup a1user a1user
42
43 # switch to the non-root user for installing python things
44 USER a1user
45
46 # Speed hack; we install gevent before anything because when building repeatedly (eg during dev)
47 # and only changing a1 code, we do not need to keep compiling gevent which takes forever
48 RUN pip install --user gevent
49
50 COPY setup.py /home/a1user/
51 COPY a1/ /home/a1user/a1
52 RUN pip install --user /home/a1user
53
54
55
56 # ----- stage 2  ---------------------------------------------------------------------------------
57
58 # It might be tempting to use python:3.8, but that image is more than
59 # 800 GiB to start, and the final image size if it is used is over
60 # 1 GiB!!  Using the plain ubuntu image, then installing py3, and taking
61 # things built in the first stage, the final image size isn't tiny, but should
62 # be well under the 800GiB start for the python image.
63 #
64 FROM ubuntu:18.04
65
66 # pick up reference to python so that we can get 3.8 and not the really old default
67
68 RUN    apt-get update \
69         && apt install -y software-properties-common \
70         && add-apt-repository ppa:deadsnakes/ppa \
71         && apt-get install -y python3.8 python3-pip wget \
72         && apt-get clean
73
74 # fetch and install RMR and any other needed libraries
75 #
76 ARG RMR_VER=4.7.4
77 ARG RMR_PKG_URL=https://packagecloud.io/o-ran-sc/release/packages/debian/stretch/
78
79 RUN wget -nv --content-disposition ${RMR_PKG_URL}/rmr_${RMR_VER}_amd64.deb/download.deb
80 RUN wget -nv --content-disposition ${RMR_PKG_URL}/rmr-dev_${RMR_VER}_amd64.deb/download.deb
81 RUN    dpkg -i rmr_${RMR_VER}_amd64.deb  \
82         && dpkg -i rmr-dev_${RMR_VER}_amd64.deb \
83         && ldconfig
84
85 # copy python modules; this makes the 2 stage python build work
86 #
87 COPY --from=build /home/a1user/.local /home/a1user/.local
88
89 # create mount point for dir with rmr routing file as named below
90 #
91 RUN mkdir -p /opt/route/
92
93 # create a non-root user, ensure it can access what it needs, and switch to it
94 #
95 RUN    addgroup a1user \
96         && adduser --disabled-password --disabled-login --gecos "image-user" --no-create-home --ingroup a1user a1user \
97         && chown -R a1user:a1user /home/a1user/.local \
98         && chown a1user:a1user /home/a1user
99
100
101 # ------------------ no root commands after this point -------------------------------------
102 USER a1user
103
104 # the maddening onsey-twosey install of pything crud...
105 #
106 RUN pip3 install  --user connexion
107
108 # misc
109 #
110 EXPOSE 10000
111 ENV LD_LIBRARY_PATH /usr/local/lib/:/usr/local/lib64
112 ENV RMR_SEED_RT /opt/route/local.rt
113
114 # Set "fake" to True to run standalone
115 #
116 ENV USE_FAKE_SDL False
117 ENV PYTHONUNBUFFERED 1
118
119 # pip installs executable script to $HOME/.local/bin so PATH vars are critical
120 #
121 ENV PATH /home/a1user/.local/bin:$PATH
122 ENV PYTHONPATH /home/a1user/.local/lib/python3.8/site-packages
123
124 # prometheus client gathers data here
125 #
126 ENV prometheus_multiproc_dir /tmp
127
128 # by defalt start the application
129 #
130 CMD [ "/usr/bin/python3.8", "/home/a1user/.local/bin/run-a1" ]