【问题标题】:Entrypoint #FAIL - no such file or directory入口点#FAIL - 没有这样的文件或目录
【发布时间】: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


【解决方案1】:

利用此处列出的布局 - https://github.com/testdrivenio/django-on-docker 它有效。我所做的不同之处在于我在根目录下创建了一个新的 docker 目录,然后让 docker compose 利用它。一切似乎都按预期复制到容器中,但由于某种原因,EntryPoint 不起作用。除了更新对新文件位置的引用之外,无需更改任何代码,一切正常。以下是所做的更改:

web:
    build: 
      context: .
      dockerfile: ./docker/Dockerfile

web:
    build: ./app

然后改变目录结构

Project Layout:
├───.vscode
├───docker
│   └───Dockerfile
│   └───entrypoint.sh
│   └───Pipfile
│   └───nginx
└───main
    ├───migrations
    ├───static
    │   └───images
    ├───templates
├───Artwork
├───django-env
│   ├───Include
│   ├───Lib
│   └───Scripts
└───docker-compose.yml
└───managy.py

Project Layout:
├───.vscode
├───app
│   └───main
│       ├───migrations
│       ├───static
│       │   └───images
│       ├───templates
│   └───Dockerfile
│   └───entrypoint.sh
│   └───managy.py
│   └───Pipfile
├───Artwork
├───django-env
│   ├───Include
│   ├───Lib
│   └───Scripts
└───nginx
└───docker-compose.yml

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2019-09-19
    • 2021-06-24
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多