Je vais prendre ma retraite de mon SIer actuel ce mois-ci, et je pense devenir ingénieur en infrastructure. Lors de la création d'une infrastructure et d'un environnement CI / CD qui utilise pleinement les clouds publics ces dernières années, même un ancien ingénieur comme moi devrait éviter de créer des applications dans différentes langues ou de créer des applications pour vérifier la communication. C'est à cette époque que je sens que je ne peux plus passer.
Je voulais faire de mon mieux pour créer divers langages et créer une petite application Web, alors cette fois j'ai décrit la procédure pour créer une application Flask (en la touchant juste) avec Python et Pipenv et en faire un conteneur Docker.
Ces dernières années, la construction de l'environnement Python semble être construite à l'aide d'un outil appelé Pipenv, j'ai donc essayé de l'utiliser. C'est comme JavaScript npm et facile à utiliser.
pip install pipenv
mkdir flask-app
cd flask-app
Cette fois, j'utiliserai Python 3.8.
pipenv --python 3.8
pipenv install flask
pipenv install --dev autopep8
Créez un fichier vide à créer.
mkdir src
touch src/main.py
touch Dockerfile
touch .dockerignore
Ajoutez à la section scripts
du Pipfile
.
[scripts]
start = "python src/main.py"
Ce sera du code écrit par un amateur de Python, mais je l'ai créé comme suit.
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()
#Créez une table lorsque vous recevez une demande
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()
À ce stade, il devrait fonctionner dans votre environnement local.
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
Appuyez sur la commande curl pour vérifier.
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
Je ne connais pas la pratique en combinaison avec Pipenv, mais je l'ai fait avec Simple is Best.
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
Créez également un fichier .dockerignore
.
.dockerignore
*.sqlite
.git
Construire.
docker image build -t flaskapp:latest .
Démarrez le conteneur (en commençant le port local en tant que 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
C'est OK si vous pouvez confirmer en appuyant sur la commande curl.
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
J'étais habitué à npm et yarn dans nodejs, j'ai donc évité de créer un environnement python, mais j'ai trouvé Pipenv utile. Je ne connaissais pas Pipenv, alors j'avais l'impression de l'avoir perdu.
Pour l'instant, du point de vue d'un ingénieur infrastructure (subjectif), je suis satisfait car je l'ai fait jusqu'à présent. Nous ferons de notre mieux pour fournir l'environnement sans déranger l'ingénieur d'application.
Cependant, même si je ne me souvenais pas beaucoup jusqu'à il y a environ cinq ans, les changements dans l'environnement entourant la technologie informatique de nos jours sont énormes. Il a été laissé pour compte, mais j'essaie désespérément de le rattraper.