Docker-Compose:healtcheck script(curl),但服务始终(健康:启动)



>我有以下docker-compose

version: '2.1'
services:
myprogram-app:
image: myprogram
mem_limit: 1024m
environment:
- SPRING_PROFILES_ACTIVE=prod,swagger
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka
- SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config
- SPRING_DATASOURCE_URL=jdbc:postgresql://myprogram-postgresql:5432/myprogram
- JHIPSTER_SLEEP=30
- SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=myprogram-elasticsearch:9300
- JHIPSTER_REGISTRY_PASSWORD=password
- EMAIL_USERNAME
- EMAIL_PASSWORD
ports:
- 8080:8080
networks:
- backend
depends_on:
jhipster-registry:
condition: service_healthy
myprogram-postgresql:
condition: service_started
myprogram-elasticsearch:
condition: service_started
restart: on-failure
myprogram-postgresql:
image: postgres:9.6.5
mem_limit: 256m
environment:
- POSTGRES_USER=myprogram
- POSTGRES_PASSWORD=myprogram
networks:
- backend
myprogram-elasticsearch:
image: elasticsearch:2.4.6
mem_limit: 512m
networks:
- backend
jhipster-registry:
extends:
file: jhipster-registry.yml
service: jhipster-registry
mem_limit: 512m
ports:
- 8761:8761
networks:
- backend
healthcheck:
test: ["CMD", "./isUp", "jhipster-registry:8761"]
interval: 30s
retries: 20
networks:
backend:
driver: "bridge"

和以下脚本,在同一目录(项目根目录(中:

echo Testing if $1 is UP
http_code=$(curl -LI $1 -o /dev/null -w '%{http_code}n' -s)
if [ ${http_code} -eq 200 ]; then
echo The service is UP and Running
exit 0
else
echo The service is DOWN
exit 1
fi

我面临的问题是,即使在jhipster-registry服务启动之后,它仍然继续向我显示

CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                            PORTS                    NAMES
8b16c572e0f2        jhipster/jhipster-registry:v3.2.4   "/bin/sh -c 'java   …"   6 minutes ago       Up 6 minutes (health: starting)   0.0.0.0:8761->8761/tcp   compose_jhipster-registry_1
ed86d15ea485        elasticsearch:2.4.6                 "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes                      9200/tcp, 9300/tcp       compose_myprogram-elasticsearch_1
f268fa1a11f1        postgres:9.6.5                      "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes                      5432/tcp                 compose_myprogram-postgresql_1

即使服务已启动并运行(我也登录了它(。

我还做了一个测试,在我的机器上执行isUp命令,它按预期工作:

izio@1z10:~/Desktop/WorkSpace/myprogram/compose$ ./isUp.sh localhost:8761
Testing if localhost:8761 is UP
The service is UP and Running
izio@1z10:~/Desktop/WorkSpace/myprogram/compose$
izio@1z10:~/Desktop/WorkSpace/myprogram/compose$ echo $?
0
izio@1z10:~/Desktop/WorkSpace/myprogram/compose$ 

最后,注册表服务在终止重试后变得不正常。

izio@1z10:~/Desktop/WorkSpace/myprogram/compose$  docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
8b16c572e0f2        jhipster/jhipster-registry:v3.2.4   "/bin/sh -c 'java   …"   10 minutes ago      Up 10 minutes (unhealthy)   0.0.0.0:8761->8761/tcp   compose_jhipster-registry_1
ed86d15ea485        elasticsearch:2.4.6                 "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes               9200/tcp, 9300/tcp       compose_myprogram-elasticsearch_1
f268fa1a11f1        postgres:9.6.5                      "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes               5432/tcp                 compose_myprogram-postgresql_1

无法了解此运行状况检查出了什么问题。如何解决?

同样的东西,使用 127.0.0.1:8761

test: ["CMD", "./isUp", "127.0.0.1:8761"]

或本地主机:8761

test: ["CMD", "./isUp", "localhost:8761"]

docker-compose配置存在一些问题:

  1. jhipster-registry基于openjdk:8,未安装curl
  2. isUp 脚本不会复制到容器的文件系统中,因此甚至不会执行。

为了解决这个问题,我找到的解决方案利用了基本容器功能。 由于它是openjdk:8,因此可以通过jar导出的Java程序来测试服务可用性。所以我做到了。

在目录的根目录中,放置一个Ping.jar对应于以下类:

package ping;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Main {
public static void main(String[] args) {
if (args.length != 2) {
System.exit(-1);
}
String host = args[0];
int port = 0;
try {
port = Integer.parseInt(args[1]);
} catch (NumberFormatException e) {
e.printStackTrace();
System.exit(-2);
}
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(host, port), 10 * 1000);
System.exit(0);
} catch (IOException e) {
System.exit(1);
}
}
}

然后通过卷字段使其在jhipster-registry容器中可用:

jhipster-registry:
extends:
file: jhipster-registry.yml
service: jhipster-registry
mem_limit: 512m
ports:
- 8761:8761
networks:
- backend
volumes:
- ${PWD}/Ping.jar:/Ping.jar
healthcheck:
test: ["CMD", "java", "-jar", "/Ping.jar", "localhost", "8761"]
interval: 30s
retries: 20

这样,一旦准备好接受连接,服务最终将显示为正常

CONTAINER ID        IMAGE                               COMMAND                   CREATED             STATUS                   PORTS                              NAMES
b3dd86605278        jhipster/jhipster-registry:v3.2.4   "/bin/sh -c 'java   …"    3 minutes ago       Up 3 minutes (healthy)   0.0.0.0:8761->8761/tcp             compose_jhipster-registry_1

相关内容

最新更新