Scrivo questi appunti come forma di esercizio personale per approfondire l’argomento e cercare di fissare nella mia mente i concetti che vi stanno dietro.
Come sviluppatori web rails usiamo docker insieme a rails tutti i giorni sia in ambiente di sviluppo che in produzione con evidente vantaggi. Purtroppo il concetto di entrypoint mi affatica e non mi è del tutto chiaro quindi ho deciso di approfondirlo scrivendo questo articolo.
ENTRYPOINT è uno dei comandi disponibili all’interno di un Dockerfile.
L’istruzione ENTRYPOINT si usa per eseguire dei comandi dopo l’inizializzazione del container.
Ad esempio, in un progetto rails, può essere eseguito in ambiente di sviluppo, per eseguire il comando bundle.
Possono essere usate due forme:
# Modalità "shell"
ENTRYPOINT esegui un comando
# Modalità "exec" (la modalità da preferire seconda la guida ufficiale di docker)
ENTRYPOINT ["esegui", "un", "comando"]
Le due forme comportano diverse conseguenze:
– la modalità shell esegue il comando all’interno di una shell (/bin/sh-c)
– la modalità exec aggiunge l’istruzione senza includerla all’interno di una shell
Personalmente uso un file bash come entrypoint; ad esempio:
# docker-compose.yml
services:
web:
build: .
command: ['rails', 'server', '-b', '0']
volumes:
- .:/app
- bundle_cache:/usr/local/bundle
ports:
- 3000:3000
entrypoint: ./docker-entrypoint.sh
Di conseguenza questo potrebbe essere un entrypoint.sh da posizionare all'interno della cartella principale del progetto.
# docker-entrypoint.sh
#!/bin/sh
set -e
# Operazioni personalizzate prima dell'avvio del servizio principale
# Esempio: Impostazione delle variabili di ambiente
export MY_VARIABLE="valore"
echo "bundle"
bundle
echo "rails db:migrate"
rails db:migrate
echo "npm install"
npm install
# Esempio: Esecuzione di altri comandi o script
# Avvio del servizio principale
exec "$@"
Fonti:
Rispondi