【发布时间】:2019-11-23 03:59:10
【问题描述】:
在设置 django 环境时,正在研究如何将环境容器化。这样做时,我无法获得在 Docker for Windows/Linux 上工作的入口点。
Successfully built e9cb8e009d91
Successfully tagged avengervision_web:latest
avengervision_db_1 is up-to-date
Starting avengervision_web_1 ... done
CONTAINER ID IMAGE COMMAND CREATED
1da83169ba41 avengervision_web "sh /usr/src/app/ent…" 44 minutes
STATUS PORTS NAMES
Exited (2) 20 seconds ago avengervision_web_1
docker logs 1da83169ba41
sh: can't open '/usr/src/app/entrypoint.sh': No such file or directory
已简化 entrypoint.sh 以使其执行。
试过了
ENTRYPOINT ["sh","/usr/src/app/entrypoint.sh"] &
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
确保以 git 和 vscode 结尾的行设置为 LF 并通过 dos2unix 运行代码
在 Windows 和 Linux 上运行相同的 Docker Compose 并在两者上获得相同的异常
添加到 Dockerfile 作为额外预防措施以删除所有行尾并确保 chmod +x 脚本
注释掉 EntryPoint 并运行 docker run -tdi,我能够在容器内 docker attach 并执行脚本,没有任何问题。
*****docker-compose.yml*****
version: '3.7'
services:
web:
build:
context: .
dockerfile: ./docker/Dockerfile
#command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./main/:/usr/src/app/
ports:
- 8000:8000
environment:
- DEBUG=1
- SECRET_KEY=foo
- SQL_ENGINE=django.db.backends.postgresql
- SQL_DATABASE=hello_django_dev
- SQL_USER=hello_django
- SQL_PASSWORD=hello_django
- SQL_HOST=db
- SQL_PORT=5432
- DATABASE=postgres
depends_on:
- db
db:
image: postgres:11.2-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=hello_django
- POSTGRES_PASSWORD=hello_django
- POSTGRES_DB=hello_django_dev
volumes:
postgres_data:
*****Dockerfile*****
# pull official base image
FROM python:3.7-alpine
# set work directory
WORKDIR /usr/src/app
# set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install psycopg2
RUN apk update \
&& apk add --virtual build-deps gcc python3-dev musl-dev \
&& apk add postgresql-dev \
&& pip install psycopg2 \
&& apk del build-deps
# install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
COPY ./docker/Pipfile /usr/src/app/Pipfile
RUN pipenv install --skip-lock --system --dev
# copy entrypoint.sh
COPY ./docker/entrypoint.sh /usr/src/app/entrypoint.sh
#RUN chmod +x /usr/src/app/entrypoint.sh
# copy project
COPY main /usr/src/app/main
COPY manage.py /usr/src/app
#RUN /usr/src/app/entrypoint.sh
RUN sed -i 's/\r$//' /usr/src/app/entrypoint.sh && \
chmod +x /usr/src/app/entrypoint.sh
# run entrypoint.sh
ENTRYPOINT ["sh","/usr/src/app/entrypoint.sh"]
*****entrypoint.sh*****
#!/bin/sh
if [ "$DATABASE" = "postgres" ]
then
echo "Waiting for postgres..."
while ! nc -z $SQL_HOST $SQL_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
echo "Testing"
#python /usr/src/app/manage.py flush
#python /usr/src/app/manage.py migrate
#python /usr/src/app/manage.py collectstatic --no-input --clear
exec "$@"
最终的目标是容器将随着创建的 django 应用程序启动并运行。
【问题讨论】:
-
您是否创建了目录
/usr/src/app?我看到 WORKDIR 命令。但是,我认为您需要类似RUN mkdir -p /usr/src/app -
感谢您的回复!!!您的问题引发了编辑,在注释掉上面的 ENTRYPOINT 并且目录已经存在并且能够从容器内执行脚本而没有任何问题后,我能够将附加到图像。抱歉,我之前没有澄清这一点。
-
FROM python:3.7-alpine RUN mkdir -p /usr/src/app/ COPY ./entrypoint.sh /usr/src/app/entrypoint.sh RUN chmod +x /usr/src/app/entrypoint.sh RUN /usr/src/app/entrypoint.sh RUN sed -i 's/\r$//' /usr/src/app/entrypoint.sh && \ chmod +x /usr/src/app/entrypoint.sh # run entrypoint.sh ENTRYPOINT ["sh","/usr/src/app/entrypoint.sh"] -
太好了,现在一切正常了吗?还是在那之后你得到了错误?我很高兴。
-
没有没有修复它的@ScottSkiles,只是用更多信息更新了我的帖子,该目录确实存在并且在容器中运行脚本有效,只是不使用 ENTRYPOINT,它仍然失败。跨度>
标签: docker docker-compose dockerfile