FROM mhart/alpine-node:6

# Hello! This Dockerfile is currently coded with an aim for final build image size
# It uses _one_ single RUN phase and thus caches very poorly.
# A nice TODO would be to rewrite this with an aim for docker cache hits and then
# use something like "docker-squash" in the CI chain (and build.sh)

WORKDIR /sqlsidecar
ADD . .

RUN \
    mkdir -p tmp && \
    # Deps:
    echo -n "- Installing apt deps... " && \
    START_TIME=$(date +%s) && \
    apk add --update \
      # Packages we'll keep into production
      bash \
      # Packages what will be removed laters
      git > tmp/apt.log 2>&1 || (cat tmp/apt.log && false) && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    echo -n "- Installing NPM deps... " && \
    START_TIME=$(date +%s) && \
    yarn && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    # Build:
    echo -n "- Building project... " && \
    START_TIME=$(date +%s) && \
    EXIT_ON_ERRORS=true ./node_modules/.bin/gulp && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    # Test:
    echo -n "- Linting... " && \
    START_TIME=$(date +%s) && \
    bash ./bin/lint.sh && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    echo -n "- Unit testing... " && \
    START_TIME=$(date +%s) && \
    NO_COMPOSE_UP=true bash ./bin/unit_test.sh 2>&1 && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    echo -n "- Node Security check... " && \
    START_TIME=$(date +%s) && \
    ./bin/nsp.sh && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    echo -n "- NPM dep check... " && \
    START_TIME=$(date +%s) && \
    bash ./bin/depcheck.sh && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    # Cleanup
    echo -n "- Pruning deps and cleaning... " && \
    START_TIME=$(date +%s) && \
    npm prune --production > /dev/null 2>&1 && \
    apk del git > /dev/null 2>&1 && \
    npm cache clean && \
    rm -rf /var/cache/apk/* src tmp /tmp/* Dockerfile gulpfile.js .gitignore .dockerignore .editorconfig \
    .eslintrc .babelrc Vagrantfile README.md postman.json npm-shrinkwrap.json && \
    echo "Done! Took $(($(date +%s) - $START_TIME)) seconds" && \

    echo "Creating node user" && \
    adduser -S nodejs && \
    chown -R nodejs /sqlsidecar

USER nodejs

CMD node _build/api
