skip to Main Content

My docker-compose creates 3 containers – django, celery and rabbitmq. When i run the following commands -> docker-compose build and docker-compose up, the containers run successfully.

However I am having issues with deploying the image. The image generated has an image ID of 24d7638e2aff. For whatever reason however, if I just run the command below, nothing happens with an exit 0. Both the django and celery applications have the same image id.

docker run 24d7638e2aff

This is not good, as I am unable to deploy this image on kubernetes. My only thought is that the dockerfile has been configured wrongly, but i cannot figure out what is the cause

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"]

entrypoint

#!/bin/bash

set -o errexit
set -o pipefail
set -o nounset

exec "$@"

How do I build images of these containers so that I can deploy them to k8s?

2

Answers


  1. I think that is because the commands to run the django server are in the docker-compose.yml.

    You should move these commands inside the entrypoint.

    set -o errexit
    set -o pipefail
    set -o nounset
    
    python manage.py migrate && python manage.py runserver 0.0.0.0:8000
    exec "$@"
    

    Pay attention that this command python manage.py runserver 0.0.0.0:8000 will start the application with a development server that cannot be used for production purposes.

    You should look for gunicorn or similar.

    Login or Signup to reply.
  2. The Compose command: overrides the Dockerfile CMD. docker run doesn’t look at the docker-compose.yml file at all, and docker run with no particular command runs the image’s CMD. You haven’t declared anything for that, which is why the container exits immediately.

    Leave the entrypoint script unchanged (or even delete it entirely, since it doesn’t really do anything). Add a CMD line to the Dockerfile

    CMD python manage.py migrate && python manage.py runserver 0.0.0.0:8000
    

    Now plain docker run as you’ve shown it will attempt to start the Django server. For the Celery container, you can still pass a command override

    docker run -d --net ... your-image 
      celery -A testapp worker -l INFO -c 4
    

    If you do deploy to Kubernetes, and you keep the entrypoint script, then you need to use args: in your pod spec to provide the alternate command, not command:.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search