summaryrefslogtreecommitdiffstats
path: root/doc/developer/building-docker.rst
blob: 644e02bd6c629367234430a7569e7d762de01af1 (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
Docker
======

This page covers how to build FRR Docker images.

Images
""""""
FRR has Docker build infrastructure to produce Docker images containing
source-built FRR on the following base platforms:

* Alpine
* Centos 7
* Centos 8

The following platform images are used to support Travis CI and can also
be used to reproduce topotest failures when the docker host is Ubuntu
(tested on 20.04 and 22.04):

* Ubuntu 20.04
* Ubuntu 22.04

The following platform images may also be built, but these simply install a
binary package from an existing repository and do not perform source builds:

* Debian 10

Some of these are available on `DockerHub
<https://hub.docker.com/repository/docker/frrouting/frr/tags?page=1>`_.

There is no guarantee on what is and is not available from DockerHub at time of
writing.

Scripts
"""""""

Some platforms contain an included build script that may be run from the host.
This will set appropriate packaging environment variables and clean up
intermediate build images.

These scripts serve another purpose. They allow building platform packages
without needing the platform. For example, the Centos 8 docker image can also
be leveraged to build Centos 8 RPMs that can then be used separately from
Docker.

If you are only interested in the Docker images and don't want the cleanup
functionality of the scripts you can ignore them and perform a normal Docker
build. If you want to build multi-arch docker images this is required as the
scripts do not support using Buildkit for multi-arch builds.

Building Alpine Image
---------------------

Script::

   ./docker/alpine/build.sh

No script::

   docker build -f docker/alpine/Dockerfile .

No script, multi-arch (ex. amd64, arm64, armv7)::

   docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -f docker/alpine/Dockerfile -t frr:latest .


Building Debian Image
---------------------

::

   cd docker/debian
   docker build .

Multi-arch (ex. amd64, arm64, armv7)::

   cd docker/debian
   docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t frr-debian:latest .

Building Centos 7 Image
-----------------------

Script::

   ./docker/centos-7/build.sh

No script::

   docker build -f docker/centos-7/Dockerfile .

No script, multi-arch (ex. amd64, arm64)::

   docker buildx build --platform linux/amd64,linux/arm64 -f docker/centos-7/Dockerfile -t frr-centos7:latest .


Building Centos 8 Image
-----------------------

Script::

   ./docker/centos-8/build.sh

No script::

   docker build -f docker/centos-8/Dockerfile .

No script, multi-arch (ex. amd64, arm64)::

   docker buildx build --platform linux/amd64,linux/arm64 -f docker/centos-8/Dockerfile -t frr-centos8:latest .



Building ubi 8 Image
-----------------------

Script::

   ./docker/ubi-8/build.sh

Script with params, an example could be this (all that info will go to docker label) ::

   ./docker/ubi-8/build.sh  frr:ubi-8-my-test "$(git rev-parse --short=10 HEAD)" my_release my_name my_vendor

No script::

   docker build -f docker/ubi-8/Dockerfile .

No script, multi-arch (ex. amd64, arm64)::

   docker buildx build --platform linux/amd64,linux/arm64 -f docker/ubi-8/Dockerfile -t frr-ubi-8:latest .



Building Ubuntu 20.04 Image
---------------------------

Build image (from project root directory)::

   docker build -t frr-ubuntu20:latest --build-arg=UBUNTU_VERSION=20.04 -f docker/ubuntu-ci/Dockerfile .

Running Full Topotest::

   docker run --init -it --privileged --name frr-ubuntu20 -v /lib/modules:/lib/modules \
       frr-ubuntu20:latest bash -c 'cd ~/frr/tests/topotests ; sudo pytest -nauto --dist=loadfile'

Extract results from the above run into `run-results` dir and analyze::

   tests/topotests/analyze.py -C frr-ubuntu20 -Ar run-results

Start the container::

   docker run -d --init --privileged --name frr-ubuntu20 --mount type=bind,source=/lib/modules,target=/lib/modules frr-ubuntu20:latest

Running a topotest (when the docker host is Ubuntu)::

   docker exec frr-ubuntu20 bash -c 'cd ~/frr/tests/topotests/ospf_topo1 ; sudo pytest test_ospf_topo1.py'

Starting an interactive bash session::

   docker exec -it frr-ubuntu20 bash

Stopping an removing a container::

   docker stop frr-ubuntu20 ; docker rm frr-ubuntu20

Removing the built image::

   docker rmi frr-ubuntu20:latest


Building Ubuntu 22.04 Image
---------------------------

Build image (from project root directory)::

   docker build -t frr-ubuntu22:latest -f docker/ubuntu-ci/Dockerfile .

Running Full Topotest::

   docker run --init -it --privileged --name frr-ubuntu22 -v /lib/modules:/lib/modules \
       frr-ubuntu22:latest bash -c 'cd ~/frr/tests/topotests ; sudo pytest -nauto --dist=loadfile'

Extract results from the above run into `run-results` dir and analyze::

   tests/topotests/analyze.py -C frr-ubuntu22 -Ar run-results

Start the container::

   docker run -d --init --privileged --name frr-ubuntu22 --mount type=bind,source=/lib/modules,target=/lib/modules frr-ubuntu22:latest

Running a topotest (when the docker host is Ubuntu)::

   docker exec frr-ubuntu22 bash -c 'cd ~/frr/tests/topotests/ospf_topo1 ; sudo pytest test_ospf_topo1.py'

Starting an interactive bash session::

   docker exec -it frr-ubuntu22 bash

Stopping an removing a container::

   docker stop frr-ubuntu22 ; docker rm frr-ubuntu22

Removing the built image::

   docker rmi frr-ubuntu22:latest