dockerfile 中的启动脚本永远不会运行

问题描述

我有一个 docker 容器,它依赖于在成功运行之前创建和填充的数据库。我试图通过在容器的主要入口点之前运行等待脚本来适应这一点,问题是,该脚本似乎从未运行过。我不会复制整个错误,因为它很大,但要点是我的脚本中有一个 echo 语句,我在输出中找不到。

我的 Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS dev
workdir /app

RUN mkdir -p startup
copY ./waitForIt.sh /startup/
copY ./appEntryPoint.sh /startup/
RUN chmod +x /startup/appEntryPoint.sh

copY App.WebUI/App.WebUI.csproj ./
RUN dotnet restore

copY . ./
RUN dotnet publish App.sln -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
workdir /app
EXPOSE 80
copY --from=dev /app/out .
ENTRYPOINT ["/startup/appEntryPoint.sh"]
CMD ["dotnet","App.WebUI.dll"]

和我的 docker-compose:

services:
  web:
    container_name: web_container
    depends_on:
      - "postgres"
    build:
      context: .
      dockerfile: Dockerfile.dedc
    ports:
      - "5000:80"
    networks:
      - de_network

  postgres:
    container_name: postgres_container
    image: postgres:latest
    build:
      context: .
      dockerfile: Dockerfile.pgdc
    environment:
      POSTGRES_PASSWORD: xxxxxxxx
      POSTGRES_USER: xxxxxxxx
      POSTGRES_DB: xxxxxxxx
    ports:
      - "5432:5432"
    networks:
      - de_network

networks:
  de_network:
    driver: bridge

和 appEntryPoint.sh:

#!/bin/sh

echo "startup script is running"

chmod +x ./waitForIt.sh

./waitForIt.sh http://localhost:5432

exec "$@"

我没有包含 wait-for-it.sh 脚本,因为如果从未到达 echo 命令,错误必须在该点之前发生。我一定是设置不正确,感谢任何帮助。

解决方法

为什么不修改 appEntryPoint.sh 为:

#!/bin/sh

echo "startup script is running"

chmod +x ./waitForIt.sh

./waitForIt.sh http://localhost:5432

dotnet App.WebUI.dll

这将使脚本在运行时运行,而不是在构建时运行。

脚本还将负责启动应用程序,因此您只有一个入口点。

您还可以将 Dockerfile 更改为:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS dev
WORKDIR /app

RUN mkdir -p startup
COPY ./waitForIt.sh /startup/
COPY ./appEntryPoint.sh /startup/
RUN chmod +x /startup/appEntryPoint.sh

COPY App.WebUI/App.WebUI.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish App.sln -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
EXPOSE 80
COPY --from=dev /app/out .
ENTRYPOINT ["/startup/appEntryPoint.sh"]