È la prima volta che lavoro con Docker e non sono sicuro se sto facendo bene le cose.Docker, come eseguire il file .sql in un'immagine?
Ho un applicazioni Rails che dipende da un database diMysql, quindi ho configurato il file docker-compose.yml
in questo modo:
db:
image: library/mysql:5.6
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
expose:
- "3306"
ports:
- "3306:3306"
rails-app:
build: .
dockerfile: Dockerfile
environment:
RAILS_ENV: development
links:
- db
volumes:
- ".:/home/app"
volumes_from:
- bundle
... omitted lines ...
Poi, se corro il seguente:
$ docker-compose run db mysql --host=$DOCKER_LOCALHOST --port=3306 --protocol=tcp -u root < shared/create_common_tables.sql
ottengo questo errore:
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.99.100' (111)
questo sou nds normale, perché ho il sospetto che devo build
prima di un contenitore che si collega a db
.
Lo so perché se corro questo in questo ordine:
$ docker-compose build rails-app
$ docker-compose run -e RAILS_ENV=development rails-app bundle
$ docker-compose run -e RAILS_ENV=development rails-app bundle exec rake db:create
$ docker-compose run db mysql --host=$DOCKER_LOCALHOST --port=3306 --protocol=tcp -u root < shared/create_common_tables.sql
Funziona benissimo.
Ma, come posso eseguire questo SQL prima di creare qualsiasi contenitore?
L'immagine docker MySQL ha già un meccanismo per inizializzare un nuovo contenitore con i dati. Carica tutti i file .sh e .sql da /docker-entrypoint-initdb.d, è sufficiente copiare o montare dall'host alla directory. Vedere https://hub.docker.com/_/mysql/ in "Inizializzazione di una nuova istanza" – diwo
Sì, ma quel meccanismo non si adatta al requisito nella domanda "come posso fare per eseguire questo sql prima di creare qualsiasi contenitore". Personalmente non penso che i dispositivi di carico come parte del punto di accesso siano una buona soluzione. Richiede di ripetere il processo ogni volta che si crea il contenitore, il che rallenta notevolmente il tempo di avvio. – dnephin