Почему мой образ docker не запускается при использовании docker run (image), но я могу запускать контейнеры, созданные с помощью docker-compose up?
Мой docker-compose создает 3 контейнера - django, celery и rabbitmq. Когда я выполняю следующие команды -> docker-compose build и docker-compose up, контейнеры успешно запускаются.
Однако у меня возникли проблемы с развертыванием образа. Созданный образ имеет идентификатор образа 24d7638e2aff. Однако по какой-то причине, если я просто выполняю приведенную ниже команду, ничего не происходит с выходом 0. Оба приложения django и celery имеют одинаковый идентификатор образа
docker run 24d7638e2aff
Это не очень хорошо, так как я не могу развернуть этот образ на kubernetes. Моя единственная мысль заключается в том, что dockerfile был настроен неправильно, но я не могу понять, в чем причина
docker-compose.yaml
version: "3.9"
services:
django:
container_name: testapp_django
build:
context: .
args:
build_env: production
ports:
- "8000:8000"
command: >
sh -c "python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
links:
- rabbitmq
- celery
rabbitmq:
container_name: testapp_rabbitmq
restart: always
image: rabbitmq:3.10-management
ports:
- "5672:5672" # specifies port of queue
- "15672:15672" # specifies port of management plugin
celery:
container_name: testapp_celery
restart: always
build:
context: .
args:
build_env: production
command: celery -A testapp worker -l INFO -c 4
depends_on:
- rabbitmq
Dockerfile
ARG PYTHON_VERSION=3.9-slim-buster
# define an alias for the specfic python version used in this file.
FROM python:${PYTHON_VERSION} as python
# Python build stage
FROM python as python-build-stage
ARG build_env
# Install apt packages
RUN apt-get update && apt-get install --no-install-recommends -y \
# dependencies for building Python packages
build-essential \
# psycopg2 dependencies
libpq-dev
# Requirements are installed here to ensure they will be cached.
COPY ./requirements .
# Create Python Dependency and Sub-Dependency Wheels.
RUN pip wheel --wheel-dir /usr/src/app/wheels \
-r ${build_env}.txt
# Python 'run' stage
FROM python as python-run-stage
ARG build_env
ARG APP_HOME=/app
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV BUILD_ENV ${build_env}
WORKDIR ${APP_HOME}
RUN addgroup --system appuser \
&& adduser --system --ingroup appuser appuser
# Install required system dependencies
RUN apt-get update && apt-get install --no-install-recommends -y \
# psycopg2 dependencies
libpq-dev \
# Translations dependencies
gettext \
# git for GitPython commands
git-all \
# cleaning up unused files
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
&& rm -rf /var/lib/apt/lists/*
# All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction
# copy python dependency wheels from python-build-stage
COPY --from=python-build-stage /usr/src/app/wheels /wheels/
# use wheels to install python dependencies
RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \
&& rm -rf /wheels/
COPY --chown=appuser:appuser ./docker_scripts/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod +x /entrypoint
# copy application code to WORKDIR
COPY --chown=appuser:appuser . ${APP_HOME}
# make appuser owner of the WORKDIR directory as well.
RUN chown appuser:appuser ${APP_HOME}
USER appuser
EXPOSE 8000
ENTRYPOINT ["/entrypoint"]
точка входа
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
exec "$@"
Как мне создать образы этих контейнеров, чтобы я мог развернуть их на k8s?
Я думаю, это потому, что команды для запуска сервера django находятся в docker-compose.yml
.
Вы должны переместить эти команды внутрь точки входа.
set -o errexit
set -o pipefail
set -o nounset
python manage.py migrate && python manage.py runserver 0.0.0.0:8000
exec "$@"
Обратите внимание, что эта команда python manage.py runserver 0.0.0.0:8000
запустит приложение с сервера разработки, который нельзя использовать в производственных целях.
Вам следует искать gunicorn или подобное.
Compose command:
переопределяет Dockerfile CMD
. docker run
вообще не смотрит на файл docker-compose.yml
, а docker run
без определенной команды запускает CMD
образа. Вы ничего не объявили для этого, поэтому контейнер немедленно завершает работу.
Оставьте сценарий точки входа без изменений (или даже удалите его совсем, поскольку он ничего не делает). Добавьте строку CMD
в Dockerfile
CMD python manage.py migrate && python manage.py runserver 0.0.0.0:8000
Теперь простой docker run
, как вы показали, попытается запустить сервер Django. Для контейнера Celery вы все еще можете передать команду override
docker run -d --net ... your-image \
celery -A testapp worker -l INFO -c 4
Если вы выполняете развертывание в Kubernetes и сохраняете сценарий точки входа, то вам нужно использовать args:
в спецификации pod для предоставления альтернативной команды, а не command:
.