码头工人:./ entrypoint.sh找不到

时间:2020-05-11 09:39:47

标签: docker django-rest-framework

我正在尝试设置一个django项目并将其泊坞窗化。 我在运行容器时遇到问题。 据我所知,它已经成功构建,但是无法运行。

这是我得到的错误:

错误:针对Web无法启动服务Web:OCI运行时创建失败:container_linux.go:349:启动容器进程导致“ exec:\”。/entrpoint.sh \”:stat ./entrpoint.sh:无此类文件或目录”:未知 错误:启动项目时遇到错误。

这是dockerfile:

FROM python:3.6

RUN mkdir /backend
WORKDIR /backend
ADD . /backend/

RUN pip install -r requirements.txt

RUN apt-get update \
    && apt-get install -yyq netcat

RUN chmod 755 entrypoint.sh

ENTRYPOINT ["./entrpoint.sh"]

这是撰写文件:

version: '3.7'

services:
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=django
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=database

  web:
    restart: on-failure
    build: .
    container_name:backend
    volumes:
      - .:/backend
    env_file:
      - ./api/.env
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
    hostname: web
    depends_on:
      - db

volumes:
  postgres_data:

还有一个运行自动迁移的入口点文件,如果有的话: 这是脚本:

#!/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

python manage.py migrate

exec "$@"

我要去哪里错了?

1 个答案:

答案 0 :(得分:3)

问题是您不是不是entrypoint.sh而是nc命令。

要解决此问题,您必须安装netcat软件包。

由于python:3.6是基于debian buster的,因此您可以在FROM指令之后简单地添加以下命令:

RUN apt-get update \
    && apt-get install -yyq netcat

编辑以进行进一步的改进:

  • 仅复制requirements.txt,安装软件包,然后复制其余的软件包。这样可以提高缓存的使用率,并且每个构建(在第一个构建之后)都将更快(除非您触摸requirements.txt)
  • ADD替换为COPY,除非您爆炸了压缩包

结果应如下所示:

FROM python:3.6

RUN apt-get update \
    && apt-get install -yyq netcat

RUN mkdir /backend
WORKDIR /backend
COPY requirements.txt /backend/

RUN pip install -r requirements.txt

COPY . /backend/

ENTRYPOINT ["./entrypoint.sh"]