Golang应用程序的Docker卷

时间:2018-12-15 11:59:10

标签: docker docker-compose

我尝试通过Docker在开发模式下运行Golang-app

Dockerfile

FROM golang 
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN go get -d -v .
RUN go build -o main . 
CMD ["./main"]

docker-compose.yml

version: "3.3"

services:
  database:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    ports:
      - 6060:5432

  api:
    build: ./demoapp-api
    volumes:
      - ./demoapp-api:/usr/src/app
    ports:
      - 5000:5000
    depends_on:
      - database

文件结构如下:

enter image description here

当我开始构建时,出现此错误(full log):

Recreating f97ae865ad6d_demoapp_api_1_6f198d4b1db4 ... error

ERROR: for f97ae865ad6d_demoapp_api_1_6f198d4b1db4  Cannot start service api: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./main\": stat ./main: no such file or directory": unknown

ERROR: for api  Cannot start service api: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./main\": stat ./main:no such file or directory": unknown
ERROR: Encountered errors while bringing up the project.

容器文件./main中存在

MBP-Pavel:demoapp pavel$ docker run --rm -it 4ae6ff9cf413 sh
# pwd
/usr/src/app
# ls
Dockerfile  main  main.go
#

如果从volumes服务中删除api很好,但是我需要完全重建我的应用程序(下载依赖项)。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

通过docker-compose运行容器时,您的demoapp-api文件夹安装在容器内/usr/src/app的顶部,而go应用程序位于容器中的那个文件夹中。由于demoapp-api不包含主二进制文件,因此docker无法找到并执行它。

您需要在.go文件夹中本地编译主demoapi-app,然后运行docker-compose up。

答案 1 :(得分:-1)

上面的

家伙意味着您的卷清理了您的主要二进制文件,因此您无法在docker容器中找到该文件。 我认为最好不要删除卷,或者只是通过“运行main.go”运行它,但这不是一个好方法。 同样,您也可以将包含.go文件的文件夹移动到src文件夹,并像'go build src / main.go'一样进行构建,因此在这种情况下,您的卷不应该清除二进制文件。