I’m using docker as my local development environment, and it works really great.
But the pain comes when it comes to manage image dependencies.
For example, say I’m developing a go program. I create two images, one for production, which uses multi stage Dockerfile to build an alpine image containing the built go program. And another for development, which is based on the production image and, again, uses multi stage Dockerfile to add delve for debugging.
The set up is something like
# Dockerfile-prod FROM: golang:alpine ADD . /go/src/app RUN go install app FROM: alpine COPY --from=0 /go/bin/app /usr/local/bin
# Dockerfile-dev FROM: golang:alpine RUN go get github.com/derekparker/delve/cmd/dlv FROM: production COPY --from=0 /go/bin/dlv /usr/local/bin
Now the question is, when I change my app’s source code, how do I automatically build both production and development images?
I know docker hub can do auto build, but pushing and pulling are too time consuming, not suited for rapid local development, and I heard that docker hub doesn’t cache layers, so it’s going to take a long time to do auto build.
Another approach I think is to use make, but I don’t know what should be the generated file that depends on the go source files. Should I touch empty file to designate that a particular image is built? Doesn’t sound very optimal.
I wonder if there is a better way? How do you manage image dependencies while doing local development?