Docker撰写和docker-entrypoint

Joe*_*der 4 docker docker-compose

在运行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.
Run Code Online (Sandbox Code Playgroud)

码头工人组成:

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
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

#从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/
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Emr*_*mre 7

解决方案对我来说有点不同。首先,我需要为 docker-compose 提供入口点文件的引用。我的 dockerfile、docker-compose 和入口点文件都位于名为 docker 的目录中,因此

services:
  app:
    build:
      context: ..
      dockerfile: docker/Dockerfile.development
    entrypoint: docker/development-entrypoint.sh
    ports:
      - 3000:3000
    env_file:
      - ../.env.development
    depends_on:
      - postgres
Run Code Online (Sandbox Code Playgroud)

我还需要更改入口点的执行权,我在 dockerfile 中这样做了,如下所示。

RUN chmod 755 docker/entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

最烦人的部分是 .sh 文件。通常,在许多不同的 Linux 系统中,您将像这样启动 .sh 文件

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

基本上,在一个 Linux 系统中,您使用不同的 shell。在 .sh 文件中,为了定义要使用哪个 shell,请按所示启动该文件。但对我来说它不起作用,因为我使用的是节点 alpine 图像,当我检查时,根本没有 bash,所以我不得不将其更改为此。

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助您或任何遇到此问题的人!


hjs*_*son 6

\“。/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"]
Run Code Online (Sandbox Code Playgroud)

docker-entrypoint.sh应在相同的文件夹Dockerfile(或调整COPY路径)。entrypoint从您的上删除该行docker-compose.yml。重建,重新运行。

  • 这取决于您希望“Pipfile”位于容器内的哪个位置。它是 `COPY source_path target_path` 源路径位于您的主机上,相对于 Dockerfile,target_path 是容器中的绝对路径,另请参阅:https://docs.docker.com/engine/reference/builder/#copy (2认同)

MrM*_*313 6

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

docker-撰写:

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
Run Code Online (Sandbox Code Playgroud)

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/
Run Code Online (Sandbox Code Playgroud)

  • docker-entrypoint 不适用于每个目录。你应该复制到这个目录:/docker-entrypoint.sh (2认同)