Golang+React+MySQL项目Docker Compose启动报错:二进制未找到及数据库未初始化
问题修复方案
错误1:Go服务二进制文件未找到(nd: not found)
原因分析
- Dockerfile指令错误:
nd-back的Dockerfile中存在两个CMD指令,Docker仅执行最后一个;且前一个CMD chown=chevi nd是无效写法。核心问题是本地目录挂载覆盖了容器内构建的二进制文件——你通过docker-compose.yml将本地./nd-back挂载到容器/app/nd-back,本地开发目录没有构建后的nd文件,导致容器启动时找不到。 - 启动路径不明确:启动命令未指定当前工作目录,可能引发路径解析问题。
修复步骤
修改nd-back/Dockerfile
删除无效指令,明确启动路径:
FROM golang:1.22-alpine3.19 RUN addgroup chevi && adduser -S -G chevi chevi USER chevi WORKDIR /app/nd-back/ COPY go.mod go.sum ./ RUN go mod download COPY --chown=chevi . . RUN CGO_ENABLED=0 GOOS=linux go build -o nd EXPOSE 8000 CMD ["./nd"]
修改docker-compose.yml中back服务的卷配置
避免全目录挂载覆盖构建产物,若需本地热重载,仅挂载源码子目录(如cmd、internal),或暂时注释卷挂载:
back: build: ./nd-back ports: - 8000:8000 environment: BBDD_URL: mysql://db/vdb MYSQL_USER: root MYSQL_PASSWORD: xxxxxxxxxx MYSQL_DATABASE: xxxxxxxxxx # 注释全目录挂载,或改为挂载源码子目录 # volumes: # - ./nd-back/cmd:/app/nd-back/cmd # - ./nd-back/internal:/app/nd-back/internal depends_on: - db
错误2:MySQL数据库未初始化(Database is uninitialized and password option is not specified)
原因分析
MySQL镜像的初始化环境变量(如MYSQL_ROOT_PASSWORD)被错误配置在back服务中,MySQL入口脚本仅读取自身服务的环境变量,导致无法完成初始化。同时,数据卷挂载路径不符合MySQL镜像默认配置,会造成数据无法持久化。
修复步骤
修改docker-compose.yml的db服务配置:
db: image: mysql:8.3.0 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: yes MYSQL_USER: root MYSQL_PASSWORD: xxxxxxxxxx MYSQL_DATABASE: xxxxxxxxxx volumes: - vdb:/var/lib/mysql
验证修复
执行以下命令重新构建启动服务:
docker-compose down docker-compose build docker-compose up
内容的提问来源于stack exchange,提问作者chevi
相关产品推荐
相关产品推荐

