From 60622c5a0027f9ab640738268095022a2e5c1c1b Mon Sep 17 00:00:00 2001 From: Ian Blenke Date: Sat, 11 Jul 2015 23:31:55 -0400 Subject: [PATCH] Adding a working example of docker linked mysql container for issue #887 --- docker/Dockerfile | 10 +++++--- docker/README.md | 17 +++++++++++--- docker/docker-compose.yml | 28 ++++++++++++++++++++++ docker/scripts/init | 45 ++++++++++++++++++++++++++++-------- lib/tasks/database_test.rake | 9 ++++++++ 5 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 docker/docker-compose.yml create mode 100644 lib/tasks/database_test.rake diff --git a/docker/Dockerfile b/docker/Dockerfile index fed77288..fbf0676e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -19,11 +19,15 @@ RUN apt-get update && \ RUN pip install supervisor-stdout -ADD scripts/ /scripts -RUN chmod 755 /scripts/setup /scripts/init - +ADD scripts/setup /scripts/setup +RUN chmod 755 /scripts/setup RUN /scripts/setup +WORKDIR /app + +ADD scripts/init /scripts/init +RUN chmod 755 /scripts/init + VOLUME /var/lib/mysql EXPOSE 5000 diff --git a/docker/README.md b/docker/README.md index de7ede59..55f77e9a 100644 --- a/docker/README.md +++ b/docker/README.md @@ -51,13 +51,15 @@ Simple stand-alone usage: To link to another mysql container, for example: - docker run --rm --name newcentury_mysql -p 3306 \ + docker run --rm --name mysql \ -e HUGINN_MYSQL_DATABASE=huginn \ -e HUGINN_MYSQL_USER=huginn \ -e HUGINN_MYSQL_PASSWORD=somethingsecret \ -e HUGINN_MYSQL_ROOT_PASSWORD=somethingevenmoresecret \ cantino/huginn - docker run --rm --name huginn --link newcentury_mysql:MYSQL -p 5000:5000 \ + docker run --rm --name huginn \ + --link mysql \ + -p 5000:5000 \ -e HUGINN_DATABASE_NAME=huginn \ -e HUGINN_DATABASE_USER=huginn \ -e HUGINN_DATABASE_PASSWORD=somethingsecret \ @@ -65,7 +67,16 @@ To link to another mysql container, for example: To link to another container named 'postgres': - docker run --rm --name huginn --link POSTGRES:mysql -p 5000:5000 -e "DATABASE_USER=huginn" -e "DATABASE_PASSWORD=pass@word" cantino/huginn + docker run --rm --name huginn \ + --link postgres:postgresql \ + -p 5000:5000 \ + -e "HUGINN_DATABASE_USER=huginn" \ + -e "HUGINN_DATABASE_PASSWORD=pass@word" \ + cantino/huginn + +The `docker/` folder also has a `docker-compose.yml` that allows for a sample database formation with a data volume container: + + cd docker ; docker-compose up ## Environment Variables diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..3e84037f --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,28 @@ +mysqldata: + image: mysql + command: true + +mysql: + image: mysql + volumes_from: + - mysqldata + environment: + MYSQL_ROOT_PASSWORD: myrootpassword + MYSQL_DATABASE: huginn + MYSQL_USER: huginn + MYSQL_PASSWORD: myhuginnpassword + +huginn: + build: . + ports: + - 5000:5000 + environment: + HUGINN_DATABASE_NAME: huginn + HUGINN_DATABASE_USERNAME: root + HUGINN_DATABASE_PASSWORD: myrootpassword + INTENTIONALLY_SLEEP: 10 + #DATABASE_INITIAL_CONNECT_MAX_RETRIES: 5 + PORT: 5000 + links: + - mysql + diff --git a/docker/scripts/init b/docker/scripts/init index 934e9a3d..ac365508 100755 --- a/docker/scripts/init +++ b/docker/scripts/init @@ -100,7 +100,7 @@ EOF # wait for mysql server to start (max 120 seconds) timeout=120 - while ! mysqladmin -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1 + while ! mysqladmin -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} status >/dev/null 2>&1 do (( timeout = timeout - 1 )) if [ \$timeout -eq 0 ]; then @@ -111,10 +111,10 @@ EOF sleep 1 done - if ! echo "USE \${DATABASE_NAME}" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then + if ! echo "USE \${DATABASE_NAME}" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} >/dev/null 2>&1; then DB_INIT="yes" echo "CREATE DATABASE IF NOT EXISTS \\\`\${DATABASE_NAME}\\\` DEFAULT CHARACTER SET \\\`utf8\\\` COLLATE \\\`utf8_unicode_ci\\\`;" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} - echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -uroot \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} + echo "GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON \\\`${DATABASE_NAME}\\\`.* TO 'root'@'localhost';" | mysql -u\${DATABASE_USERNAME:-root} \${DATABASE_PASSWORD:+-p\$DATABASE_PASSWORD} fi fi supervisorctl start foreman >/dev/null @@ -142,19 +142,46 @@ cat < /tmp/foreman.sh #!/bin/bash -e source /app/.env -# Assuming we have a created database, run the migrations and seed it idempotently. -[ -z "\${DO_NOT_MIGRATE}" ] && sudo -u huginn -EH bundle exec rake db:migrate -[ -z "\${DO_NOT_SEED}" ] && sudo -u huginn -EH bundle exec rake db:seed +# The database may need to start up for a bit first +if [ -n "\${INTENTIONALLY_SLEEP}" ]; then + echo "Intentionally sleeping \${INTENTIONALLY_SLEEP}" + sleep \${INTENTIONALLY_SLEEP} +fi -[ -n "\$INTENTIONALLY_SLEEP" ] && sleep \$INTENTIONALLY_SLEEP +if [ -n "\${DATABASE_INITIAL_CONNECT_MAX_RETRIES}" ]; then + max=\${DATABASE_INITIAL_CONNECT_MAX_RETRIES} + count=0 + while ! rake mysql_test:ping > /dev/null 2>&1 && [[ \$count -le \$max ]] ; do + count=\$[\$count+1] + echo "Retry \$count of \$max attempting to connect to \$DATABASE_HOST. Sleeping \${DATABASE_INITIAL_CONNECT_SLEEP:5}" + sleep \${DATABASE_INITIAL_CONNECT_SLEEP:5} + done +fi + +# We may need to try and create a database +if [ -n "\${CREATE_DB}" ]; then + sudo -u huginn -EH bundle exec rake db:create +fi + +# Assuming we have a created database, run the migrations and seed it idempotently. +if [ -z "\${DO_NOT_MIGRATE}" ]; then + sudo -u huginn -EH bundle exec rake db:migrate +fi + +if [ -z "\${DO_NOT_SEED}" ]; then + sudo -u huginn -EH bash -xc 'bundle exec rake db:seed &' +fi # Fixup the Procfile and prepare the PORT -[ -n "\${DO_NOT_RUN_JOBS}" ] && perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile +if [ -n "\${DO_NOT_RUN_JOBS}" ]; then + perl -pi -e 's/^jobs:/#jobs:/' /app/Procfile +fi + perl -pi -e 's/rails server\$/rails server -b 0.0.0.0 -p \\\$PORT/' /app/Procfile export PORT # Start huginn -exec sudo -u huginn -EH bundle exec foreman start +exec sudo -u huginn -EH bash -xc 'exec bundle exec foreman start' FOREMAN chmod 755 /tmp/foreman.sh diff --git a/lib/tasks/database_test.rake b/lib/tasks/database_test.rake new file mode 100644 index 00000000..3cca9f1b --- /dev/null +++ b/lib/tasks/database_test.rake @@ -0,0 +1,9 @@ +namespace :database_test do + desc "Ping the database" + task :ping do + require 'active_record' + require 'mysql2' + ActiveRecord::Base.establish_connection + ActiveRecord::Base.connection.verify! + end +end