无法启动服务Web:OCI运行时创建失败。无此文件或目录

时间:2019-12-28 20:05:34

标签: docker docker-compose

我有以下 Dockerfile 内容

FROM python:3.7-slim

# Install packages needed to run your application (not build deps):

RUN mkdir /code/
WORKDIR /code/
COPY Pipfile Pipfile.lock /code/

# Install build deps, then run `pip install`, then remove unneeded build deps all in a single step.

COPY ./src scripts /code/

EXPOSE 8000

ENTRYPOINT ["/code/entrypoint.sh"]

删除了与该问题无关的其他行。

我正在开发的目录结构是

\
|- scripts
    |- entrypoint.sh
|- src
    |- # Application files
|- Dockerfile
|- docker-compose.yml

entrypoint.sh文件位于scripts/目录中,并正在docker守护程序中复制到/code/。通过执行验证相同

docker run -it my_image ls -la 

列出文件为

drwxr-xr-x 1 root root  4096 Dec 28 19:57 .
drwxr-xr-x 1 root root  4096 Dec 28 19:59 ..
-rw-r--r-- 1 root root   545 Dec 28 19:24 Pipfile
-rw-r--r-- 1 root root 21517 Dec 28 19:24 Pipfile.lock
-rwxr-xr-x 1 root root   499 Dec 28 18:47 entrypoint.sh
-rwxr-xr-x 1 root root   540 Jan  3  2019 manage.py

但是当我使用带有内容的 docker-compose.yml docker-compose up)文件

运行图像时
version: '3.7'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    image: my_image:latest
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
    - .:/code/

它给出错误为

ERROR: for myproj_py_web_1  Cannot start service web: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/code/entrypoint.sh\": stat /code/entrypoint.sh: no such file or directory": unknown

entrypoint.sh

的内容
#!/bin/sh
set -e

if [ "x$DJANGO_MANAGE_COLLECTSTATIC" = 'xon' ]; then
  echo "Collecting static files"
  python manage.py collectstatic --noinput
  echo "Done: Collecting static files"
fi

if [ "x$DJANGO_MANAGE_MIGRATE" = 'xon' ]; then
  echo "Migrating database"
  python manage.py migrate --noinput
  echo "Done: Migrating database"
fi

exec "$@"

1 个答案:

答案 0 :(得分:1)

您的volumes:声明将/code的内容隐藏在图像中,包括/code/entrypoint.sh脚本。当您启动一个容器时,Docker将从入口点和命令两个部分组成一个单独的命令,因此您的两个容器具有组合的命令,例如

/code/entrypoint.sh ls -la
/code/entrypoint.sh python manage.py runserver 0.0.0.0:8000

(Entrypoint脚本通常以exec "$@"之类的行结束,该行启动命令部分以简化此模式。)

特别是您有此问题,因为文件系统布局不匹配。您需要重新排列Dockerfile中的内容。如果你要跑步

docker run --rm -it --entrypoint /bin/bash -v $PWD:/code image

您会看到/code/scripts/entrypoint.sh;如果您在没有-v选项的情况下运行它,则会看到/code/entrypoint.sh

对此的直接解决方案是删除volumes:指令。然后Docker Compose将运行映像中实际构建的代码,您将不会遇到这种冲突。