适用于Linux的golang docker build

时间:2018-08-17 12:06:29

标签: docker

我需要为Linux编译一个Golang应用程序,由于存在另一个库,我无法在Mac下交叉编译。因此,我决定在Docker容器中进行编译。这是我第一次使用Docker。

这是我当前的目录结构:

.
├── Dockerfile
├── Gopkg.lock
├── Gopkg.toml
├── Vagrantfile
├── bootstrap.sh
├── src
│   ├── cmd
│   │   ├── build.bat
│   │   ├── build.sh
│   │   ├── config.json
│   │   ├── readme.md
│   │   └── server.go
│   ├── consumers.go
│   ├── endpoints
│   │   ├── json.go
│   │   ├── rate.go
│   │   ├── test_payment.go
│   │   └── wallet.go
│   ├── middleware
│   │   └── acl.go
│   ├── models.go
│   ├── network
│   │   └── network.go
│   ├── qr
│   │   └── qr.go
│   ├── router
│   │   └── router.go
│   ├── service
│   │   └── walletService.go
│   ├── services.go
│   ├── setup.sql
│   ├── store
│   │   └── wallet.go
│   ├── stores.go
│   └── wallet
│       ├── coin.go
│       └── ethereum.go

Dockerfile:

FROM golang:latest 
WORKDIR /src/cmd
RUN ls
RUN go get github.com/go-sql-driver/mysql
RUN go build -o main ./src/cmd/server.go 
CMD ["./main"]

我尝试使用以下方法构建Docker映像:

docker build -t outyet .

这是它返回的错误:

Sending build context to Docker daemon  5.505MB
Step 1/6 : FROM golang:latest
 ---> d0e7a411e3da
Step 2/6 : WORKDIR /src/cmd
 ---> Using cache
 ---> 0c4c2b99e294
Step 3/6 : run ls
 ---> Using cache
 ---> 23d3e491a2e1
Step 4/6 : RUN go get github.com/go-sql-driver/mysql
 ---> Running in f34447e51f6c
Removing intermediate container f34447e51f6c
 ---> 5731ab22ee43
Step 5/6 : RUN go build -o main server.go
 ---> Running in ecc48fcf5488
stat server.go: no such file or directory
The command '/bin/sh -c go build -o main server.go' returned a non-zero code: 1

我如何使用Docker构建Golang应用程序?

2 个答案:

答案 0 :(得分:0)

您需要在构建容器中添加源。将此行添加到您的Dockerfile中(例如,在FROM golang:latest之后):

ADD src/ /src/cmd

然后,您可以访问容器(/src/cmd)中的文件:RUN ls现在应该返回一些内容。

答案 1 :(得分:0)

您看到的错误是:

stat server.go: no such file or directory
The command '/bin/sh -c go build -o main server.go' returned a non-zero code: 1

...换句话说,它告诉您Go编译器无法找到您要构建的server.go。更新您的Dockerfile,以将本地文件复制到Docker映像中:

FROM golang:latest 
COPY . /go/src/workdir
WORKDIR /go/src/workdir
RUN go build -o main ./src/cmd/server.go 
CMD ["/go/src/workdir/main"]

在您的目录中,我发现Gopkg.tomldep使用的依赖清单。 dep将使用名为vendor的目录来包含Go项目的所有依赖项。在构建Docker映像之前,您需要确保dep ensure中存在所有依赖项:

$ dep ensure
$ docker build -t outyet .
相关问题