在dockercompose中使用waitfor脚本时,Docker容器应用程序未运行

2024-10-02 14:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

关于我的问题的简短解释

我们正在讨论docker compose中的两层结构

在一个docker中运行的两个容器在它们之间的同一网络上组成

因为我需要首先运行ElasticSearch容器,所以我在应用程序容器上使用了一个脚本,让ES先运行,然后再运行应用程序

看起来ES运行正常,应用程序正在关闭

也许是检查应用程序代码的练习的一部分,我已经检查了文件中是否有遗漏的详细信息

请看一下我的docker文件、docker compose和应用程序文件

Docker编写文件:

version: '3'
services: 
    app:
        image: food15
        restart: always
        container_name: foodtruck_app
        entrypoint: sh -c './wait-for.sh es:foodtruck_app -- python3 app.py'
        ports:
            - "8085:5000"
        environment: 
            - "discovery.type=single-node"
            - "bootstrap.memory_lock=true"
        networks: 
            - elastic
        depends_on: 
            - es

    es:
        image: docker.elastic.co/elasticsearch/elasticsearch:6.3.0
        container_name: es
        ports: 
            - "9200:9200"
            - "9300:9300"
        volumes:
            - "data:/usr/share/elasticsearch/data"
        networks: 
            - elastic

networks: 
    elastic:
        driver: bridge

volumes: 
    data:
        external: true

建筑应用程序的Dockerfile:

FROM alpine:3.14.0
# Expose port 5000 of app (not sure)
EXPOSE 5000

# Install all build tools
RUN apk add --update nodejs npm
RUN apk add --update npm
RUN apk update
RUN apk add py3-pip
RUN apk add python3


# Move files to container area
COPY /project /app
# Move specific file to container area
COPY wait-for.sh /app/flask-app/
# Switch directory in container to the app.py file
WORKDIR /app/flask-app/
RUN ls
# Giving +x to file
RUN chmod +x wait-for.sh

# Important for future maybe
# RUN apk add -q update && apk add -qy install netcat


# Build source files
RUN npm install
# another command similar but different to 'npm install'
RUN npm run build
# Install dependencies of app with pip
RUN pip3 install -r requirements.txt

# Run app
ENTRYPOINT [ "python3", "app.py" ]

应用程序文件:

from elasticsearch import Elasticsearch, exceptions
import os
import time
from flask import Flask, jsonify, request, render_template
import sys
import requests

es = Elasticsearch(host='es')

app = Flask(__name__)

def load_data_in_es():
    """ creates an index in elasticsearch """
    url = "http://data.sfgov.org/resource/rqzj-sfat.json"
    r = requests.get(url)
    data = r.json()
    print("Loading data in elasticsearch ...")
    for id, truck in enumerate(data):
        res = es.index(index="sfdata", doc_type="truck", id=id, body=truck)
    print("Total trucks loaded: ", len(data))

def safe_check_index(index, retry=3):
    """ connect to ES with retry """
    if not retry:
        print("Out of retries. Bailing out...")
        sys.exit(1)
    try:
        status = es.indices.exists(index)
        return status
    except exceptions.ConnectionError as e:
        print("Unable to connect to ES. Retrying in 5 secs...")
        time.sleep(5)
        safe_check_index(index, retry-1)

def format_fooditems(string):
    items = [x.strip().lower() for x in string.split(":")]
    return items[1:] if items[0].find("cold truck") > -1 else items

def check_and_load_index():
    """ checks if index exits and loads the data accordingly """
    if not safe_check_index('sfdata'):
        print("Index not found...")
        load_data_in_es()

###########
### APP ###
###########
@app.route('/')
def index():
    return render_template('index.html')

@app.route('/debug')
def test_es():
    resp = {}
    try:
        msg = es.cat.indices()
        resp["msg"] = msg
        resp["status"] = "success"
    except:
        resp["status"] = "failure"
        resp["msg"] = "Unable to reach ES"
    return jsonify(resp)

@app.route('/search')
def search():
    key = request.args.get('q')
    if not key:
        return jsonify({
            "status": "failure",
            "msg": "Please provide a query"
        })
    try:
        res = es.search(
                index="sfdata",
                body={
                    "query": {"match": {"fooditems": key}},
                    "size": 750 # max document size
              })
    except Exception as e:
        return jsonify({
            "status": "failure",
            "msg": "error in reaching elasticsearch"
        })
    # filtering results
    vendors = set([x["_source"]["applicant"] for x in res["hits"]["hits"]])
    temp = {v: [] for v in vendors}
    fooditems = {v: "" for v in vendors}
    for r in res["hits"]["hits"]:
        applicant = r["_source"]["applicant"]
        if "location" in r["_source"]:
            truck = {
                "hours"    : r["_source"].get("dayshours", "NA"),
                "schedule" : r["_source"].get("schedule", "NA"),
                "address"  : r["_source"].get("address", "NA"),
                "location" : r["_source"]["location"]
            }
            fooditems[applicant] = r["_source"]["fooditems"]
            temp[applicant].append(truck)

    # building up results
    results = {"trucks": []}
    for v in temp:
        results["trucks"].append({
            "name": v,
            "fooditems": format_fooditems(fooditems[v]),
            "branches": temp[v],
            "drinks": fooditems[v].find("COLD TRUCK") > -1
        })
    hits = len(results["trucks"])
    locations = sum([len(r["branches"]) for r in results["trucks"]])

    return jsonify({
        "trucks": results["trucks"],
        "hits": hits,
        "locations": locations,
        "status": "success"
    })

if __name__ == "__main__":
    ENVIRONMENT_DEBUG = os.environ.get("DEBUG", False)
    check_and_load_index()
    app.run(host='127.0.0.1', port=5000, debug=ENVIRONMENT_DEBUG)

尝试运行docker compose up时的日志输出:

Creating network "foodtrucks_elastic" with driver "bridge"
Creating es ... done
Creating foodtruck_app ... done
Attaching to es, foodtruck_app
es     | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
es     | [2021-07-11T09:38:35,339][INFO ][o.e.n.Node               ] [] initializing ...
es     | [2021-07-11T09:38:35,397][INFO ][o.e.e.NodeEnvironment    ] [xXNsHIz] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/nvme0n1p7)]], net usable_space [64gb], net total_space [95.6gb], types [ext4]
es     | [2021-07-11T09:38:35,397][INFO ][o.e.e.NodeEnvironment    ] [xXNsHIz] heap size [989.8mb], compressed ordinary object pointers [true]
es     | [2021-07-11T09:38:35,399][INFO ][o.e.n.Node               ] [xXNsHIz] node name derived from node ID [xXNsHIz2R0yircwGvdQwdg]; set [node.name] to override
es     | [2021-07-11T09:38:35,399][INFO ][o.e.n.Node               ] [xXNsHIz] version[6.3.0], pid[1], build[default/tar/424e937/2018-06-11T23:38:03.357887Z], OS[Linux/5.8.0-59-generic/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/10.0.1/10.0.1+10]
es     | [2021-07-11T09:38:35,399][INFO ][o.e.n.Node               ] [xXNsHIz] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.WpeOollh, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m, -Djava.locale.providers=COMPAT, -Des.cgroups.hierarchy.override=/, -Des.path.home=/usr/share/elasticsearch, -Des.path.conf=/usr/share/elasticsearch/config, -Des.distribution.flavor=default, -Des.distribution.type=tar]
es     | [2021-07-11T09:38:37,241][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [aggs-matrix-stats]
es     | [2021-07-11T09:38:37,241][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [analysis-common]
es     | [2021-07-11T09:38:37,241][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [ingest-common]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [lang-expression]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [lang-mustache]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [lang-painless]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [mapper-extras]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [parent-join]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [percolator]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [rank-eval]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [reindex]
es     | [2021-07-11T09:38:37,242][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [repository-url]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [transport-netty4]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [tribe]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-core]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-deprecation]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-graph]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-logstash]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-ml]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-monitoring]
es     | [2021-07-11T09:38:37,243][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-rollup]
es     | [2021-07-11T09:38:37,244][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-security]
es     | [2021-07-11T09:38:37,244][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-sql]
es     | [2021-07-11T09:38:37,244][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-upgrade]
es     | [2021-07-11T09:38:37,244][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded module [x-pack-watcher]
es     | [2021-07-11T09:38:37,245][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded plugin [ingest-geoip]
es     | [2021-07-11T09:38:37,245][INFO ][o.e.p.PluginsService     ] [xXNsHIz] loaded plugin [ingest-user-agent]
es     | [2021-07-11T09:38:39,831][INFO ][o.e.x.s.a.s.FileRolesStore] [xXNsHIz] parsed [0] roles from file [/usr/share/elasticsearch/config/roles.yml]
es     | [2021-07-11T09:38:40,251][INFO ][o.e.x.m.j.p.l.CppLogMessageHandler] [controller/118] [Main.cc@109] controller (64 bit): Version 6.3.0 (Build 0f0a34c67965d7) Copyright (c) 2018 Elasticsearch BV
es     | [2021-07-11T09:38:40,832][INFO ][o.e.d.DiscoveryModule    ] [xXNsHIz] using discovery type [zen]
es     | [2021-07-11T09:38:41,578][INFO ][o.e.n.Node               ] [xXNsHIz] initialized
es     | [2021-07-11T09:38:41,578][INFO ][o.e.n.Node               ] [xXNsHIz] starting ...
es     | [2021-07-11T09:38:41,780][INFO ][o.e.t.TransportService   ] [xXNsHIz] publish_address {172.22.0.2:9300}, bound_addresses {0.0.0.0:9300}
es     | [2021-07-11T09:38:41,803][INFO ][o.e.b.BootstrapChecks    ] [xXNsHIz] bound or publishing to a non-loopback address, enforcing bootstrap checks
es     | [2021-07-11T09:38:44,977][INFO ][o.e.c.s.MasterService    ] [xXNsHIz] zen-disco-elected-as-master ([0] nodes joined)[, ], reason: new_master {xXNsHIz}{xXNsHIz2R0yircwGvdQwdg}{SbE9aquQQZWhJLtoqyjzqQ}{172.22.0.2}{172.22.0.2:9300}{ml.machine_memory=16491986944, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}
es     | [2021-07-11T09:38:44,982][INFO ][o.e.c.s.ClusterApplierService] [xXNsHIz] new_master {xXNsHIz}{xXNsHIz2R0yircwGvdQwdg}{SbE9aquQQZWhJLtoqyjzqQ}{172.22.0.2}{172.22.0.2:9300}{ml.machine_memory=16491986944, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true}, reason: apply cluster state (from master [master {xXNsHIz}{xXNsHIz2R0yircwGvdQwdg}{SbE9aquQQZWhJLtoqyjzqQ}{172.22.0.2}{172.22.0.2:9300}{ml.machine_memory=16491986944, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true} committed version [1] source [zen-disco-elected-as-master ([0] nodes joined)[, ]]])
es     | [2021-07-11T09:38:45,005][INFO ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [xXNsHIz] publish_address {172.22.0.2:9200}, bound_addresses {0.0.0.0:9200}
es     | [2021-07-11T09:38:45,006][INFO ][o.e.n.Node               ] [xXNsHIz] started
es     | [2021-07-11T09:38:45,356][WARN ][o.e.x.s.a.s.m.NativeRoleMappingStore] [xXNsHIz] Failed to clear cache for realms [[]]
es     | [2021-07-11T09:38:45,383][INFO ][o.e.l.LicenseService     ] [xXNsHIz] license [749628c8-ccca-4874-a425-2206b74dc27c] mode [basic] - valid
es     | [2021-07-11T09:38:45,405][INFO ][o.e.g.GatewayService     ] [xXNsHIz] recovered [0] indices into cluster_state
foodtruck_app | Operation timed out
foodtruck_app | Operation timed out
foodtruck_app exited with code 1

谢谢你的帮助


Tags: torunininfotrueappfordata