本地JetBrains Space On-Premises环境下Docker构建Node镜像连私有NPM仓库失败求助
解决Docker构建时无法访问JetBrains Space私有NPM仓库的问题
问题背景
本地使用JetBrains Space On-Premises,构建配置了私有NPM仓库的Node Docker镜像时出现网络错误,提示无法解析packages主机名。
Dockerfile内容
# Builder stage FROM node:18 as builder WORKDIR /usr/src/app COPY package.json ./ COPY snkrs-url.json ./ COPY .npmrc ./ COPY . . RUN npm config delete proxy RUN npm config set @sneakers-monitor:registry http://packages:8390/npm/p/sneakers-monitor/npm/ RUN npm config set //packages:8390/npm/p/sneakers-monitor/npm/:_authToken=eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiIxbjdENmoxc1Y0ZHQiLCJhdWQiOiJjaXJjbGV0LXdlYi11aSIsIm9yZ0RvbWFpbiI6ImpldGJyYWlucyIsIm5hbWUiOiJhZG1pbiIsImlzcyI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDg0IiwicGVybV90b2tlbiI6IjJuWHFuRDRYRTVCTiIsInByaW5jaXBhbF90eXBlIjoiVVNFUiIsImlhdCI6MTY3MDY3Njk1Mn0.g7sOBo7r7SvNuWq7VvKttdusdMf5Vad2Als24xBuGFDBId1oGa6XG61Y6X98mE_lifvtMxydD5DFspe49lH2TyS2hhNUI2vYxMno9jcA3oWGNjXMuK8cpAEterD70aNl_yCT-bS2hTh0jeVUKtLewGvoiXIPOvrCTMnyYpHA_qmixi1Qtw49O5rnB9SzTx6Go_iHUJB1p4ZFhEvY_mH8AVFSTo00YRE-RQEQ0j3p54me9amlC5xUTRg6c3bI5J9ElqVPgKn2arODsITKtYkD3vS6K3MRUtCnrr2eKxw3LtDYH1GfXq-hCw5TlYxWiBB_z21U7tnpOCKM8GkxrH-E3hdlYwt4ychoFveDclQKCC8PsMVOWOI9oaMqVttWMz9HkgvAEB3y--pV54s_pHm6xrH_CrYL2oEZ6rELjyJDaZYB-EPpLOrRRIXOYlitYUpe8nKcz13I7HEChpT0huXiP6IWqdotvtSdnR89irqoDILH7RZbGGjkFYB6Yz04zPwzn91-CBONuTMRLm39iv880l2tU6-7BlM2Jivyx0I_IKJCqJjymE0zfXJqB9I1F1S4T2GHBALHbTXtXa9dgC-unwJN3L_4TEPxaozzzcH8ikld8GOcd3bXJX1d-iD4GjqX9ek8cidwqmRzR3ZobAVKnb7_NC0vrXxG14BTqrvJNBg RUN npm install RUN npm run build RUN npm prune --production RUN wget https://gobinaries.com/tj/node-prune --output-document - | /bin/sh && node-prune # Runner stage FROM node:18-alpine as runner WORKDIR /usr/src/app COPY --from=builder /usr/src/app/snkrs-url.json ./ COPY --from=builder /usr/src/app/dist ./dist COPY --from=builder /usr/src/app/node_modules ./node_modules EXPOSE 5000 CMD [ "node", "dist/index.js" ]
错误信息
#18 188.0 npm ERR! code ENOTFOUND #18 188.0 npm ERR! syscall getaddrinfo #18 188.0 npm ERR! errno ENOTFOUND #18 188.0 npm ERR! network request to http://packages:8390/npm/p/sneakers-monitor/npm/@sneakers-monitor%2fdiscord-bot failed, reason: getaddrinfo ENOTFOUND packages #18 188.0 npm ERR! network This is a problem related to network connectivity. #18 188.0 npm ERR! network In most cases you are behind a proxy or have bad network settings. #18 188.0 npm ERR! network #18 188.0 npm ERR! network If you are behind a proxy, please make sure that the #18 188.0 npm ERR! network 'proxy' config is set properly. See: 'npm help config' #18 188.0
核心原因
Docker容器内部无法解析packages这个主机名,导致无法连接到私有NPM仓库。
解决步骤
1. 替换私有仓库的主机名为可访问地址
- 如果私有仓库部署在本地电脑(Docker主机),用
host.docker.internal替代packages,这是Docker提供的默认主机域名,用于容器访问主机服务:
修改Dockerfile中的两行npm配置命令:RUN npm config set @sneakers-monitor:registry http://host.docker.internal:8390/npm/p/sneakers-monitor/npm/ RUN npm config set //host.docker.internal:8390/npm/p/sneakers-monitor/npm/:_authToken=你的token - 如果仓库在局域网其他机器,直接使用该机器的IP地址(比如
192.168.1.100)替换packages:RUN npm config set @sneakers-monitor:registry http://192.168.1.100:8390/npm/p/sneakers-monitor/npm/ RUN npm config set //192.168.1.100:8390/npm/p/sneakers-monitor/npm/:_authToken=你的token
2. 检查Docker网络与防火墙配置
- 如果私有仓库在自定义Docker网络中,构建镜像时指定该网络,让容器加入网络以解析主机名:
docker build --network=你的自定义网络名 -t 镜像名 . - 确认本地主机的防火墙已开放8390端口,允许Docker容器访问该端口。
3. 优化npm配置方式(可选)
将npm配置直接写入.npmrc文件,避免在Dockerfile中执行多个RUN命令:
在项目根目录的.npmrc中添加:
@sneakers-monitor:registry=http://host.docker.internal:8390/npm/p/sneakers-monitor/npm/ //host.docker.internal:8390/npm/p/sneakers-monitor/npm/:_authToken=你的token
然后删除Dockerfile中的两行RUN npm config set命令,直接依赖COPY进来的.npmrc配置即可。
内容的提问来源于stack exchange,提问作者faserx
相关产品推荐
相关产品推荐

