【问题标题】:Why is curl shutting down the docker container?为什么 curl 会关闭 docker 容器?
【发布时间】:2022-01-04 09:45:55
【问题描述】:

美好的一天! 我有一个在窗口中运行的微服务和一个存储微服务地址的注册表。 我还有一个在容器打开时运行的脚本。 脚本获取本地ip并使用curl将其发送到另一台服务器。 脚本执行后返回code 0,容器退出。你如何解决这个问题?

#docker-compose realtime logs

nginx_1        | "code":"SUCCESSFUL_REQUEST" nginx_1 exited with code 0

我的 bash 脚本

#!/bin/bash
address=$(hostname -i)
curl -X POST http://registry/service/register -H 'Content-Type: application/json' -d '{"name":"'"$MICROSERVICE_NAME"'","address":"'"$address"'"}'

脚本运行良好,没有问题,但不幸的是它破坏了容器进程。是否有可能以某种方式拦截此代码,使其不会关闭容器?

如果有任何帮助或评论,我将不胜感激!????

编辑:

这里的Dockerfile是启动容器后调用的脚本

FROM nginx:1.21.1-alpine
WORKDIR /var/www/
COPY ./script.sh /var/www/script.sh
RUN apk add --no-cache --upgrade bash && \
    apk add nano 

#launch script
CMD /var/www/script.sh

编辑 2:

我的 docker-compose.yml

version: "3.9"

services:
    #database
    pgsql:
        hostname: pgsql
        build: ./pgsql
        ports:
            - 5432:5432/tcp
        volumes:
            - ./pgsql/data:/var/lib/postgresql/data
      

    #registry
    registry_fpm:
        build: ./fpm/registry
        depends_on:
            - pgsql
        volumes:
            - ./microservices/registry:/var/www/registry

    registry_nginx:
        hostname: registry
        build: ./nginx/registry
        depends_on:
            - registry_fpm
        volumes:
            - ./microservices/registry:/var/www/registry
            - ./nginx/registry/nginx.conf:/etc/nginx/nginx.conf

    
    #server
    nginx:
        build: ./nginx
        environment:
            MICROSERVICE_NAME: Microservice_1
        depends_on:
            - registry_nginx
        ports:
            - 80:80/tcp

【问题讨论】:

  • 您如何准确运行该脚本?
  • @NicoHaase 我编辑了帖子,请看一下
  • 这是预期的行为。 docker 容器只运行一个命令并在命令退出时退出。参考this SO thread。如果我没记错的话,您正在寻找一个单独的容器来监控docker socket 并注册容器的启动/停止/状态。请分享您的撰写文件(已编辑),我们可以提出一些建议
  • @kevinnls 我编辑了这篇文章。感谢您的链接!
  • 我对你期望 Docker 容器在 curl 之后继续做什么感到困惑。

标签: bash docker nginx curl docker-compose


【解决方案1】:

注册中心的目的是只存储所有微服务的ip。如果您熟悉微服务,那么您很有可能知道注册中心就像是所有微服务地址的保管人。注册中心被其他微服务用来获取微服务地址,以便微服务可以通过http进行通信。

据我所知,不需要这些地址。微服务可以轻松地使用彼此的主机名。

您已经使用 curl 执行此操作:POST 请求发送到服务器 registry;等等

docker compose 可能只是微服务所需的所有编排。


关于 IP 和网络

如果您愿意,为了更加隔离和一致性,您可以在 compose.yaml 中进行配置


关于心跳

不需要跟踪心跳。

但如果你真的需要一个,在容器内做是不行的。一个容器应该是only one running process。并且创建新记录是多余的,因为 docker 守护进程已经在跟踪所有 IP 和状态(以及其他负载)。

注册表的功能(跟踪生命周期)由 docker 守护进程代替。试试docker compose ps

但是,您可以使用restart 标签将容器配置为在失败时自动重启

如果您需要在不使用 CLI 的情况下监控这些,那么监听 docker 套接字是不错的选择。

您可以制作自己的仪表板,接入Docker API,其端点在here 中列出。注意:套接字可能需要为protected,如果可能,应该以只读方式安装

但更好的解决方案是使用已经执行此操作的图像。很遗憾,我不能给你推荐;我没用过。

【讨论】:

  • 是的,我明白这一点,但是微服务也会每分钟请求一次地址/心跳,其目的是说“微服务还活着并继续工作”,如果你最了解的话转移微服务生命的方法,请告诉我!
  • 嗯,心跳,嗯?让我想想。坚持,稍等;我没有看到控制器:这应该是注册表的功能吗?
  • 是的,所有微服务都向注册中心发送请求,注册中心将注册中心状态更新为“在线”,如果微服务超过5分钟没有发送“心跳”请求,则变为“离线”
  • 这个答案没有解释为什么容器被关闭 - 正如一些 cmets 对容器命令已完成的问题所解释的那样。这个答案更多地是关于问题的“为什么”。
  • 这些“一些cmets”会不会也是我的@JohnXF? ? 问题标题需要编辑。队列已满,所以我不能这样做。如果会那么好
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2010-09-09
  • 2014-08-08
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多