我正在尝试为已有的django项目添加docker支持。我有一个Dockerfile
,一个docker-compose
和一个gunicorn.sh
我用作脚本来启动整个事情。当我从shell运行它时,该脚本工作正常。
当我跑步时:
docker-compose -f docker-compose.yml up
我收到此错误:
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"
我到底做错了什么?
我非常支持n00b,所以任何解释都是最受欢迎的。
Dockerfile
看起来像这样:
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
我很清楚不应该在这里设置密码,并且包含它们的文件的永久卷可能是处理它的最佳方法。但是,我有点想要一些工作,而不是花费数小时摆弄东西而不能看到任何运行......
docker-compose.yml
看起来像:
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
最后,gunicorn.sh
文件是:
#!/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}
让事情变得陌生:
; 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…
所以从容器运行脚本似乎工作得很好......
答案 0 :(得分:2)
我认为你应该:
ADD . /srv/
代替COPY ./intranet_site/ /srv
因为ADD . /srv/
将所有目录的内容添加到容器Dockerfile
的内容<{1}} 。因此{/ 1}} / srv
命令应该在 包含COPY
的文件夹中使用。我认为您的ADD
位于项目的根目录中(与Dockerfile
和Dockerfile
一起)。
您也可以使用具有相同效果的docker-compose.yml
。
答案 1 :(得分:0)
怀疑路径不应该有前导.
:
command: /srv/gunicorn.sh