But why though??
The website I’m currently working on is made up of 5 networked Docker containers, 1 of which (the database) is running a MySQL instance. We also use 3 different hosts (dev
, test
, and prod
), all of which are running their own instances of these containers.
Anywaaay, by putting the function below in your .bashrc
you can simply run sql [server1, server2, server3]
and the function will:
- SSH to the specified host
- Source a file containing that host’s MySQL credentials and store the password in a
$DB_MYSQL_PASSWORD
- Inspect the running database container, and pipe that into
jq
, which is used to grab that container’s local IP address, which is then stored in$ip
- Using that information, connect to the running Docker container using the MySQL CLI
sql()
Note: Server needs to have jq
installed.
sql() {
case $1 in
"server1") ssh -t user@server1.com 'source /path/to/mysql/credentials.env; ip=$(sudo docker inspect mysql_docker_img | jq --raw-output .[].NetworkSettings.Networks.docker_network_name.IPAddress); mysql -h $ip -P3306 -u root -p$DB_MYSQL_PASSWORD';;
"server2") ssh -t user@server2.com 'source /path/to/mysql/credentials.env; ip=$(sudo docker inspect mysql_docker_img | jq --raw-output .[].NetworkSettings.Networks.docker_network_name.IPAddress); mysql -h $ip -P3306 -u root -p$DB_MYSQL_PASSWORD';;
"server3") ssh -t user@server3.com 'source /path/to/mysql/credentials.env; ip=$(sudo docker inspect mysql_docker_img | jq --raw-output .[].NetworkSettings.Networks.docker_network_name.IPAddress); mysql -h $ip -P3306 -u root -p$DB_MYSQL_PASSWORD';;
esac
}