Docker 主机名在 next.js prod 中无法解析,但在开发模式下工作(错误:getaddrinfo ENOT



我正在docker容器中运行下一个.js反应应用程序。它由其他几个包含组成:一个运行Ghost(我正在使用API(,一个运行mysql,一个运行NGINX。我已经让所有内容都在开发模式下运行。

使用next dev运行时,它可以完美运行。但是当我通过执行next buildnext start来运行它时,当我尝试向我的 Ghost API 容器发出服务器端 HTTP 请求时,我开始看到类似Error: getaddrinfo ENOTFOUND ghost-api的错误。我不完全确定问题是什么,但似乎 Node 在构建后如何发出请求存在一些问题。我一直在挖掘很多Docker/Node问题,试图弄清楚这个问题,但没有任何运气。

整个项目可以在这里找到:https://github.com/MichaelWashburnJr/react-cms

问题可能存在于您正在使用的环境变量中。在 getGhostApi 和 getGhostApiKey 函数中,您都在使用环境变量。

在NextJs中,您必须指定一个next.config.js在其中定义所需的变量

。例如,下一个.config.js

module.exports = {
serverRuntimeConfig: {
// Will only be available on the server side
mySecret: 'secret',
secondSecret: process.env.SECOND_SECRET, // Pass through env variables
},
publicRuntimeConfig: {
// Will be available on both server and client
staticFolder: '/static',
},
}

您还可以参考下一个文档。 https://nextjs.org/docs/api-reference/next.config.js/runtime-configuration

我无法重现错误。如何在生产模式下启动前端容器?

从错误来看,您可能正在尝试将前端容器或前端应用作为单独的进程启动,而不会将其作为撰写项目的一部分启动。如果是这种情况,名称ghost-api将无法解析,并且会收到Error: getaddrinfo ENOTFOUND ghost-api错误。

我更改了前端容器的command键,如下所示:

command:  [ "yarn", "start-prod" ]

更改了 frontend/package.json 中的"start-prod"脚本,如下所示:

"start-prod": "next build && NODE_ENV='production' next start"

一切都像在开发模式下一样工作。我在开发和生产模式下都遇到了一些UNKNOWN_CONTENT_API_KEY错误,但绝对没有 ghost-api 名称解析错误。

克隆存储库后:

$ grep -R ST_API *
frontend/.env.development:GHOST_API_URL=http://ghost-api:2368
frontend/.env.production:GHOST_API_URL=http://ghost-api:2368
frontend/src/constants/Config.js:export const getGhostApi = () => process.env.GHOST_API_URL || 'http://localhost:8000';

ghost-api不是域名:要使其正常工作,您需要编辑hosts文件或(对于实际生产环境(使用真正的部署域名更改frontend/.env.production文件中的http://ghost-api:2368

如果你问为什么你不能信任docker compose network,答案是:你可以,但只能在容器中;而前端将在容器之外的应用程序客户端的浏览器中运行。

希望这有帮助。

似乎 Docker 的主机名解析在构建时不起作用。这就是为什么找不到ghost-api的原因。

而不是按名称引用另一个容器 (ghost-api(,在 Mac 上您可以尝试host.docker.internal.在 Linux 上,在构建过程中使用主机网络对我有用:

nextjs-app:
build:
network: "host"
# ...
network_mode: "host"

这样,您可以使用localhost引用其他容器。

最新更新