【问题标题】:Docker compose throws error during build: Service 'postgres' failed to build: exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknownDocker compose 在构建过程中抛出错误:Service 'postgres' failed to build: exec: \"/bin/sh\": stat /bin/sh: no such file or directory": 未知
【发布时间】:2020-04-06 17:40:06
【问题描述】:

我拉了一个新的 cookiecutter django 模板,我想使用 docker。当我执行docker-compose -f local.yml build 时,我收到此错误:

服务“postgres”构建失败:OCI 运行时创建失败:container_linux.go:346:启动容器进程导致“exec:\”/bin/sh\“:stat /bin/sh:没有这样的文件或目录” : 未知

研究了这个问题,我发现它可能是图像损坏。因此,我删除了所有容器、图像并使用以下命令修剪了系统:

docker rm -vf $(docker ps -a -q)
docker rmi -f $(docker images -a -q)
docker system prune

然后我也做了:

docker-compose -f local.yml down
docker-compose -f local.yml up

我重启了 docker,重启了我的电脑....

当我列出所有容器和图像时,它们都消失了。然后我再次构建它,这让我感到困惑,因为我得到:

fc7181108d40: Already exists
81cfa12d39e9: Already exists
793d305ca761: Already exists
41e3ced3a2aa: Already exists
a300bc9d5405: Already exists
3c6a5c3830ed: Already exists
fb8c79b24338: Already exists
fcda1144379f: Already exists
476a22a819cc: Downloading [===============>                                   ]  25.23MB/82.14MB
78b36b49bb24: Download complete
6a096a28591f: Download complete
c0cb89b5217b: Download complete
778f1469a309: Download complete
7c4413fcad87: Download complete

所以还有一些东西存在吗?我认为某些内容没有被删除。然后一切都失败了:

ERROR: Service 'postgres' failed to build: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown

所以我猜我的 postgres 图像有问题......我只是不知道还能尝试什么。我有另一个项目可以与 docker 和 cookiecutter 完美配合。因此,我认为重新安装 docker 不会有帮助。

还有什么我可以尝试的想法吗?我不是 docker 专家,这几乎是我的故障排除知识的结束......非常感谢帮助,谢谢!

以下来自cookiecutter的自动创建:

编写文件:

version: '3'

volumes:
  local_postgres_data: {}
  local_postgres_data_backups: {}

services:
  django:
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: nginx_local_django
    depends_on:
      - postgres
    volumes:
      - .:/app
    env_file:
      - ./.envs/.local/.django
      - ./.envs/.local/.postgres
    ports:
      - "8000:8000"
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    image: nginx_production_postgres
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
      - local_postgres_data_backups:/backups
    env_file:
      - ./.envs/.local/.postgres

Dockerfile:

FROM python:3.7-alpine

ENV PYTHONUNBUFFERED 1

RUN apk update \
  # psycopg2 dependencies
  && apk add --virtual build-deps gcc python3-dev musl-dev \
  && apk add postgresql-dev \
  # Pillow dependencies
  && apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
  # CFFI dependencies
  && apk add libffi-dev py-cffi \
  # Translations dependencies
  && apk add gettext \
  # https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell
  && apk add postgresql-client

# Requirements are installed here to ensure they will be cached.
COPY ./requirements /requirements
RUN pip install -r /requirements/local.txt

COPY ./compose/production/django/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod +x /entrypoint

COPY ./compose/local/django/start /start
RUN sed -i 's/\r$//g' /start
RUN chmod +x /start

WORKDIR /app

ENTRYPOINT ["/entrypoint"]



我的 postgres dockerfile

FROM postgres:11.3

COPY ./compose/production/postgres/maintenance /usr/local/bin/maintenance
RUN chmod +x /usr/local/bin/maintenance/*
RUN mv /usr/local/bin/maintenance/* /usr/local/bin \
    && rmdir /usr/local/bin/maintenance


【问题讨论】:

  • 请分享您的Dockerfiledocker-compose.yml
  • 当然。更新了。

标签: django docker docker-compose cookiecutter-django


【解决方案1】:

如果您使用其他一些 linux 发行版,请尝试将此添加到您的 postgres Dockerfile 更改 apk

RUN apk add --no-cache dos2unix
RUN dos2unix YOUR_SCRIPT_NAME
RUN chmod +x YOUR_SCRIPT_NAME

并确保第一行是#!/bin/sh

【讨论】:

  • 感谢 LinPy!介意解释我在做什么?我在 Mac 而不是 linux 上,为什么要添加 shell 脚本命令?你的意思是什么脚本名称。我很困惑,因为这是一个应该开箱即用的 cookiecutter 模板。所以我认为错误更多在于我的 docker/images 而不是 dockerfiles 本身?
  • 我没有看到你的 postgres dockerfile,但是如果你有任何 shell 脚本,你需要对它运行 dos2unix
  • 所以/usr/local/bin/maintenance/*中的脚本有问题
  • 你是对的....它不存在....里面通常有什么,我可以创建它吗?或者这个目录可能是在 COPY 命令期间创建的......
  • 你从那里应对什么?之后将所有内容移至 /usr/local/bin ,然后删除文件夹 /usr/local/bin/maintenance/
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多