Adding docker to django project: no such file or directory

I am trying to add docker support to an already existing django project. I have a Dockerfile, a docker-compose, and a gunicorn.sh which I use as a script to launch the whole things. That script works fine when I run it from my shell.

When I run:

docker-compose -f docker-compose.yml up

I get this error:

ERROR: for intranet_django_1  Cannot start service django: oci runtime error: container_linux.go:247: starting container process caused "exec: \"/srv/gunicorn.sh\": stat /srv/gunicorn.sh: no such file or directory"   

What the hell am I doing wrong?

I am very much a docker n00b so any explanation would be most welcome.


The Dockerfile looks like so:

FROM python:3
ENV PYTHONUNBUFFERED 1
ENV DB_NAME unstable_intranet_django
ENV DB_USER django
ENV DB_PASSWORD ookookEEK
ENV DB_HOST db
ENV DB_PORT 3306
RUN groupadd -r django
RUN useradd -r -g django django
COPY ./requirements/requierments.txt /srv/
RUN pip install -U pip
RUN pip install -r /srv/requierments.txt
COPY ./intranet_site/ /srv
RUN chmod a+rx /srv/gunicorn.sh
RUN chown -R django:django /srv/
USER django
WORKDIR /srv

I am well aware that the passwords should not be set here and that a permanent volume with a file containing them is probably the best way to deal with it. However, I kinda want something working instead of spending hours fiddling with things and not being able to see anything run…

The docker-compose.yml looks like:

version: '3'

services:
  db:
    image: mariadb
    environment:
      - MYSQL_ROOT_PASSWORD=fubar
      - MYSQL_USER=django
      - MYSQL_PASSWORD=ookookEEK
      - MYSQL_DATABASE=unstable_intranet_django
  django:
    build: .
    command: /srv/gunicorn.sh
    volumes:
      - .:/srv
    ports:
      - "8000:8000"
    depends_on:
      - db

Finally, the gunicorn.sh file is:

#!/bin/bash
# -*- coding: utf-8 -*-
# Check if the database is alive or not.
python << END
from MySQLdb import Error
from MySQLdb import connect
from sys import exit
from time import sleep

retry=0
while True:
    try:
        conn = connect(db="$DB_NAME",
                       user="$DB_USER",
                       password="$DB_PASSWORD",
                       host="$DB_HOST",
                       port=$DB_PORT)
        print("✔ DB $DB_NAME on $DB_HOST:$DB_PORT is up.")
        break
    except Error as err:
        snooze = retry / 10.0
        print("✖ DB $DB_NAME on $DB_HOST:$DB_PORT is unavailable "
              "→ sleeping for {}…".format(snooze))
        sleep(snooze)
        retry += 1
exit(0)
END

# Set up log file.
log="./gunicorn.log"
date > ${log}

# Collectstatic
echo "Collecting static files." | tee -a ${log}
python manage.py collectstatic -v 3 --noinput >> ${log}

# Migrate database
echo "Doing database migration." | tee -a ${log}
python manage.py migrate -v 3 >> ${log}

# New shiny modern hip way:
echo "Running Gunicorn on ${HOSTNAME} …" | tee -a ${log}
gunicorn -b ${HOSTNAME}:8000 -w 2 intranet_site.wsgi | tee -a ${log}

To make things stranger:

; docker run -it intranet_web /bin/bash                                                                               
django@ce7f641cc1c7:/srv$ ls -l gunicorn.sh                                     
-rwxrwxr-x. 1 django django 1677 Jun  2 07:51 gunicorn.sh                       
django@ce7f641cc1c7:/srv$ ./gunicorn.sh                                         
✖ DB unstable_intranet_django on 127.0.0.1:3306 is unavailable → sleeping for 0.0…                                                                              

So running the script from the containers seems to work just fine…

Upvotes: 0

Views: 1934

Answers (2)

doru
doru

Reputation: 9110

I think you should have:

ADD . /srv/ instead of COPY ./intranet_site/ /srv

because ADD . /srv/ adds all the content of the directory in which you have the Dockerfile to the srv folder from container. So the COPY/ADD command should be used in the folder that contains the Dockerfile. And I suppose your Dockerfile is in this root directory of the project (alongside docker-compose.yml and gunicorn.sh).

You could also use COPY . /srv/ with the same effect.

Upvotes: 2

Daniel Roseman
Daniel Roseman

Reputation: 599956

Suspect the path shouldn't have a leading .:

command: /srv/gunicorn.sh

Upvotes: 0

Related Questions