Ich werde mich diesen Monat von meinem derzeitigen SIer zurückziehen und denke darüber nach, Ingenieur für die Infrastruktur zu werden. Beim Aufbau einer Infrastruktur und einer CI / CD-Umgebung, die in den letzten Jahren die öffentlichen Clouds voll ausnutzt, sollte selbst ein älterer Ingenieur wie ich vermeiden, Apps in verschiedenen Sprachen zu erstellen oder Apps zur Überprüfung der Kommunikation zu erstellen. Ungefähr zu dieser Zeit habe ich das Gefühl, dass ich nicht mehr bestehen kann.
Ich wollte mein Bestes geben, um verschiedene Sprachen zu erstellen und eine kleine Webanwendung zu erstellen. Deshalb habe ich dieses Mal das Verfahren beschrieben, um eine Flask-Anwendung (nur durch Berühren) mit Python und Pipenv zu erstellen und daraus einen Docker-Container zu machen.
In den letzten Jahren wurde die Python-Umgebungskonstruktion anscheinend mit einem Tool namens Pipenv erstellt, daher habe ich versucht, es zu verwenden. Es ist wie JavaScript npm und einfach zu bedienen.
pip install pipenv
mkdir flask-app
cd flask-app
Dieses Mal werde ich Python 3.8 verwenden.
pipenv --python 3.8
pipenv install flask
pipenv install --dev autopep8
Erstellen Sie eine leere Datei, die erstellt werden soll.
mkdir src
touch src/main.py
touch Dockerfile
touch .dockerignore
Zum Abschnitt "Skripte" der "Pipfile" hinzufügen.
[scripts]
start = "python src/main.py"
Es wird ein Code sein, der von einem Python-Amateur geschrieben wurde, aber ich habe ihn wie folgt erstellt.
src/main.py
import sqlite3
import flask
app = flask.Flask(__name__)
def get_db():
db = getattr(flask.g, '_database', None)
if db is None:
db = flask.g._database = sqlite3.connect('mydb.sqlite')
return db
@app.teardown_appcontext
def close_conn(exception):
db = getattr(flask.g, '_database', None)
if db is not None:
db.close()
@app.route('/todos/<id>', methods=['GET'])
@app.route('/todos', methods=['GET', 'POST'])
def todos(id=None):
db = get_db()
#Erstellen Sie eine Tabelle, wenn Sie eine Anfrage erhalten
curs = db.cursor()
curs.execute(
'create table if not exists todos('
'id integer primary key autoincrement, title string)'
)
id = flask.request.values.get('id', id)
if flask.request.method == 'GET' and id is not None:
curs.execute('select * from todos where id = {}'.format(id))
response = curs.fetchone()
if response is not None:
id, title = response
return flask.jsonify(todo={"id": id, "title": title}), 200
return flask.jsonify(message='resource not found'), 400
if flask.request.method == 'GET':
curs.execute('select * from todos')
response = curs.fetchall()
todos = []
for todo in response:
id, title = todo
todos.append({"id": id, "title": title})
return flask.jsonify(todos=todos), 200
if flask.request.method == 'POST':
title = flask.request.json['title']
curs.execute('insert into todos(title) values("{}")'.format(title))
db.commit()
return flask.jsonify(message='created new toto')
def main():
app.debug = True
app.run(host='0.0.0.0', port=5000)
if __name__ == "__main__":
main()
Zu diesem Zeitpunkt sollte es in Ihrer lokalen Umgebung funktionieren.
pipenv run start
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 208-926-045
Drücken Sie den Curl-Befehl, um dies zu überprüfen.
curl -XPOST -H 'Content-Type: application/json' localhost:5000/todos -d '{"title": "new task1"}'
curl -XPOST -H 'Content-Type: application/json' localhost:5000/todos -d '{"title": "new task2"}'
curl localhost:5000/todos
curl localhost:5000/todos/1
Ich kenne die Praxis in Kombination mit Pipenv nicht, aber ich habe sie mit Simple is Best gemacht.
FROM python:3.8
ENV LC_ALL=C.UTF-8 \
LANG=C.UTF-8
WORKDIR /app
COPY . .
RUN pip install pipenv
RUN pipenv install
CMD ["pipenv", "run", "start"]
EXPOSE 5000
Erstellen Sie auch eine .dockerignore-Datei.
.dockerignore
*.sqlite
.git
Bauen.
docker image build -t flaskapp:latest .
Starten Sie den Container (starten Sie den lokalen Port als 15000).
docker container run -it -p 15000:5000 --rm flaskapp:latest
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 954-331-726
Es ist in Ordnung, wenn Sie dies durch Drücken des Befehls curl bestätigen können.
curl -XPOST -H 'Content-Type: application/json' localhost:15000/todos -d '{"title": "new task1"}'
curl -XPOST -H 'Content-Type: application/json' localhost:15000/todos -d '{"title": "new task2"}'
curl localhost:15000/todos
curl localhost:15000/todos/1
Ich war an npm und Garn in NodeJS gewöhnt, daher habe ich es vermieden, eine Python-Umgebung zu erstellen, aber ich fand Pipenv nützlich. Ich kannte Pipenv nicht und hatte das Gefühl, es verloren zu haben.
Aus Sicht eines Infrastrukturingenieurs (subjektiv) bin ich vorerst zufrieden, weil ich es bisher getan habe. Wir werden unser Bestes tun, um die Umgebung bereitzustellen, ohne den App-Ingenieur zu stören.
Obwohl ich mich bis vor ungefähr fünf Jahren nicht an viel erinnerte, sind die Veränderungen in der Umgebung der IT-Technologie heutzutage enorm. Es wurde zurückgelassen, aber ich versuche verzweifelt, es einzuholen.
Recommended Posts