Пытаюсь развернуть приложение Django на Elastic Beanstalk: "процесс docker не зарегистрирован"
Пытаюсь развернуть приложение Django на Elastic Beanstalk. Я использую платформу "Docker running on 64bit Amazon Linux 2" и EB CLI. Моя конфигурация такова:
- Dockerfile
- docker-compose.yml, настраивающий как приложение Django, так и сервер NGinx .
Когда я запускаю eb deploy
, процесс запускается, и проверка здоровья среды зеленая, но на самом деле ничего не развертывается. Когда я просматриваю журналы eb-engine, я вижу вот такую ошибку:
[INFO] Running command /bin/sh -c systemctl show -p PartOf docker.service
[ERROR] An error occurred during execution of command [env-launch] - [Start Docker]. Stop running the command. Error: startProcess Failure: process "docker" is not registered
Я искал в Интернете несколько часов, но не смог найти подсказку, что может быть не так 😟
Files
За компиляцию статических активов отвечает Dockerfile:
# Dockerfile
ARG PYTHON_VERSION=3.10-slim-buster
# STAGE 1: Compile static assets
# ----------------------------
FROM node:17-slim as client-builder
ARG APP_HOME=/code
WORKDIR ${APP_HOME}
COPY . ${APP_HOME}
RUN npm install && npm cache clean --force
# STAGE 2: Add python dependencies
# ----------------------------
FROM python:${PYTHON_VERSION} as python-build-stage
ARG APP_HOME=/code \
USERNAME=pages
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
POETRY_NO_INTERACTION=1 \
POETRY_VIRTUALENVS_CREATE=false \
POETRY_CACHE_DIR="/var/cache/pypoetry" \
POETRY_HOME="/usr/local"
RUN mkdir ${APP_HOME} && \
mkdir ${APP_HOME}/staticfiles && \
mkdir ${APP_HOME}/media
WORKDIR ${APP_HOME}
# Create the user
RUN addgroup --system ${USERNAME} \
&& adduser --system --ingroup ${USERNAME} ${USERNAME}
# Install apt packages
RUN apt-get update --yes --quiet && apt-get install --no-install-recommends --yes --quiet \
# dependencies for building Python packages
build-essential \
# psycopg2 dependencies
libpq-dev \
# jpeg compression
libjpeg62-turbo-dev \
# gzip compression
zlib1g-dev \
# webp compression
libwebp-dev \
# dev utils
git zsh \
# cleanup
&& rm -rf /var/lib/apt/lists/*
# Copy project files
COPY --from=client-builder ${APP_HOME} ${APP_HOME}
# Install python dependencies
RUN pip install --upgrade pip
RUN pip install poetry
RUN poetry install --no-interaction --no-ansi
# Expose post
EXPOSE 8000
# Set default shell
RUN chsh -s $(which zsh)
# Set ownership of the app directory to app user
RUN chown -R ${USERNAME}:${USERNAME} $APP_HOME
# Set user
USER ${USERNAME}
ENTRYPOINT [ "docker/entrypoint.sh" ]
CMD []
В docker-compose.yml создается базовый сервер Nginx в соответствии с этими инструкциями.
# Docker Compose
version: '3.10'
services:
web:
build: .
command: >
gunicorn config.wsgi:application -- bind 0.0.0.0:8000
expose:
- 8000
environment:
SECRET_KEY: ${SECRET_KEY}
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
DATABASE_URL: "postgres://${RDS_USERNAME}:${RDS_PASSWORD}@${RDS_HOSTNAME}:${RDS_PORT}/db-name"
DJANGO_SETTINGS_MODULE: config.environments.staging
restart: on-failure:5
volumes:
- static_volume:/code/staticfiles
- media_volume:/code/media
nginx:
build: ./nginx
ports:
- 1337:80
depends_on:
- web
restart: unless-stopped
volumes:
- static_volume:/code/staticfiles
- media_volume:/code/media
volumes:
static_volume:
media_volume:
entrypoint.sh
запускает начальные команды Django
#!/bin/bash
# Bash options
set -o errexit
set -o pipefail
set -o nounset
# Django commands
python manage.py collectstatic --noinput
python manage.py migrate
exec "$@"
Конфигурация Nginx - голая
# nginx/Dockerfile
FROM nginx:1.22-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
# nginc.conf
upstream pluckd-pages {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
client_max_body_size 100M;
}
location /static/ {
alias /code/staticfiles/;
}
location /media/ {
alias /code/media/;
}
}
Я чувствую, что есть что-то настолько очевидное, что я упускаю! Почему он жалуется, что процесс "docker" отсутствует?