我有一个相当复杂的应用程序,在客户端上有next js,在后端我有graphql,我有nginx作为反向代理。
我在索引页面上使用下一个JS增量静态站点重新生成功能,所以这就是为什么我希望在我的客户端容器开始构建之前启动并运行我的服务器,因为当我运行npm运行构建时,它将从graphql服务器获取一些数据
version: "3"
services:
mynginx:
container_name: mynginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 80:80
graphql:
container_name: graphql_server
depends_on:
- mynginx
build:
context: ./server
dockerfile: Dockerfile
mynextjs:
container_name: nextjs_server
depends_on:
- graphql
build:
context: ./client
dockerfile: Dockerfile
depends_on
和healthcheck
,当另一个容器已经工作时启动容器
https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck
像这个
services:
mynginx:
container_name: mynginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 80:80
healthcheck:
test: ["CMD-SHELL", "wget -O /dev/null http://localhost || exit 1"]
timeout: 10s
graphql:
...
depends_on:
depends_on:
mynginx:
condition: service_healthy
简单地说,您需要等待graphql
服务正确启动完成后再运行mynextjs
服务。
恐怕depends_on
(或links
(在这种情况下可能无法开箱即用。原因是,尽管Compose在启动mynextjs
服务之前确实启动了graphql
服务,但它不会等到graphql
服务处于READY状态才启动从属服务。
基本上,您需要找到一种方法来告诉Compose等待graphql
服务处于就绪状态。
该解决方案在Compose文档中的控制启动和关闭顺序中进行了描述
我希望这对你有帮助。干杯🍻 !!!
如果我正确理解您的问题,您需要延迟开始构建前端容器的映像,直到后端容器运行并准备就绪。
想到的最简单的方法是使用配置文件来允许独立启动这些配置文件。
例如:
version: "3"
services:
mynginx:
container_name: mynginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 80:80
profiles: ["backend"]
graphql:
container_name: graphql_server
depends_on:
- mynginx
build:
context: ./server
dockerfile: Dockerfile
profiles: ["backend"]
mynextjs:
container_name: nextjs_server
depends_on:
- graphql
build:
context: ./client
dockerfile: Dockerfile
profiles: ["frontend"]
然后链式启动类似于:
docker-compose --profile backend -d up && docker-compose --profile frontend -d up
另一种选择可能是拆分为两个单独的compose文件,并在它们之间共享docker网络。
参考:https://docs.docker.com/compose/profiles/