我需要为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应用程序?
答案 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.toml
是dep使用的依赖清单。 dep将使用名为vendor
的目录来包含Go项目的所有依赖项。在构建Docker映像之前,您需要确保dep ensure
中存在所有依赖项:
$ dep ensure
$ docker build -t outyet .