Visualizzazione post con etichetta Docker. Mostra tutti i post
Visualizzazione post con etichetta Docker. Mostra tutti i post

lunedì 4 novembre 2024

Dockerizza Flask

Un esempio semplice per inserire in un container Docker una applicazione Flask

Partiamo da una semplice applicazione che ha un file app.py ed un requirements.txt

Si crea nello stesso folder dei due files precedenti il Dockerfile

---------------------------------------------------------------------------------------------

FROM python:3.8-slim-buster

WORKDIR /python-docker

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

---------------------------------------------------------------------------------------------

e si effettua la build con

docker build --tag flask-docker .

terminata la build del container

docker run -d -p 5000:5000 flask-docker

la applicazione sara' visibile su localhost:5000

mercoledì 9 ottobre 2024

Cron in Docker

E' possibile attivare un crontab all'interno di un docker aggiungendo al Dockerfile i seguenti comandi


RUN apt-get -y install cron 

RUN crontab -l | { cat; echo "0 3 * * * bash /root/mioscript.sh"; } | crontab - 

CMD cron

sabato 6 aprile 2024

Coral Mini dev board e rifiuti su spiaggia

Ho provato ad integrare il modello dei rifiuti su spiaggia visto qui e qui in Tensorflow lite per girare su Coral Mini Dev Board (basato su questo esempio)



Per prima cosa ho scaricato i dati in formato Pascal VOC (quindi con le annotations in formato xml) 

L'albero dei folder e' del tipo

--------------------------------------------------------------------------

dataset
    -train
        --images (solo jpg)
        --annotations (solo xml)
    -test
        --images
        --annotations
    -validation
        --images
        --annotations

-------------------------------------------------------------------------- 


Per questo motivo ho dovuto dividere i file rispetto al file zip scaricato da roboflow sono xml e jpg sono tutti nello stesso folder

Per fare il retrain ho usato il TF Lite Model Maker . Il problema e' che non ne vuole sapere di girare in Colab ed ho tirato su un Docker con il seguente Dockerfile

Inoltre TF Lite Model Maker effettua il retrain di modelli destinati a funzionare on edge e su mobile, in particolare usando EffiecientDet Lite 

-------------------------------------------------------------------------- 

FROM tensorflow/tensorflow:2.13.0-gpu

RUN apt-get update && \
    apt-get install -y libusb-1.0-0 libusb-1.0-0-dev

RUN pip install tflite-model-maker
RUN pip install pycocotools
 

-------------------------------------------------------------------------- 

lanciandolo con il comando

docker build -t litegpu .

docker run --gpus all -it -p  -v $PWD:/tmp -w /tmp litegpu bash

A questo punto si passa alla creazione vera e propria del modello con lo script python. Rispetto all'esempio di Colab, ho dovuto abbassare la batch size a 2 e rimuovere la validazione del modello altrimenti lo script satura tutta la memoria GPU

--------------------------------------------------------------------------

import numpy as np
import os

from tflite_model_maker.config import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import object_detector

import tensorflow as tf
assert tf.__version__.startswith('2')

tf.get_logger().setLevel('ERROR')
from absl import logging
logging.set_verbosity(logging.ERROR)


label_map = {1: 'Glass', 2: 'Metal',3: 'Net',4: 'null',5: 'PET_Bottle',6: 'Plastic_Buoy',7: 'Plastic_Buoy_China',8: 'Plastic_ETC',9: 'Rope',10: 'Styrofoam_Box',11: 'Styrofoam_Buoy',12: 'Styrofoam_Piece'}

train_images_dir = 'dataset/train/images'
train_annotations_dir = 'dataset/train/annotations'
val_images_dir = 'dataset/validation/images'
val_annotations_dir = 'dataset/validation/annotations'
test_images_dir = 'dataset/test/images'
test_annotations_dir = 'dataset/test/annotations'

train_data = object_detector.DataLoader.from_pascal_voc(train_images_dir, train_annotations_dir, label_map=label_map)
validation_data = object_detector.DataLoader.from_pascal_voc(val_images_dir, val_annotations_dir, label_map=label_map)
test_data = object_detector.DataLoader.from_pascal_voc(test_images_dir, test_annotations_dir, label_map=label_map)
print(f'train count: {len(train_data)}')
print(f'validation count: {len(validation_data)}')
print(f'test count: {len(test_data)}')


spec = object_detector.EfficientDetLite0Spec()
model = object_detector.create(train_data=train_data,
                               model_spec=spec,
                               validation_data=validation_data,
                               epochs=10,
                               batch_size=2,
                               train_whole_model=True)
#model.evaluate(test_data)
TFLITE_FILENAME = 'efficientdet-lite-litter.tflite'
LABELS_FILENAME = 'litter-labels.txt'
model.export(export_dir='.', tflite_filename=TFLITE_FILENAME, label_filename=LABELS_FILENAME,
             export_format=[ExportFormat.TFLITE, ExportFormat.LABEL])
model.evaluate_tflite(TFLITE_FILENAME, test_data)
-------------------------------------------------------------------------- 

con risultato finale

659 - loss: 0.8730 - learning_rate: 2.5257e-05 - gradient_norm: 5.0130 - val_det_loss: 0.6480 - val_cls_loss: 0.3706 - val_box_loss: 0.0055 - val_reg_l2_loss: 0.0659 - val_loss: 0.7139


Si potrebbe anche usare il modello 1 cambiando la linea

spec = object_detector.EfficientDetLite1Spec()

ma la mia scheda grafica non ha abbastanza memoria

Per verificare se il modello funziona si puo' all'interno del docker installare tramite pip

python3 -m pip install --extra-index-url https://google-coral.github.io/py-repo/ pycoral

e poi lanciare il comando lo script

-------------------------------------------------------------------------- 

from PIL import ImageDraw
from PIL import ImageFont
import PIL

import tflite_runtime.interpreter as tflite
from pycoral.adapters import common
from pycoral.adapters import detect
from pycoral.utils.dataset import read_label_file

def draw_objects(draw, objs, scale_factor, labels):
  """Draws the bounding box and label for each object."""
  COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype=np.uint8)
  for obj in objs:
    bbox = obj.bbox
    color = tuple(int(c) for c in COLORS[obj.id])
    draw.rectangle([(bbox.xmin * scale_factor, bbox.ymin * scale_factor),
                    (bbox.xmax * scale_factor, bbox.ymax * scale_factor)],
                   outline=color, width=3)
    font = ImageFont.truetype("LiberationSans-Regular.ttf", size=15)
    draw.text((bbox.xmin * scale_factor + 4, bbox.ymin * scale_factor + 4),
              '%s\n%.2f' % (labels.get(obj.id, obj.id), obj.score),
              fill=color, font=font)

# Load the TF Lite model
labels = read_label_file('./e0/litter-labels.txt')
interpreter = tflite.Interpreter('./e0/efficientdet-lite-litter.tflite')
interpreter.allocate_tensors()

# Resize the image for input
image = Image.open('./e0/1.jpg')
_, scale = common.set_resized_input(
    interpreter, image.size, lambda size: image.resize(size, PIL.Image.Resampling.LANCZOS))

# Run inference
interpreter.invoke()
objs = detect.get_objects(interpreter, score_threshold=0.4, image_scale=scale)

# Resize again to a reasonable size for display
display_width = 500
scale_factor = display_width / image.width
height_ratio = image.height / image.width
image = image.resize((display_width, int(display_width * height_ratio)))
draw_objects(ImageDraw.Draw(image), objs, scale_factor, labels)
image.save("output.jpg")

-------------------------------------------------------------------------- 

il risultato e' l'immagine di apertura del post

A questo punto si compilano i modelli per poter girare su Coral Dev Mini Board installando il compilatore sul PC

wget -O- https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/coral-edgetpu.gpg

apt-get update
apt-get install edgetpu-compiler

e poi lanciando la compilazione con

edgetpu_compiler efficientdet-lite-litter.tflite -d --num_segments=1

a questo punto si copiano i file del modello sulla Dev Board 

scp efficientdet-lite-litter_edgetpu.tflite mendel@192.168.100.2:/home/mendel

e si lancia

python3 detect_image.py --model efficientdet-lite-litter_edgetpu.tflite --labels litter-labels.txt --input CD_10196_jpg.rf.4a2b1adf824f2a18a7eea764b9012f36.jpg --output output.jpg


----INFERENCE TIME----
Note: The first inference is slow because it includes loading the model into Edge TPU memory.
347.37 ms
182.40 ms
181.49 ms
178.24 ms
182.33 ms
-------RESULTS--------
Styrofoam_Piece
  id:     11
  score:  0.453125
  bbox:   BBox(xmin=248, ymin=132, xmax=279, ymax=171)
PET_Bottle
  id:     4
  score:  0.4375
  bbox:   BBox(xmin=274, ymin=206, xmax=299, ymax=246)

 


Attenzione che la versione del runtime del compilatore deve essere compatibile con le librerie sulla Dev Board. In una prima prova avevo avuto l'errore

RuntimeError: Failed to prepare for TPU. Failed precondition: Package requires runtime version (14), which is newer than this runtime version (13).Node number 7 (EdgeTpuDelegateForCustomOp) failed to prepare.

ed infatti il comando  edgetpu_compiler --version rispondeva
Edge TPU Compiler version 16.0.384591198

mentre la runtime version era

python3 -c "import pycoral.utils.edgetpu; print(pycoral.utils.edgetpu.get_runtime_version())"
BuildLabel(COMPILER=6.3.0 20170516,DATE=redacted,TIME=redacted), RuntimeVersion(13)

Questo era dovuto al fatto che apt non scaricava gli aggiornamenti a causa della firma GPG scaduta dei repository Google Coral 

Il problema si e' risolto con

wget -O- https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/coral-edgetpu.gpg


venerdì 8 marzo 2024

Realsense Docker

Aggiornamento:

Il container e' disponibile gia' compilato su Docker.com al mio account

https://hub.docker.com/repository/docker/c1p81/realsense_2004/general

 ============================================

Ho deciso di tirare fuori dal cassetto la D415 Realsense e come al solito montare l'SDK diventa sempre piu' difficile a causa delle politiche di Intel di dismissione dei propri dispositivi


 

Stavolta volevo provare la strada dell'ambiente docker ma ne' il container ufficiale ne' alcuni trovati su docker hub risultavano completamente funzionanti e me lo sono scritto da solo

(da modificare l'image_id)

Bash

docker run -it --rm  --privileged  -v /dev:/dev  -v "$HOME:/home/luca/"   --device-cgroup-rule "c 81:* rmw"     --device-cgroup-rule "c 189:* rmw"   b105279d1264 /bin/bash

Realsense Viewer

xhost +

docker run -d  --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw"   -v /dev:/dev    --device-cgroup-rule "c 81:* rmw"     --device-cgroup-rule "c 189:* rmw"   2bd94ff6bc38 realsense-viewer

 

Save to disk

docker run -it --rm --privileged    -v /dev:/dev  -v "$HOME:/home/luca/"   --device-cgroup-rule "c 81:* rmw"     --device-cgroup-rule "c 189:* rmw"   34ea465a203e sh -c "cd /home/luca && rs-save-to-disk"

per creare il docker si usa il comando

docker build -t 20_04_real .

con il seguente Dockerfile


FROM public.ecr.aws/lts/ubuntu:20.04_stable

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update \
&& apt-get install -qq -y --no-install-recommends \
build-essential \
cmake \
lsb-release \
git \
curl \
libssl-dev \
libusb-1.0-0-dev \
pkg-config \
libudev-dev \
libgtk-3-dev \
libglfw3-dev \
libgl1-mesa-dev \
libglu1-mesa-dev \
curl \
python3 \
python3-dev \
python3-pip \
libopencv-dev \
python3-opencv \
python3-numpy \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*


RUN mkdir -p /etc/apt/keyrings
RUN curl -sSf https://librealsense.intel.com/Debian/librealsense.pgp | tee /etc/apt/keyrings/librealsense.pgp > /dev/null


RUN echo "deb [signed-by=/etc/apt/keyrings/librealsense.pgp] https://librealsense.intel.com/Debian/apt-repo `lsb_release -cs` main" | tee /etc/apt/sources.list.d/librealsense.list
RUN apt-get update


RUN apt-get -y install librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg librealsense2-udev-rules mc nano locales
RUN apt-get clean
RUN pip install pyrealsense2

RUN git clone https://github.com/IntelRealSense/librealsense
RUN cd librealsense
RUN mkdir /librealsense/build
WORKDIR /librealsense/build
RUN cmake ../ -DBUILD_EXAMPLES=true
RUN make

giovedì 28 dicembre 2023

Docker Compose esempio

 In ufficio stanno spingendo per utilizzare docker per ogni applicazione

Per rendere lo sviluppo piu' tracciabile viene richiesto che oltre al docker file vi sia anche il file yaml di docker compose (in pratica le impostazioni del container che si dovrebbero passare sulla linea di comando sono scritti nel file compose.yaml

con build . (punto) viene indicato di usare il dockerfile compreso nello stesso folder

Per lanciare si usa

docker compose up -d

alla fine della costruzione dell'immagine viene fatto in automatico lo start

Si accede quindi con

docker exec -it Omnia bash

si termina con

docker compose stop

version: '3'

services:
omnia_apuane:
build: .
container_name: Omnia
ports:
- "9192:80"
dns:
- "10.100.1.3"
environment:
- HOST=omnia
- VIRTUAL_HOST=omnia.aaaa.aaaa.it
- VIRTUAL_PROTO=http
- VIRTUAL_PORT=80
- TZ=Europe/Rome
restart: always
network_mode: bridge

mercoledì 8 novembre 2023

R 3.6 docker personalizzato

 Un esempio di Dockerfile complesso per R 3.6



FROM rstudio/r-base:3.6-bookworm

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -y update
RUN apt-get -y install gdal-bin libgdal-dev libpng-dev libudunits2-dev libfontconfig1-dev libmagick++-dev openjdk-17-jdk apache2 mc nano locales && apt-get clean




RUN service apache2 restart


#ENTRYPOINT ["/usr/sbin/apache2", "-k", "start"]
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]

CMD apachectl -D FOREGROUND

# installa client Oracle
RUN wget https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-23.2.0.178.1027.zip && unzip sqlcl*.zip
ENV PATH=sqlcl/bin:$PATH


#imposta la localizzazione italiana
RUN sed -i -e 's/# it_IT.UTF-8 UTF-8/it_IT.UTF-8 UTF-8/' /etc/locale.gen && locale-gen
ENV LANG it_IT.UTF-8
ENV LANGUAGE it_IT:it
ENV LC_ALL it_IT.UTF-8

# imposta la timezone a Europe/Rome
ENV TZ="Europe/Rome"

# scarica il sorgente della libreria non presente su CRAN
RUN curl -O "https://cran.r-project.org/src/contrib/Archive/randomForest/randomForest_4.6-10.tar.gz"
#setup R configs
RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile
RUN Rscript -e "install.packages('zoo')"
RUN Rscript -e "install.packages('leaflet')"
RUN Rscript -e "install.packages('sf')"
RUN Rscript -e "install.packages('leafpop')"
RUN Rscript -e "install.packages('forecast')"
RUN Rscript -e "install.packages('stringr')"
RUN Rscript -e "install.packages('lubridate')"
RUN Rscript -e "install.packages('randomForest_4.6-10.tar.gz', repos = NULL, type='source')"
RUN Rscript -e "install.packages('rpart')"
RUN Rscript -e "install.packages('e1071')"
RUN Rscript -e "install.packages('kknn')"
RUN Rscript -e "install.packages('jpeg')"
RUN Rscript -e "install.packages('data.table')"
RUN Rscript -e "install.packages('tidyr')"
RUN Rscript -e "install.packages('magick')"
RUN Rscript -e "install.packages('leaflet.extras')"
RUN Rscript -e "install.packages('leafem')"
RUN Rscript -e "install.packages('raster')"

# copia i file
ADD go.sh /root/go.sh
ADD omnia_apuane_spool.sql /root/omnia_apuane_spool.sql
ADD omnia_apuane.R /root/omnia_apuane.R
ADD omnia_arno.R /root/omnia_arno.R
ADD omnia_laguna.R /root/omnia_laguna.R

#crea folders in html
RUN mkdir /var/www/html/mappe
RUN mkdir /var/www/html/mappe/omnia_apuane
RUN mkdir /var/www/html/Acque
RUN mkdir /var/www/html/Acque/LAGUNA
RUN mkdir /var/www/html/Acque/ARNO
RUN mkdir /var/www/html/Acque/ARNO/bollettini


# per il ROracle
ADD instantclient-basic-linux.x64-21.11.0.0.0dbru.zip instantclient-basic-linux.x64-21.11.0.0.0dbru.zip
ADD instantclient-sdk-linux.x64-21.11.0.0.0dbru.zip instantclient-sdk-linux.x64-21.11.0.0.0dbru.zip
# ATTENZIONE il comando ADD decompatta in automatico
# i file tar.gz. Per questo motivo la riga successiva usa COPY
COPY ROracle_1.3-2_R_x86_64-linux-gnu.tar.gz /root/ROracle_1.3-2_R_x86_64-linux-gnu.tar.gz

RUN unzip instantclient-basic-linux.x64-21.11.0.0.0dbru.zip -d /opt/oracle/
RUN unzip instantclient-sdk-linux.x64-21.11.0.0.0dbru.zip -d /opt/oracle/

RUN apt-get install -y libaio1
ENV PATH="${PATH}:/opt/oracle/instantclient_21_11"
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/oracle/instantclient_21_11"

RUN ldconfig

# compila ROracle
RUN Rscript -e 'install.packages("/root/ROracle_1.3-2_R_x86_64-linux-gnu.tar.gz",repos=NULL,type="source")'
RUN Rscript -e "install.packages('RCurl')"
RUN Rscript -e "install.packages('stringr')"


#cancella i file temporanei
RUN rm randomForest_4.6-10.tar.gz
RUN rm sqlcl*.zip
RUN rm /root/*.tar.gz
RUN rm /root/*.zip

Docker pull via http_proxy

 la configurazione del proxy per effettuare un pull di un container docker si trova in

/etc/systemd/system/docker.service.d/http-proxy.conf

ed ha una sintassi del tipo

[Service]
Environment="HTTP_PROXY=http://proxy.aaaaaaaaaa.it:8080"
Environment="HTTPS_PROXY=http://proxy.aaaaaaaaaa.it:8080"

per rendere effettive le modifiche 

systemctl stop docker

systemctl stop docker.socket

systemctl daemon-reload

systemctl start docker

martedì 17 ottobre 2023

Small docker for Golang apps

 In ufficio oramai una applicazione non puo' andare in produzione se non e' in in container...anche se e' occupa pochissimo spazio disco...il che vuol dire che si deve cercare di ottimizzare l'occupazione dello spazio disco del container

Nel Dockerfile sottostante viene utilizzato un docker con compilatore per generare un eseguibile che sara' poi copiato in un docker minimale di produzione basato su Alpine



FROM golang as builder
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN https_proxy=http://proxy.toscana.it:8080 go get github.com/go-resty/resty/v2
RUN https_proxy=http://proxy.toscana.it:8080 go get github.com/sijms/go-ora/v2

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .

FROM alpine:latest

RUN apk --no-cache add ca-certificates
WORKDIR /root
COPY --from=builder /app/myapp .

mercoledì 11 ottobre 2023

Proxy server e Docker

Oramai mi trovo sempre piu' spesso a litigare con il mio proxy a lavoro (telelavorando a casa questo problema nono esiste). Per effettuare il download di una immagine docker da dietro ad un proxy in Linux si deve creare il file 

sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

inserendo le impostazioni del proxy (settare le variabili di ambiente http_proxy non funziona)

[Service]
Environment="HTTP_PROXY=http://proxy.aaaaa.it:8080"
Environment="HTTPS_PROXY=http://proxy.aaaaa.toscana.it:8080"

e si riavvia il servizio 

sudo systemctl daemon-reload

sudo systemctl restart docker 

mercoledì 23 agosto 2023

Installare R packages in docker

A causa di una applicazione legacy dovevo dovevo usare R ver 3 che non eà compatibile con R ver 4 (era esclusa la riscittura del codice) 




Dopo un po' di tentativi la strada piu' lineare e' stata quella di creare un container con il seguente Dockerfile che installa anche tutti i packages delle dipendenze

FROM rstudio/r-base:3.6-bookworm
RUN apt-get -y update
RUN apt-get -y install gdal-bin libgdal-dev libpng-dev libudunits2-dev libfontconfig1-dev libmagick++-dev
RUN curl -O "https://cran.r-project.org/src/contrib/Archive/randomForest/randomForest_4.6-10.tar.gz"

#setup R configs
RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile
RUN Rscript -e "install.packages('zoo')"
RUN Rscript -e "install.packages('leaflet')"
RUN Rscript -e "install.packages('sf')"
RUN Rscript -e "install.packages('leafpop')"
RUN Rscript -e "install.packages('forecast')"
RUN Rscript -e "install.packages('stringr')"
RUN Rscript -e "install.packages('lubridate')"
RUN Rscript -e "install.packages('randomForest_4.6-10.tar.gz', repos = NULL, type='source')"
RUN Rscript -e "install.packages('rpart')"
RUN Rscript -e "install.packages('e1071')"
RUN Rscript -e "install.packages('kknn')"
RUN Rscript -e "install.packages('jpeg')"
RUN Rscript -e "install.packages('data.table')"
RUN Rscript -e "install.packages('tidyr')"
RUN Rscript -e "install.packages('magick')"
RUN Rscript -e "install.packages('leaflet.extras')"
RUN Rscript -e "install.packages('leafem')"
RUN Rscript -e "install.packages('raster')"

docker build -t nome_docker .


Per usare il container

docker run --rm -it -v /home/luca:/mnt nome_docker bash

(se si omette bash entra direttamente nel prompt di R)



domenica 20 novembre 2022

Aggiornamento automatico temi Geoserver

Questo post serve a dare una procedura per effettuare un aggiornamento automatico di un tematismo raster con Geoserver




Prima di tutto si utilizza per semplicita' un container docker per lanciare il server

sudo docker run -it -p 8085:8080 --mount src="/home/luca/geoserver_data",target=/opt/geoserver_data/,type=bind docker.osgeo.org/geoserver:2.21.1

il server viene esposto su porta 8085 ed i dati sono da mettere nel folder /home/luca/geoserve

Per amministrare Geoserver si punta questo indirizzo
http://localhost:8085/geoserver/web

si aggiunge uno Store selezionando Geotiff, si seleziona lo WorkSpace (se non esiste va configurato prima), in Connection Parameters Url si clicca Browse e si seleziona il file raster di interesse
Dopo di cio si deve cliccare Enabled e Publish per rendere effettiva la visualizzazione

Per visualizzare il layer WMS Geoserver in Qgis si aggiunge nuovo layer WMS con indirizzo 
http://localhost:8085/geoserver/wms/
e poi si seleziona il tema da visualizzare
  

sabato 18 gennaio 2020

Copiare docker container su diverse macchine

Per spostare un container tra due macchine si procede prima creando un file .tar con docker save

docker save -o /home/luca/container.tar DOCKER_ID



per avere un tgz si puo' usare

docker save DOCKER_ID | gzip -c > container.tar.gz

una volta copiato il file sulla seconda macchina il container puo' essere installato con

docker load -i container.tar

facendo cosi' si avranno Repository e Tag impostati a <none>. Per completare il lavoro si usa

docker image tag DOCKER_ID nome_repository nome_tag 

con DOCKER_ID recuperato tramite il comando docker image ls e impostando il nome_repository con la sintassi per esempio tensorflow/tensorflow mentre il nome_tag puo' essere per esempio latest

mercoledì 15 gennaio 2020

Jupyter notebook inside docker

Per poter utilizzare un Notebook Jupyter contenuto all'interno di un container docker si avvia prima il container con una sintassi del tipo


docker run -it --rm -p8888:8888 -v /home/luca/Downloads/time-series-forecasting-rnn-tensorflow-master:/tmp2 -w /tmp2  intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3

montando la directory esterna al docker dove sono contenuti i notebook

a questo punto dall'interno del container si lancia

jupyter notebook --ip 0.0.0.0 --no-browser --allow-root


Docker tensorflow ottimizzato per Intel

Usando la versione standard di Tensorflow distribuita da Google si nota il messaggio "Your CPU supports instructions that this Tensorflow binary was not compiled to use: AVX2 FMA"

Questo perche' la versione distribuita e' compilata per funzionare su un ampio spettro di calcolatori

La soluzione per avere una versione ottimizzata per tutte le istruzioni della CPU e' quella di compilare da sorgenti Tensorflow oppure di utilizzare dei container docker che gia' hanno il codice compilato ottimizzato. In questo senso vengono utili i container prodotti da Intel con il supporto MKL (Math Kernel for Deep Neural Network)

Vi sono versioni con Python 2.7
docker run -it -p 8888:8888 intelaipg/intel-optimized-tensorflow

e Python 3.6
docker run -it -p 8888:8888 intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3




Per modificare in modo permanente il container con le librerie di normale uso si lancia

docker run -it intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3 /bin/bash 

e con pip si installano normalmente le librerie Python (per esempio Pandas, Matplotlib...)
al termine si fa exit e con 

docker ps -a 

si copia l'ID del container modificato. A questo punto con commit si modifica in modo definitivo il container

docker commit Docker_ID intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3





venerdì 13 dicembre 2019

Tensorflow on Docker

Oltre ad usare Tensorflow in un virtualenv si puo' impiegare anche un Docker (per una configurazione in modalita' GPU e' anche piu' semplice ) che deriva da una immagine Ubuntu
Si installa tramite

docker pull tensorflow/tensorflow 

Using default tag: latest
latest: Pulling from tensorflow/tensorflow
5667fdb72017: Pull complete
d83811f270d5: Pull complete
ee671aafb583: Pull complete
7fc152dfb3a6: Pull complete
485ea80d093d: Pull complete
e4021511b813: Pull complete
f0f976467b2c: Pull complete
788284490e67: Pull complete
134a5eeb528f: Pull complete
a4d8f6645f3b: Pull complete
db9d0640a96e: Pull complete
Digest: sha256:6d1df66ddf8e5aca56cedd4f333df124132a684dec70f881da687ef2e29f8831
Status: Downloaded newer image for tensorflow/tensorflow:latest
docker.io/tensorflow/tensorflow:latest

Si puo' testare aprendo una shell
root@debian:/home/luca# docker run -it --rm tensorflow/tensorflow bash

________                               _______________               
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ /
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...


Per usare i propri file senza duplicarli su docker si puo' montare la propria home all'interno del docker (in questo caso la cartella in /home/luca/tensor/keras2/train_1500el_5classi viene montata su -tmp2 (attenzione a non usare /tmp perche' manda in crisi apt e non si puo' installare piu' niente)


docker run -it --rm -v $PWD/tensor/keras2/train_1500el_5classi:/tmp2 -w /tmp2 tensorflow/tensorflow


per installare i moduli dentro a docker si procede con pip come di norma

apt-get install python-tk
pip install Pillow
pip install SciPy

Se si vuole cancellare l'immagine si procede

root@debian:/home/luca# docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
tensorflow/tensorflow      latest              d64a95598d6c        2 months ago        1.03GB

root@debian:/home/luca# docker rmi d64a95598d6c

Untagged: tensorflow/tensorflow:latest
Untagged: tensorflow/tensorflow@sha256:6d1df66ddf8e5aca56cedd4f333df124132a684dec70f881da687ef2e29f8831
Deleted: sha256:d64a95598d6cfe0a472112589a2ed67cca21cb5d396d05dc304de9566d67de0f
Deleted: sha256:63d2e2a77e38788dc432866f4feeca36fc9469c4cc131583805b4b7d03552903
Deleted: sha256:7967455aa075896a12daaa2bb4a48b99b63f14b03dd80c09d6fba83b46b6f07b
Deleted: sha256:45d06edb6ecd5222ff22418d8649b8d74dc5cf30991f83eff595b6cd215d77bb
Deleted: sha256:e015b1c8d255426cd9d36475727d257a080ea865e3e0519f12c364464f1e5ef3
Deleted: sha256:dbaaffa3e9690ebc6710bcd9b11a986ccfe35340edecc3e2da1ad06325e5b646
Deleted: sha256:2d6aa956b10ffb80ab7bd53d124d34bb6d5d7b798a3d00d530bcec9408aaa4ae
Deleted: sha256:aee95a60862058fa4688fbe1252a7d4848695163add09c7c53af6071649f2aeb
Deleted: sha256:bd416bed302bc2f061a2f6848a565483a5f265932d2d4fa287ef511b7d1151c8
Deleted: sha256:5308e2e4a70bd4344383b8de54f8a52b62c41afb5caa16310326debd1499b748
Deleted: sha256:dab02287e04c8b8207210b90b4056bd865fcfab91469f39a1654075f550c5592
Deleted: sha256:a1aa3da2a80a775df55e880b094a1a8de19b919435ad0c71c29a0983d64e65db

venerdì 27 gennaio 2017

Docker su Centos 7

Ho provato a dare un'occhiata ai Container per un eventuale utilizzo parallelo a sostitutivo di alcune macchine virtuale. Quali sono le principali differenze:




Un container usa lo stesso kernel del SO principale cosi' come le librerie e la memoria e questo genera un risparmio sensibile di risorse delle macchina
In generale un Container utilizza un solo applicativo (Web Server, Sql Server) ed come regola generale i dati non sono contenuti nel container; da cio' deriva che non e' necessario delle immagini disco (con poi la necessita' di espanderle) e i Container hanno dimensioni di qualche decina di Mb e non delle centinaia di Mb come accade per le immagini

Un problema serio e' pero' il grado di isolamento. Se viene compromesso un servizio di una macchina virtuale la macchina host risulta salva. Vi sono invece notizie di compromissioni d container che permettono di attaccare il sistema operativo host

Queste sono le regole auree riportate da Red Hat

1) Don’t store data in containers
2) Don’t ship your application in two pieces
3) Don’t create large images
4) Don’t use a single layer image
5) Don’t create images from running containers (questo vuol dire di non usare i commit ma i dockerfile per creare un nuovo container)
6) Don’t use only the “latest” tag
7) Don’t run more than one process in a single container
8) Don’t store credentials in the image. Use environment variables
9) Don’t run processes as a root user
10) Don’t rely on IP addresses
per installare Docker su Centos 7 si inizia aggiungendo il repository

yum-config-manager \ --add-repo \ https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo

e si installa la docker engine

yum -y install docker-engine makecache fast
si avvia quindi il servizio

service docker start

una volta installata la engine si inizia ad installare i container.
In generale un container si puo' installare mediante il comando pull ma se si lancia il comando run ed il container non e' installato allora sara' automaticamente installato

Per vedere  che  tutto funzioni la base e' installare questi due container

docker run hello-world
docker run docker/whalesay cowsay boo

il secondo mostra semplicemente il logo di Docker
dei container gia' pronti con le applicazioni piu' comuni si possono scaricare da Docker Store

la lista dei container si ottiene mediante
docker images

mentre il carico di lavoro mediante
docker ps

per entrare in shell sulla container si usa
docker run -i -t  [nome_container] /bin/bash

i container si stoppano con
docker stop [nome_container]

per aggiornare un container, visto che i dati risiedono nel file system normale dell'host, e' sufficiente stoppare il container, distruggerlo ed effettuare il pull della nuova immagine

Due esempi di comandi per lanciare dei servizi container
Apache (container httpd:alpine  docker pull httpd:alpine)
docker run -d -p 8080:80 --name apache -v /home/linnocenti/docker/:/usr/local/apache2/htdocs/ httpd:alpine

La prima cosa da notare e' il forwarding della porta 80 del container verso la porta 8080 dell'host (per questo il container e' raggiungibile su http://localhost:8080)
La seconda e' che i file html statici sono depositati nel filesystem dell'host (/home/linnocenti/docker)


MySql (container mysql  docker pull mysql)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

Nel caso in cui si dovesse fare una installazione LAMP il container Httpd deve riuscire ad interagire con Mysql..questo e' effettuato mediante lo switch link




docker run --name lamp --link some-mysql -d httpd:alpine

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...