Using Go with Docker
To create a standard lightweight deploy for our project, we're going to use Docker. This is the
Dockerfile that we'll create in the root directory of our project:
Files to Setup
This will build our Docker image. It goes into
Dockerfile in our project root.
# Part 1 (Builder) FROM golang:1.11-alpine3.7 as gobuilder RUN apk add --no-cache curl git RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh # TODO Replace `exlskills` with your GitHub username! COPY . /go/src/github.com/exlskills/demo-go-webservice WORKDIR /go/src/github.com/exlskills/demo-go-webservice # Install dependencies RUN dep ensure -v # Build binary RUN go build # Part 2 (Final) FROM alpine:3.7 # Copy over our binary from the builder step COPY --from=gobuilder /go/src/github.com/exlskills/demo-go-webservice/demo-go-webservice /home/demo-go-webservice # Configure entrypoint and expose our service's port (3333) ENTRYPOINT /home/demo-go-webservice EXPOSE 3333
This is the file that Docker uses to know which directories to leave out of the build. It goes into
.dockerignore in our project root.
# We don't want to have our local vendor pushed into the docker build vendor/
In order to streamline our DB setup and connection -- as well as making mimicing a production setup easier, we will use docker compose to build/start/restart our service+DB. Update your
docker-compose.yml file to be:
version: '3.1' services: web: build: context: . ports: - "3333:3333" environment: - GDEMO_DB_PATH=root:password@tcp(db:3306)/demogowsdb?charset=utf8mb4&parseTime=True db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=demogowsdb volumes: - ./dockersql:/docker-entrypoint-initdb.d
Docker Compose Commands (Future Reference)
NOTE: These won't work/do anything right now since our project isn't fully setup yet!
docker-compose -d up # -d option is for 'detatched' mode, remove to run it in the foreground
docker-compose logs -f # -f option is for 'follow' mode, to just get the last n lines, remove this option