From 7b7ed0ad51d4f758e5a281a33465831af696bb29 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Thu, 5 May 2016 11:15:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B6=D0=B5=20=D0=BF=D0=BE=D1=87=D1=82?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=81=D1=91=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BD=D0=BE=20(=D0=BD=D0=BE=20=D1=81=20node-dev-se?= =?UTF-8?q?rver=20=D0=B5=D1=81=D1=82=D1=8C=20=D1=82=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 1 + Dockerfile | 10 +- docker-compose.yml | 106 +++++++++++++------ {nginx => docker/nginx}/Dockerfile | 0 {nginx => docker/nginx}/nginx.conf | 0 wait-for-it.sh | 161 +++++++++++++++++++++++++++++ 6 files changed, 239 insertions(+), 39 deletions(-) rename {nginx => docker/nginx}/Dockerfile (100%) rename {nginx => docker/nginx}/nginx.conf (100%) create mode 100755 wait-for-it.sh diff --git a/.dockerignore b/.dockerignore index 19bcbdb..13ee54e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,3 +6,4 @@ console/config/*-local.php api/runtime console/runtime api/web/assets +#vendor diff --git a/Dockerfile b/Dockerfile index 7577d6f..0f89512 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,12 @@ -#FROM codemix/yii2-base:2.0.8-apache FROM codemix/yii2-base:2.0.8-php-fpm -#FROM codemix/yii2-base:2.0.8-hhvm - # Composer packages are installed first. This will only add packages # that are not already in the yii2-base image. COPY composer.json /var/www/html/ COPY composer.lock /var/www/html/ -RUN composer self-update --no-progress && \ - composer install --no-progress --ignore-platform-reqs + +RUN composer self-update --no-progress \ + && composer install --no-progress --ignore-platform-reqs # Copy the working dir to the image's web root COPY . /var/www/html @@ -17,7 +15,7 @@ COPY . /var/www/html # with local logs and published assets from development. So we need to create # empty dirs and set right permissions inside the container. RUN mkdir api/runtime api/web/assets console/runtime \ - && chown www-data:www-data api/runtime api/web/assets console/runtime + && chown www-data:www-data api/runtime api/web/assets console/runtime # Expose everything under /var/www (vendor + html) # This is only required for the nginx setup diff --git a/docker-compose.yml b/docker-compose.yml index 4c4d378..fb11214 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,36 +1,76 @@ -app: - build: ./ - expose: - - "9000" - volumes: - - ./:/var/www/html/ - links: - - db - environment: - ENABLE_ENV_FILE: 1 - ENABLE_LOCALCONF: 1 - API_TOKEN: "78bb3e46d818793a299ccfcedee213d5ecad07f7" +version: '2' +services: + web: + build: ./docker/nginx + ports: + - "80:80" + links: + - app + volumes_from: + - app -web: - build: ./nginx - ports: - - "8080:80" - links: - - app - volumes_from: - - app + app: + build: . + expose: + - "9000" + volumes: + - ./:/var/www/html/ + links: + - db + - redis + - rabbitmq + depends_on: + - node-dev-server + - app-console-account-queue + environment: + ENABLE_ENV_FILE: 1 + ENABLE_LOCALCONF: 1 + API_TOKEN: "78bb3e46d818793a299ccfcedee213d5ecad07f7" -db: - image: mariadb:10.0 - ports: - - "3306:3306" - expose: - - "3306" - environment: - MYSQL_ROOT_PASSWORD: secret-root - MYSQL_DATABASE: web - MYSQL_USER: web - MYSQL_PASSWORD: web + app-console-account-queue: + image: php:7.0-cli + volumes: + - ./:/var/www/html/ + working_dir: /var/www/html/ + command: ./wait-for-it.sh rabbitmq:5672 -- ./yii account-queue + links: + - db + - redis + - rabbitmq - # Uncomment to autostart at boottime - #restart: always + node-dev-server: + build: ./frontend + ports: + - "8080:8080" + volumes: + - ./frontend/:/usr/src/app/ + - /usr/src/app/node_modules + environment: + DOCKERIZED: "true" + + db: + image: mariadb:10.0 + expose: + - "3306" + environment: + MYSQL_ROOT_PASSWORD: secret-root + MYSQL_DATABASE: ely_accounts + MYSQL_USER: ely-accounts-user + MYSQL_PASSWORD: ely-accounts-password + TERM: dumb + # Uncomment to autostart at boottime + #restart: always + + redis: + image: redis:3.0 + expose: + - "6379" + + rabbitmq: + image: rabbitmq:3.6 + expose: + - "5672" + environment: + RABBITMQ_DEFAULT_USER: ely-accounts-app + RABBITMQ_DEFAULT_PASS: app-password + RABBITMQ_DEFAULT_VHOST: /account.ely.by diff --git a/nginx/Dockerfile b/docker/nginx/Dockerfile similarity index 100% rename from nginx/Dockerfile rename to docker/nginx/Dockerfile diff --git a/nginx/nginx.conf b/docker/nginx/nginx.conf similarity index 100% rename from nginx/nginx.conf rename to docker/nginx/nginx.conf diff --git a/wait-for-it.sh b/wait-for-it.sh new file mode 100755 index 0000000..eca6c3b --- /dev/null +++ b/wait-for-it.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +cmdname=$(basename $0) + +echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $TIMEOUT -gt 0 ]]; then + echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" + else + echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" + fi + start_ts=$(date +%s) + while : + do + (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 + result=$? + if [[ $result -eq 0 ]]; then + end_ts=$(date +%s) + echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" + break + fi + sleep 1 + done + return $result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $QUIET -eq 1 ]]; then + timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + else + timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + fi + PID=$! + trap "kill -INT -$PID" INT + wait $PID + RESULT=$? + if [[ $RESULT -ne 0 ]]; then + echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" + fi + return $RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + hostport=(${1//:/ }) + HOST=${hostport[0]} + PORT=${hostport[1]} + shift 1 + ;; + --child) + CHILD=1 + shift 1 + ;; + -q | --quiet) + QUIET=1 + shift 1 + ;; + -s | --strict) + STRICT=1 + shift 1 + ;; + -h) + HOST="$2" + if [[ $HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + HOST="${1#*=}" + shift 1 + ;; + -p) + PORT="$2" + if [[ $PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + PORT="${1#*=}" + shift 1 + ;; + -t) + TIMEOUT="$2" + if [[ $TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + CLI="$@" + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$HOST" == "" || "$PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +TIMEOUT=${TIMEOUT:-15} +STRICT=${STRICT:-0} +CHILD=${CHILD:-0} +QUIET=${QUIET:-0} + +if [[ $CHILD -gt 0 ]]; then + wait_for + RESULT=$? + exit $RESULT +else + if [[ $TIMEOUT -gt 0 ]]; then + wait_for_wrapper + RESULT=$? + else + wait_for + RESULT=$? + fi +fi + +if [[ $CLI != "" ]]; then + if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then + echoerr "$cmdname: strict mode, refusing to execute subprocess" + exit $RESULT + fi + exec $CLI +else + exit $RESULT +fi