Dockerfile можно описать как набор инструкций, которые применяются при сборке образа и запуске контейнера. Рассмотрим пример Dockerfile для запуска простого веб-приложения на Flask
nano devopslife.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Welcome to devopslife.ru!'
nano Dockerfile
FROM python:3.11-slim // указываем базовый образ (Python так как Flask)
WORKDIR /app // задаем рабочий каталог. Это равнозначно выполнению команды cd /app. Все последующие команды, например RUN, COPY, CMD будут выполнять в директории /app внутри контейнера
RUN pip install flask==2.3 // установим зависимости
COPY . /app // скопируем все из директории с Dockerfile в /app
ENV FLASK_APP=devopslife.py // укажем где находится наше приложение
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"] // укажем команду, которая будет выполняться при запуске контейнера. В нашем случае мы запускаем Flask на порту 5000 и делаем его доступным не только как localhost.
// создадим dockerignore (похож на gitignore) чтобы при выполнении COPY наш Dockerfile не был скопирован
nano .dockerignore
Dockerfile
docker build . -t devopslife-flask-app:beta // создадим сам образ
docker image ls
docker container run -d -p 5000:5000 devopslife-flask-app:beta
docker container ls
Проверим
ip_address:5000
Видим приветственное сообщение