#!/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 ___________