【问题标题】:Docker compose & docker-entrypointDocker 撰写和 docker-entrypoint
【发布时间】:2020-12-02 02:42:41
【问题描述】:

在运行 docker-compose up --build 时,我总是遇到此错误消息。有人知道我对 docker-entrypoint 文件做错了什么吗?

ERROR: for 986991ccdfe1_ubercoach_web_1  Cannot start service web: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./docker-entrypoint.sh\": permission denied": unknown

ERROR: for web  Cannot start service web: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./docker-entrypoint.sh\": permission denied": unknown
ERROR: Encountered errors while bringing up the project.

码头工人撰写:

version: '3'

services:
  db:
    image: postgres
    ports:
      - "5432:5432"
  web:
    build: .
    entrypoint: ./docker-entrypoint.sh
    env_file: .env
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

Dockerfile:

# 拉取基础镜像 FROM python:3

# Set environment varibles
ENV PYTHONUNBUFFERED 1

# Set work directory
RUN mkdir /code
WORKDIR /code

# Install dependencies
RUN pip install --upgrade pip
RUN pip install pipenv
COPY ./Pipfile /code/Pipfile
RUN pipenv install --deploy --system --skip-lock --dev

# Copy project
COPY . /code/

docker-entrypoint.sh

#!/bin/bash

# Collect static files
echo "Collect static files"
python manage.py collectstatic --noinput

# Apply database migrations
echo "Apply database migrations"
python manage.py migrate

# Start server
echo "Starting server"
python manage.py runserver 0.0.0.0:8000

【问题讨论】:

  • 脚本bin/docker-entrypoint.sh有执行权限吗?
  • 不确定是否诚实。我怎样才能找到它?
  • 尝试命令“ls -lt docker-entrypoint.sh”。这将显示权限。
  • 上面写着-rw-r--r--@ 1 Marc staff 270 Oct 22 23:59 docker-entrypoint.sh
  • hjsimpson 回答正确。

标签: docker docker-compose


【解决方案1】:

\"./docker-entrypoint.sh\": 权限被拒绝": 未知

我猜你的 docker-entrypoint.sh 没有执行权限 (x)。但是docker-compose.yml 也不是docker-entrypoint.sh 的最佳位置。这是覆盖设置,请参阅entrypoint。默认值应该放在Dockerfile 中。试试这个:

将此添加到 Dockerfile 的末尾

COPY ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]

docker-entrypoint.sh 应与Dockerfile 位于同一文件夹中(或调整COPY 路径)。从docker-compose.yml 中删除entrypoint 行。重建,重新运行。

【讨论】:

  • 完美,现在可以使用了!谢谢你hjsimpson。最后一个问题。你写了COPY ./docker-entrypoint.sh /docker-entrypoint.sh。但是我在上面写了COPY ./Pipfile /code/Pipfile。我也可以写COPY ./Pipfile /Pipfile吗?
  • 这取决于您希望 Pipfile 在容器内的哪个位置。 COPY source_path target_path 源路径在您的主机上,相对于 Dockerfile,target_path 是您容器中的绝对路径,另请参见:docs.docker.com/engine/reference/builder/#copy
【解决方案2】:

我在这个问题上花了很多时间。问题在于 web 服务上的 volume。我遇到了问题,因为我是 docker-machine 来部署我的应用程序。 Docker 正在使用它在远程机器中找不到的卷。运行以下命令擦除容器和卷,这是解决问题的简单方法。

docker-compose down -v

注意:请谨慎使用上述命令。因为,它会删除所有卷,因此您拥有的所有数据。

我使用的解决方案包括 docker a different docker-file,而不是向 Web 服务添加音量。

【讨论】:

  • 删除卷对我有用,很棒。
【解决方案3】:

您可以在入口点添加“bash”:

ENTRYPOINT ["bash","docker-entrypoint.sh"]

【讨论】:

    【解决方案4】:

    你应该像这样复制入口点:

    码头工人撰写:

    version: '3'
    
    services:
      db:
        image: postgres
        ports:
          - "5432:5432"
      web:
        build: .
        entrypoint: /docker-entrypoint.sh
        env_file: .env
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
    

    Dockerfile:

    # Pull base image FROM python:3
    
    # Set environment varibles
    ENV PYTHONUNBUFFERED 1
    
    # Set work directory
    RUN mkdir /code
    WORKDIR /code
    
    # Install dependencies
    COPY ./docker-entrypoint.sh /docker-entrypoint.sh
    RUN chmod +x /docker-entrypoint.sh
    
    RUN pip install --upgrade pip
    RUN pip install pipenv
    COPY ./Pipfile /code/Pipfile
    RUN pipenv install --deploy --system --skip-lock --dev
    
    # Copy project
    COPY . /code/
    

    【讨论】:

    • docker-entrypoint 在每个目录中都不起作用。你应该复制到这个目录:/docker-entrypoint.sh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2019-03-25
    相关资源
    最近更新 更多