如何在 Docker 镜像构建时解决运行 yarn install 时的网络连接问题?

3

我在Mac环境下遇到了一个奇怪的问题。当我运行docker build命令来构建我的Node镜像时,它无法获取软件包,并提示存在连接问题。这只发生在Mac环境中。我有一台服务器,在那里构建通常可以完成,但这最终阻止了我在我的机器上进行测试。

有人能告诉我可能是什么原因以及如何解决吗?

enter image description here

Dockerfile在这里:

FROM node:16.14-alpine3.15 as builder

ENV NODE_ENV=development

WORKDIR /home/node/app
COPY package*.json .
COPY yarn.lock .
COPY tsconfig.json .
RUN yarn install
COPY . .
RUN yarn build

FROM node:16.14-alpine3.15 as production

ENV NODE_ENV=production

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

RUN mkdir logs

COPY package*.json .
COPY yarn.lock .
RUN yarn install

COPY --from=builder /home/node/app/dist /usr/src/app/dist

EXPOSE 3333
CMD ["yarn", "start"]

我已经尝试在yarn install命令中添加以下标志:

RUN yarn install --frozen-lockfile --no-cache --production --network-timeout 100000

全部一起或单独使用,但都没有成功。我还删除了代理,但也没有成功。

RUN yarn config delete https-proxy RUN yarn config delete proxy.

然而,我注意到这个错误只发生在Yarn的v1.22版本中。当使用berry版本时,同样的情况不会发生。


1
嘿,你找到任何解决方法了吗?我遇到了同样的问题。 - Gurleen Sethi
我还没有找到针对这个具体情况的解决方案。而且在构建其他镜像时,我也注意到了同样的问题。最终,我通过ssh在Debian服务器上运行构建。我发现这只会在Mac上(M1和Intel)以及使用yarn v1时出现。如果你找到了解决方案,是否可以与我们分享? - Alan de Almeida
我尝试了--network-timeout 100000,它成功构建了一次,但之后又出现了问题,也许可以将值增加到一个荒谬的数字。我在mac上也遇到了这个问题 :( - Gurleen Sethi
这是在旧版本的节点镜像中的问题;解决方案(2023)是在安装之前添加RUN yarn set version stable,这将将您升级到(当前)v3.6.3。 - undefined
3个回答

4
我把这个答案放在这里,因为代理对我的情况没有帮助。
TL;DR 版本检查URL重定向导致yarn混乱。
所以,我继续研究了一些典型的古老工具,比如详细检查、curl和dig。
首先,我尝试检查详细输出:
Bingo #1.
verbose 0.181073051 Performing "GET" request to "https://yarnpkg.com/latest-version".
[1/4] Resolving packages...                                                       
success Already up-to-date.                                                                                                                                          
Done in 0.12s.                                                                                                                                                       
info There appears to be trouble with your network connection. Retrying...                                                                                           
verbose 33.254841183 Performing "GET" request to "https://yarnpkg.com/latest-version".                                                                               
info There appears to be trouble with your network connection. Retrying...                                                                                           
verbose 66.292530305 Performing "GET" request to "https://yarnpkg.com/latest-version".                                                                               
info There appears to be trouble with your network connection. Retrying...                                                                                           
verbose 99.329186881 Performing "GET" request to "https://yarnpkg.com/latest-version".                                                                               
info There appears to be trouble with your network connection. Retrying...                                                                                           
verbose 132.366749502 Performing "GET" request to "https://yarnpkg.com/latest-version".

为什么在yarnpkg.com上没有得到答案?这太疯狂了...那么,让我们看看是否解决:

$ dig yarnpkg.com

; <<>> DiG 9.18.7-1+b1-Debian <<>> yarnpkg.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55602
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 9cf3b6f8b290069dbbe8ca8763501b11ea79617323c673e6 (good)
;; QUESTION SECTION:
;yarnpkg.com.                   IN      A

;; ANSWER SECTION:
yarnpkg.com.            300     IN      A       104.18.126.100
yarnpkg.com.            300     IN      A       104.16.171.99

;; Query time: 11 msec
;; SERVER: 192.168.1.1#53(192.168.1.1) (UDP)
;; WHEN: Wed Oct 19 18:43:13 EEST 2022
;; MSG SIZE  rcvd: 100

没错!!! (?)

那么,我们可以通过使用curl来查看它给我们返回了什么

$ curl https://yarnpkg.com/latest-version
Redirecting to https://classic.yarnpkg.com/latest-version

什么?重定向?好的,这是新的...

我试图将url设置为检查版本而不是yarnpkg.com,而是classic.yarnpkg.com,但我找不到要使用的yarn配置变量。

所以,我使用了/etc/hosts


; <<>> DiG 9.18.7-1+b1-Debian <<>> classic.yarnpkg.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35092
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 72636a6924283d51c4127a8463501bbb42e53d34835e8402 (good)
;; QUESTION SECTION:
;classic.yarnpkg.com.           IN      A

;; ANSWER SECTION:
classic.yarnpkg.com.    300     IN      CNAME   yarnpkg.netlify.com.
yarnpkg.netlify.com.    20      IN      A       3.64.200.242
yarnpkg.netlify.com.    20      IN      A       34.141.11.154

;; Query time: 59 msec
;; SERVER: 192.168.1.1#53(192.168.1.1) (UDP)
;; WHEN: Wed Oct 19 18:46:03 EEST 2022
;; MSG SIZE  rcvd: 138

将第一个IP地址设置为yarnpkg.com。

# /etc/hosts
34.141.48.9     yarnpkg.com

太棒了!!! Yarn 命令瞬间完成。

$ yarn 
yarn install v1.22.19
[1/4] Resolving packages...
success Already up-to-date.
Done in 0.12s.
$

1
感谢您经历了繁琐的故障排除步骤来确定问题所在。老生常谈的“这是DNS的问题,它总是DNS”的答案又回来了……我通常不喜欢像这样搞乱我的/ etc / hosts文件,因为最终当它改变时,我会忘记我设置了什么,然后在查看我的hosts文件之前花费太多时间。但是非常感谢您的帮助。非常感激。 - evillive
我宁愿不去做这件事,但我找不到版本检查URL的变量。相信我,我已经彻底阅读了文档。有趣的是,在我的办公室电脑上,它能够开箱即用,而我的电脑上却不行... 可能与curl配置、跟随重定向等有关。 - Ruby Racer

1
对我来说,这个问题可以通过以下方法解决:
npm config set registry "http://registry.npmjs.org"

然后:
yarn config set registry "http://registry.npmjs.org"

0
可能是由于 Docker 网络阻止了您的访问,请尝试使用 docker network ls 列出所有网络,使用 docker network prune 删除未使用的网络,并再次尝试安装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接