Build from Source in a Docker Container

We create a canonical dev environment for Go and Python developers using Docker images.


  1. Go >= 1.13. download here
  2. Docker CE >= 18.x. download here

Building in Container

We build a Docker image that contains development tools below.

  1. Python Interpreter
  2. Go compiler
  3. Protobuf compiler
  4. Protobuf to Go compiler extension
  5. MySQL database

Because this repo contains Go code, please make sure that you have the directory structure required by Go. On my computer, I have GOPATH set to $Home/go, you can have your $GOPATH pointing to any directory as you like.

export GOPATH=$HOME/go

Now that $GOPATH$ is set, we could git clone the source code of our project by running:

go get

Change the directory to our project root by running

cd $GOPATH/src/

Build the Docker image either from project Dockerfile.

docker build -t sqlflow:latest .

or SQLFlow’s official registry on DockerHub.

docker pull sqlflow/sqlflow
docker tag sqlflow/sqlflow:latest sqlflow:latest

Note it will take a while to build from Dockerfile, especially when the network is unpredictable.


Build and Test

We build and test the project inside the docker container. To run the container, we need to map the $GOPATH directory on the host into the /go directory in the container, because the Dockerfile configures /go as the $GOPATH in the container:

docker run --rm -it -v $GOPATH:/go \
    -w /go/src/ \
    sqlflow:latest bash

Inside the Docker container, start a MySQL server in the background

service mysql start

run all the tests as

go generate ./...
SQLFLOW_TEST_DB=mysql go test -v ./...

where go generate invokes the protoc command to translate server/sqlflow.proto into server/sqlflow.pb.go and go test -v builds and run unit tests. The environment variable SQLFLOW_TEST_DB=mysql specify MySQL as the backend, you can also check and to run the unit tests with other backends.

Editing on Host

When we use this Docker image for daily development work, the source code relies on the host computer instead of the container. The source code includes this repo and all its dependencies, for example, the Go package Code-on-the-host allows us to run our favorite editors (Emacs, Vim, Eclipse, and more) on the host. Please free to rely on editors add-ons to analyze the source code for auto-completion.

The Command-line REPL

The REPL is a binary linked with SQLFlow. In the Docker image, the sample data is already loaded in the MySQL service, you can start MySQL using service mysql start. To run it, type the following command:

go run cmd/repl/repl.go --datasource="mysql://root:root@tcp(localhost:3306)/?maxAllowedPacket=0"

You should be able to see the prompt of sqlflow>. Now, please follow the REPL tutorial.