使用Docker时在Goland中配置GOROOT

I am building a Go project with Docker in the new GoLand IDE. Unfortunately, I am not able to cofigure my GOROOT correctly, making it not possible to use the GoLand futures to the max.

I have the following dockerfile:

FROM golang:1.9.3

# allows app_env to be set during build (defaults to empty string)
ARG app_env
# sets an environment variable to app_env argument, this way the variable will persist in the container for use in code
ENV APP_ENV $app_env


COPY ./ /go/src/github.com/Name/ProjectName/

WORKDIR /go/src/github.com/Name/ProjectName/app

# install all dependencies
RUN go get ./...

# build the binary
RUN go build

# Put back once we have an application
RUN app

EXPOSE 8080

I now execute my project as follows:

  1. docker build -t project-name .
  2. docker run -it -v ~/project-dir:/go/src/github.com/Name/ProjectName/app

This works, however, I cannot find how I can configure GoLand to use the path on my Docker image usr/local/go/bin for my GoRoot, is that even possible in GoLand? (If not, why even bother adding 'docker support'?)

As of 2018.1.2, it's impossible to use GoLand to develop Go applications that have their source code inside containers. The source code of your application, its dependencies, and Go itself need to be installed on your machine.

If anyone has any idea on how to improve the Docker based development support, suggestions are welcomed, see: https://youtrack.jetbrains.com/issue/GO-3322

As for why even bother adding support for Docker in the IDE? You can launch containers, you can use docker compose, and a host of other tools from the IDE. However, with the way containers work, there is no way for the IDE to get the source from the container and infer them.

Furthermore, your container should not include the Go sources/workspace in the final container, so that it's optimized for size and deployment speed. You can use something like this to run, but be aware that additional work may be required.

FROM golang:1.9.3 as build-env

# allows app_env to be set during build (defaults to empty string)
ARG app_env
# sets an environment variable to app_env argument, this way the variable     will persist in the container for use in code
ENV APP_ENV $app_env

COPY ./ /go/src/github.com/Name/ProjectName/

WORKDIR /go/src/github.com/Name/ProjectName/app

# install all dependencies
RUN go get ./...

# build the binary
RUN go build -o /my_app

# final stage
FROM scratch

COPY --from=build-env /my_app /

# Put back once we have an application
CMD ["/my_app"]

EXPOSE 8080