使用docker-compose在容器中运行yarn server

65次阅读
没有评论

问题描述

希望通过docker-compose启动一个包含以下容器的服务器:
– 一个MongoDB容器
– 一个后端容器
– 一个客户端容器

在这种情况下,两个服务器容器都需要在最后运行yarn start命令。然而,当将该命令放在Dockerfile中时,镜像似乎永远不会停止构建,因为yarn start命令从技术上讲永远不会停止运行。客户端容器要求后端容器先启动,后端容器要求MongoDB数据库实例先启动。

用户想知道如何在docker-compose中使这个服务器正常运行。

以下是后端Dockerfile的内容:

FROM node:12-alpine
WORKDIR /app
COPY ./server /app
WORKDIR /app/server
RUN yarn
RUN yarn start

用户已经意识到yarn start应该是Docker镜像的CMD(即在启动容器时运行的内容),而不是RUN命令(用于创建镜像以供稍后启动容器时使用的命令)。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

为了在docker-compose中正确运行这个服务器,我们需要将yarn start作为镜像的CMD来运行,而不是在Dockerfile中使用RUN命令。

以下是解决方案的步骤:

步骤1:修改Dockerfile

修改后端Dockerfile,将yarn start作为CMD命令放在最后。这样,当容器启动时,将运行该命令。

FROM node:12-alpine
WORKDIR /app
COPY ./server /app
WORKDIR /app/server
RUN yarn
CMD yarn start

步骤2:创建docker-compose.yml文件

创建一个名为docker-compose.yml的文件,用于定义整个服务器的组件和配置。

version: '3'
services:
  mongodb:
    image: mongo:latest
    # 定义MongoDB容器的其他配置

  backend:
    build:
      context: .
      dockerfile: Dockerfile.backend
    # 定义后端容器的其他配置
    depends_on:
      - mongodb

  client:
    build:
      context: .
      dockerfile: Dockerfile.client
    # 定义客户端容器的其他配置
    depends_on:
      - backend

在上面的示例中,我们定义了三个服务:mongodbbackendclientbackendclient服务分别使用各自的Dockerfile进行构建。使用depends_on属性来指定每个服务所依赖的其他服务。

步骤3:编写Dockerfile.backend和Dockerfile.client

在项目根目录中创建名为Dockerfile.backendDockerfile.client的文件,分别用于构建后端和客户端容器的镜像。

Dockerfile.backend示例:

FROM node:12-alpine
WORKDIR /app
COPY ./server /app
WORKDIR /app/server
RUN yarn
CMD yarn start

Dockerfile.client示例:

FROM node:12-alpine
WORKDIR /app
COPY ./client /app
WORKDIR /app/client
RUN yarn
CMD yarn start

步骤4:运行docker-compose命令

在项目根目录中打开终端,运行以下命令以使用docker-compose启动服务器:

docker-compose up

现在,当你运行docker-compose up命令时,docker-compose会根据定义的依赖关系顺序启动MongoDB、后端和客户端容器,同时将yarn start作为CMD命令在后端和客户端容器中运行。

这将确保后端容器在MongoDB容器启动后运行,而客户端容器在后端容器启动后运行,从而实现了所需的启动顺序。

注意:在某些情况下,可能需要适当的延迟或等待机制来确保容器内的服务完全就绪,尤其是在实际环境中可能存在的网络和资源启动延迟情况下。在这种情况下,可以使用类似的等待循环或健康检查来等待所需的服务就绪状态。

现在,你已经成功配置了一个使用docker-compose的服务器,其中包括MongoDB、后端和客户端容器,并且确保了正确的启动顺序和命令运行。

正文完