我正在docker容器中运行下一个.js反应应用程序。它由其他几个包含组成:一个运行Ghost(我正在使用API(,一个运行mysql,一个运行NGINX。我已经让所有内容都在开发模式下运行。
使用next dev
运行时,它可以完美运行。但是当我通过执行next build
和next 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
引用其他容器。