无法使docker swarm模式与nodejs一起使用

时间:2020-08-09 18:37:51

标签: node.js docker docker-compose dockerfile docker-swarm

我正在尝试启动和运行基本的nodeJs和postgres系统,但是由于某种原因,由于重新启动策略,节点容器一直接收到SIGTERM信号,并且由于重新启动策略而一直关闭以仅进行备份,然后再次关闭。循环不断。

我在这里想念什么?我在非群模式下运行了相同的代码,并且运行良好,容器处于正常状态并保持正常运行。我在集群模式期间确实注意到的另一件事是,尽管要求docker保留1个副本,但docker stack services service_name始终返回0/1个副本

在此处发布我的dockerfiledocker-compose.yml文件

# BASE stage
FROM node:14-alpine as base
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY package.json ./
COPY yarn.lock ./
RUN yarn install --frozen-lockfile --prod

FROM node:14-alpine
ENV NODE_ENV development
ENV VERSION V1
WORKDIR /usr/src/app
RUN apk --no-cache add curl
COPY src src/
# Other copy commands
COPY --from=base /usr/src/app/node_modules /usr/src/app/node_modules

# check every 5s to ensure this service returns HTTP 200
HEALTHCHECK --interval=5s --timeout=3s --start-period=10s --retries=3 \ 
    CMD curl -fs http://localhost/health

ENTRYPOINT [ "node", "src/index.js" ] 
version: "3.7"
services:
  api:
    image: demo/hobby:v1
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 5
        window: 120s
      rollback_config:
        parallelism: 1
        delay: 20s
        order: start-first
      update_config:
        parallelism: 1
        delay: 1s
        failure_action: rollback
        order: start-first
    env_file:
      - ./.env
    ports:
      - target: 9200
        published: 80
        mode: host
    networks:
      - verse

  postgres:
    image: "postgres:12.3-alpine"
    container_name: "test-db-dev"
    networks:
      - verse
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_USER=${DB_USER}
    expose:
      - "5432"
    ports:
      - "5432:5432"
    restart: "unless-stopped"

networks:
  verse:
    driver: overlay
    external: false

1 个答案:

答案 0 :(得分:2)

我假设您的容器每30秒被杀死一次。如果这是真的,那是原因:

HEALTHCHECK尝试卷曲http:// localhost / health(默认为端口80)。
尽管您将应用程序暴露给端口80上的主机,但是HEALTHCHECK是从容器的角度执行的,其中没有服务正在该端口上侦听。

假设您的节点应用正在侦听端口9200,并且在GET上执行的/health返回状态200,则Dockerfile的构建应如下所示:

[...]

HEALTHCHECK --interval=5s --timeout=3s --start-period=10s --retries=3 \ 
   CMD curl -fs http://localhost:9200/health

[...]