Docker构建失败与测试连接拒绝问题求助
Docker相关问题解决方案
问题1:执行docker build -t customer --target prod .拉取base镜像失败
错误信息
- 使用BuildKit时:
failed to solve with frontend dockerfile.v0: failed to solve with frontend gateway.v0: rpc error: code = Unknown desc = pull access denied... - 不使用BuildKit时:
pull access denied for base, repository does not exist or may require 'docker login'...
原因分析
你的Dockerfile中,后续test和prod阶段尝试引用名为base的镜像,但第一个基础镜像未被命名为base,Docker会将base当作公共仓库镜像去拉取,自然无法找到,导致报错。
解决步骤
修改Dockerfile,给第一个基础镜像添加别名base,确保后续阶段能正确引用:
# syntax=docker/dockerfile:1 # 给基础镜像命名为base,供后续阶段引用 FROM node:lts-alpine AS base WORKDIR /server COPY package.json package-lock.json ./ # 测试阶段基于base镜像构建 FROM base AS test RUN npm ci --silent COPY . . EXPOSE 8080 CMD [ "npm", "run", "test" ] # 生产阶段基于base镜像构建 FROM base AS prod RUN npm ci --production --silent COPY . . EXPOSE 8080 CMD [ "node", "start" ]
修改后重新执行构建命令即可。
问题2:执行docker-compose -f docker-compose.dev.yml run customer_api npm run test出现Error: connect ECONNREFUSED 127.0.0.1:8080
原因分析
docker-compose run会创建新容器并执行指定的npm run test命令,覆盖了配置中的command: npm start,导致API服务并未启动,测试代码连接127.0.0.1:8080时无服务响应。- 即使服务启动,Docker容器内的
127.0.0.1指向容器自身,若测试代码需连接其他服务容器,也无法通过localhost访问。
解决方法
方法1:先启动服务再执行测试
先启动API服务容器:
docker-compose -f docker-compose.dev.yml up -d customer_api
再进入运行中的容器执行测试:
docker-compose -f docker-compose.dev.yml exec customer_api npm run test
方法2:修改测试代码的连接地址
如果测试代码需调用本服务API,确保测试逻辑先启动服务;如果是连接其他服务,将测试代码中的127.0.0.1:8080替换为docker-compose中对应的服务名称(例如customer_api:8080)——在Docker Compose默认网络中,服务名称可直接解析为容器IP。
方法3:新增测试服务依赖API服务
调整docker-compose.dev.yml,添加专门的测试服务并依赖API服务启动:
version: "3.8" services: customer_api: build: context: . ports: - 8080:8080 volumes: - ./:/server command: npm start customer_test: build: context: . volumes: - ./:/server command: npm run test depends_on: - customer_api
执行测试命令:
docker-compose -f docker-compose.dev.yml run customer_test
内容的提问来源于stack exchange,提问作者Pragati Bhattad
相关产品推荐
相关产品推荐

