我尝试通过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
文件结构如下:
当我开始构建时,出现此错误(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
很好,但是我需要完全重建我的应用程序(下载依赖项)。我在做什么错了?
答案 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'一样进行构建,因此在这种情况下,您的卷不应该清除二进制文件。