我正在尝试启动和运行基本的nodeJs和postgres系统,但是由于某种原因,由于重新启动策略,节点容器一直接收到SIGTERM信号,并且由于重新启动策略而一直关闭以仅进行备份,然后再次关闭。循环不断。
我在这里想念什么?我在非群模式下运行了相同的代码,并且运行良好,容器处于正常状态并保持正常运行。我在集群模式期间确实注意到的另一件事是,尽管要求docker保留1个副本,但docker stack services service_name
始终返回0/1个副本
在此处发布我的dockerfile
和docker-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
答案 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
[...]