2.7. Crear la teva pròpia imatge Docker
Si la nostra cerca a Docker Hub ha estat infructuosa o requerim una imatge específica per a les nostres necessitats, la solució és crear-la nosaltres mateixos.
En primer lloc, instal·larem software en una sessió interactiva. Amb aquesta finalitat, utilitzarem la imatge d’Alpine que prèviament havíem creat i intentarem instal·lar el paquet de python numpy. Alpine no és la distribució en la qual voldríem basar-nos per desenvolupar els nostres projectes; segurament Ubuntu o Debian siguin unes eleccions més apropiades. Abans de començar una imatge és important que tinguem ben clar què necessitarem instal·lar, quins són els nostres requisits i, finalment, escollir la distribució més apropiada. També és una bona pràctica no instal·lar massa programes en cada imatge perquè seran més difícils de crear i de mantenir. És la mateixa filosofia que aplicàvem als entorns Conda.
$ docker container run -it alpine sh
Seguidament comprovarem si tenim Python instal·lat:
/ # python --version
I podem observar que no està instal·lat.
Alpine té un gestor de paquets anomenat Alpine Package Keeper (apk) per instal·lar software. Depenent de la distribució de Linux que tinguem instal·lat, podríem utilitzar apt-get, yum, zypper
…
En primer lloc, instal·larem Python i altres paquets necessaris. Posteriorment, afegirem el paquet numpy.
/ # apk --no-cache --update-cache add gcc gfortran python3 py3-pip python3-dev build-base wget freetype-dev libpng-dev openblas-dev / # pip install numpy
Si ara entrem a Python podem comprovar que s’ha instal·lat correctament el paquet numpy.
Un cop sortim d’aquest contenidor, els canvis no s’hauran guardat. Per crear la nostra pròpia imatge, el més recomanable és utilitzar un Dockerfile.
Un Dockerfile és un arxiu de text amb l’estructura mínima següent:
- FROM <Imatge preexistent>
- RUN <Ordres per instal·lar des de la línia d’ordres>
- CMD <Ordres que s’han de córrer per defecte>
Les instruccions que es llancen per defecte (CMD) tenen una estructura definida. Només hi pot haver una línia de CMD al Dockerfile; si n’hi hagués més d’una, s’executaria l’última.
Així, si volguéssim reproduir el contenidor anterior, hauríem de crear un arxiu anomenat Dockerfile de la següent manera:
FROM alpine RUN apk --no-cache --update-cache add gcc gfortran python3 py3-pip python3-dev build-base wget freetype-dev libpng-dev openblas-dev RUN pip install numpy CMD python3 --version
Un cop tenim el Dockerfile definit crearem la imatge:
$ docker image build -t uoc/numpy .
L’opció -t
ens indica el nom que li volem donar a la nostra imatge. Seguint la nomenclatura anteriorment esmentada indiquem l’autor i el paquet. El «.
» ens indica que Dockerfile és a la mateixa carpeta on estem executant les ordres; hem d’especificar la ruta al directori del Dockerfile.
Ara podreu veure la nova imatge creada:
$ docker image ls
Taula 3.
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
uoc/numpy | latest | af1700de32cb | 25 minutes ago | 588MB |
Si executem el contenidor Docker, ens retornarà la versió de Python que tenim instal·lada a la imatge:
$ docker container run uoc/numpy
Si entréssim ordres en la línia d’execució del contenidor, aquestes són les que s’utilitzarien en detriment de les que estiguessin al Dockerfile. Així:
$ docker container run uoc/numpy which python3
Ens indicarà la localització de Python3 en el filesystem del contenidor.