Skip to content

Instantly share code, notes, and snippets.

@ds0nt
Created October 13, 2015 14:50
Show Gist options
  • Select an option

  • Save ds0nt/cb9b5ea563e5d8ffa919 to your computer and use it in GitHub Desktop.

Select an option

Save ds0nt/cb9b5ea563e5d8ffa919 to your computer and use it in GitHub Desktop.

Revisions

  1. ds0nt created this gist Oct 13, 2015.
    163 changes: 163 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,163 @@
    #!/bin/bash

    can_base() {
    _base=`pwd`/$1
    }

    can_container() {
    local name="$1"
    local image="$2"
    _name=$name
    _image=$image
    _command=
    _context="$_base/$name"

    mkdir -p "$_context"
    echo -n "" > "$_context/env"
    echo -n "" > "$_context/ports"
    echo -n "" > "$_context/open_ports"
    }

    can_volume() {
    local volume="$1"
    mkdir -p "$_context$volume"
    }

    can_environment() {
    local variable="$1"
    local value="$2"
    echo "$variable=$value" >> "$_context/env"
    }

    can_volumes() {
    # recurses directory tree taking only the most distant leafs /db/data will not return /db
    dirmax=`pwd`
    local volumes=$(cd $_context; ls ** -R | grep ":" | sort -r | sed -e "s/://g" | while read x; do
    if ! echo $dirmax | grep $x 1>/dev/null; then
    dirmax=$(echo $x)
    echo $dirmax
    fi
    done; cd - 1>/dev/null)
    for volume in $volumes; do
    echo -v $_context/$volume:/$volume
    done | xargs echo
    }

    can_envfile() {
    echo --env-file=\"$_context/env\"
    }

    can_port() {
    local port=$1
    echo "$port" >> "$_context/ports"
    }

    can_open_port() {
    local port=$1
    echo "$port" >> "$_context/open_ports"
    }

    can_ports () {
    for port in $(cat "$_context/ports" | xargs); do
    echo -p $port
    done | xargs echo
    }

    can_open_ports () {
    for port in $(cat "$_context/open_ports" | xargs); do
    echo -p $port:$port
    done | xargs echo
    }

    can_cp() {
    docker run --name=tmp-$_name $_image sh
    docker cp $1 tmp-$_name:$2
    _image=$(docker commit tmp-$_name)
    docker rm tmp-$_name
    }

    can_cmd() {
    _command=$1
    }

    can_dae() {
    docker stop $_name
    docker rm $_name
    docker start $_name 2>/dev/null || docker run -d $(can_volumes) $(can_envfile) $(can_open_ports) --name=$_name $_image $_command
    }

    can_i_have_port() {
    port=$1
    docker port $_name | grep $port | cut -d\: -f2
    }
    set -v
    can_base .docker

    can_container markdown-mysql orchardup/mysql
    can_environment MYSQL_DATABASE markdown-mysql
    can_port 3306
    can_volume "/data"
    can_dae
    mysql_port=$(can_i_have_port 3306)


    can_container markdown-redis redis
    can_port 6379
    can_volume "/data"
    can_dae
    redis_port=$(can_i_have_port 6379)

    can_container markdown-app alpine
    can_environment REDIS_SERVER markdown-redis:$redis_port
    can_environment MYSQL_CONNECTION_STRING "root@(markdown-mysql:$mysql_port)/markdown-mysql?charset=utf8&parseTime=True"
    can_port 8080
    can_port 5000
    can_cp . /app
    can_cmd app/markdown
    can_dae
    http_port=$(can_i_have_port 8080)
    api_port=$(can_i_have_port 5000)

    can_container markdown-proxy dockerfile/haproxy
    can_volume "/haproxy-override"
    can_open_port 80
    can_open_port 5000

    tee > .docker/markdown-proxy/haproxy-override/haproxy.cfg <<\
    ___________
    global
    daemon
    maxconn 4096
    defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    frontend http-in
    bind *:80
    bind *:5000
    acl is_web url_port 80
    acl is_api url_port 5000
    use_backend web if is_web
    use_backend api if is_api
    backend web
    balance roundrobin
    option httpclose
    option forwardfor
    server s2 127.0.0.1:$http_port maxconn 32
    backend api
    balance roundrobin
    option httpclose
    option forwardfor
    server s1 127.0.0.1:$api_port maxconn 32
    listen admin
    bind 127.0.0.1:8080
    stats enable
    ___________