Необходимые шаги:
- Установить Docker Desktop
- Залогиниться (через GitHub)
- Убедиться, что Engine running
- First stage (requirements-stage)
- Используем образ python
- Устанавливаем poetry
- Преобразуем требования из poetry в
requirements.txt
- Second stage
- Устанавливаем
requirements.txt
- Копируем код
- Запускаем с помощью
uvicorn
- Устанавливаем
FROM python:3.11 as requirements-stage
WORKDIR /tmp
RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org poetry
COPY ./pyproject.toml ./poetry.lock* /tmp/
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
FROM python:3.11
WORKDIR /code
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
RUN pip3 install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org -r /code/requirements.txt
COPY ./app /code/app
COPY ./.env /code/.env
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Далее готовим образ:
docker build -t username/myimage .
И запускаем контейнер:
docker run -d --name mycontainer -p 80:80 username/myimage
Проверяем результат на http://localhost:80/
- Создать токен на DockerHub
- Добавить токен в Secrets репозитория
name: Deploy
on:
push:
branches:
- '*'
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Login to Docker Hub
run: echo ${{ secrets.DOCKER_PASS }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: build image
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/myimage .
- name: push to Docker Hub
run: docker push ${{ secrets.DOCKER_USERNAME }}/myimage:latest
Делаем так, чтобы workflow срабатывал после успешного выполнения ci.yaml
(работает только в default branch)
В ci.yaml
добавляем name
:
name: Checks
Далее дорабатываем deploy.yaml
:
name: Deploy
on:
workflow_run:
workflows: [Checks]
types:
- completed
push:
branches:
- '*'
jobs:
upload:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- uses: actions/checkout@master
- name: Login to Docker Hub
run: echo ${{ secrets.DOCKER_PASS }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: build image
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/myimage .
- name: push to Docker Hub
run: docker push ${{ secrets.DOCKER_USERNAME }}/myimage:latest