【问题标题】:Docker: ./entrypoint.sh not foundDocker:./entrypoint.sh 未找到
【发布时间】:2020-05-12 18:38:02
【问题描述】:

我正在尝试设置一个 django 项目并将其 dockerize。 我在运行容器时遇到问题。 据我所知,abe构建成功,但运行失败。

这是我得到的错误:

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

这是码头文件:

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 "$@"

我哪里错了?

【问题讨论】:

  • 在 Dockerfile 的最后一行,entrpoint.sh 中间少了一个y

标签: docker django-rest-framework


【解决方案1】:

问题在于你不是缺少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"]

【讨论】:

  • 如果我没记错的话,它似乎需要 netcat 来与数据库通信?
  • 那么您需要 netcat 来测试数据库是否已启动:while ! nc -z $SQL_HOST $SQL_PORT; do。顺便说一句,我添加了其他建议
  • 我在构建它时遇到了这个错误:错误:对于 web 无法启动服务 web:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“exec:\”./entrpoint。 sh\": stat ./entrpoint.sh: 没有这样的文件或目录": 未知
  • 在问题中添加新信息,我看看能不能回答。尽量提供尽可能多的信息
  • 尝试执行以下命令:docker build -t mytest .,然后在构建完成后:docker run --rm -it mytest:latest bash。检查位置以及文件是否存在:pwdls -alh
猜你喜欢
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2020-05-22
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多