Docker ha il vantaggio di avere i container che sono ambienti isolati, la struttura risulta essere identica al 100% rispetto all’ambiente di sviluppo ed essere facilmente replicabile tramite immagine.
Il problema però sorge quando l’immagine distribuita manca di qualcosa, tipicamente di una libreria. Avevamo già visto in un articolo precedente che tutto sommato sia facile inserire o sostituire una configurazione. Ma nel caso di una libreria la cosa è più complicata, e la strada dell’utilizzo dei “Volumes” esterni non è praticabile o conveniente.
Prendiamo come reference le librerie aggiuntive di Python. Basterebbe collegarsi alla console del container, dare il comando di installazione del pacchetto e il gioco è apparentemente fatto. Salvo che al primo aggiornamento siamo punto a capo. Docker ovviamente permette di creare immagini, e questo ci viene in aiuto per aggiornarne una esistente.
All’interno del Docker Compose (versione 3 e superiori) infatti possiamo dare una istruzione di Build. Sotto la direttiva “image : organizzazione/nome-progetto : versione” potremo aggiungere questo:
build:
context: .
dockerfile: "./Dockerfile.custom"
DockerfileCome si vede stiamo dicendo di costruire, rispetto all’immagine dichiarata di partenza, un ulteriore aggiunta attraverso i comandi “Dockerfile” che saranno presenti nel file “Dockerfile.custom”, in questo caso nella cartella del progetto.
Per fare un esempio concreto prendo ad esempio il progetto “FreqTrade”, di base questo non viene pubblicato con tutte le librerie, ce ne sono alcune mancanti che però potrebbero essere usate da alcuni file operativi che si chiamano “strategies”. Infatti, se utilizzo un comando interno per verificare lo stato di questi file non solo mi torna un errore, ma dice in modo chiaro che mancano dei moduli di Python.
freqtrade.resolvers.iresolver - WARNING - Could not import /freqtrade/user_data/strategies/Heracles.py due to 'No module named 'ta''
freqtrade.resolvers.iresolver - WARNING - Could not import /freqtrade/user_data/strategies/GodStra.py due to 'No module named 'ta''
+--------------------------------+-------------+----------------+--------------+---------------+--------+
|name | location | status | hyperoptable | buy-Params | sell-Params |
|--------------------------------+-------------+----------------+--------------+---------------+--------|
|-- | Heracles.py | LOAD FAILED | No | 0 | 0 |
|-- | GodStra.py | LOAD FAILED | No | 0 | 0 |
BashCome viene chiaramente indicato manca la libreria “TA” e va installata attraverso un “pip install ta“. Come anticipato sopra andremo a creare un file “Dockerfile.custom” con il contenuto adeguato
FROM freqtradeorg/freqtrade:stable
RUN pip install --user ta finta
DockerfileCome si può notare, nella prima riga siamo andati a fornire il riferimento dell’immagine, e quindi dato il comando (o i comandi) che ci interessa.
A questo punto dobbiamo dare il comando di building e pull sull’immagine originale, che andrà dato via terminale all’interno della cartella dove è presente il file “docker-compose.yml”
docker compose build --pull
Bashse torno a dare il comando che mi effettua un controllo di coerenza delle “strategies” vedremo che il warning è scomparso e la tabella riporta uno status ok.
+-------------------------+----------------------------+----------+----------------+--------------+---------------+
| name | location | status | hyperoptable | buy-Params | sell-Params |
|-------------------------+----------------------------+----------+----------------+--------------+---------------|
| GodStra | GodStra.py | OK | No | 0 | 0 |
| Heracles | Heracles.py | OK | Yes | 4 | 0 |
Bashconclusioni
Nel caso specifico ho usato un progetto in Python, ma se avete intuito il concetto di base questo può essere esteso a qualunque altro ambiente necessiti di librerie, aggiunte o anche l’esecuzione di un Bash script che modifica o aggiunge parametri al sistema operativo di base.