关于我的问题的简短解释
我们正在讨论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
谢谢你的帮助
目前没有回答
相关问题 更多 >
编程相关推荐