Skip to content

Instantly share code, notes, and snippets.

@smithamax
Last active July 5, 2017 15:04
Show Gist options
  • Save smithamax/c5c1ce171260524811f02cbddf00fb99 to your computer and use it in GitHub Desktop.
Save smithamax/c5c1ce171260524811f02cbddf00fb99 to your computer and use it in GitHub Desktop.
Docker for nodejs and buildkite

Usage

Run service locally (mounts project dir)

docker-compose up

Develop locally (open bash prompt)

docker-compose run --rm app bash

When running in buildkite, docker compose won't be passed the overrides file (see below).

Files

Dockerfile

FROM node:6

WORKDIR /src
# Bundle app source
COPY package.json /src

ENV NODE_ENV=production
RUN npm install -q --production

COPY . /src

EXPOSE  5000

ENV NODE_ENV=production

CMD ["node", "server.js"]

docker-compose.yml

version: '3'
services:
  app:
    image: "loke/app-name:${DOCKER_TAG:-latest}"
    depends_on:
      - db

  db:
    image: postgres:latest

docker-compose.override.yml

version: '3'
services:
  app:
    build: .
    volumes:
      - '.:/src'
    ports:
      - 5000:5000

  db:
    ports:
      - 5432:5432

buildkite env

#!/usr/bin/env bash
set -e

DOCKER_TAG="$BUILDKITE_BUILD_ID"

export DOCKER_TAG

function docker-build() {
  local PROJECT_NAME="$(jq -r '.name' package.json)"
  local IMAGE_NAME="loke/$PROJECT_NAME:$BUILDKITE_BUILD_ID"
  
  echo Building Docker Image: "$IMAGE_NAME"
  docker build -t "$IMAGE_NAME" .
  docker push "$IMAGE_NAME"
}

function docker-publish() {
  local PROJECT_NAME="$(jq -r '.name' package.json)"
  local IMAGE_NAME="loke/$PROJECT_NAME:$BUILDKITE_BUILD_ID"

  tags=( "$@" )

  for tag in "${tags[@]}"; do
    echo Tagging Docker Image: "loke/$PROJECT_NAME:$tag"
    docker tag "$IMAGE_NAME" "loke/$PROJECT_NAME:$tag"
    docker push "loke/$PROJECT_NAME:$tag"
  done
}

.buildkite/pipeline.yml

steps:
  - label: build
    command: docker-build

  - wait

  - label: test
    # command: '.buildkite/test.sh'
    command: 'npm install && npm test'
    env:
      BUILDKITE_DOCKER_COMPOSE_CONTAINER=app

  - wait
  
  - label: publish
    command: docker-publish testing
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment