Dockerfile 不起作用 - 手动运行命令有效,但通过运行或入口点的相同命令不起作用

时间:2021-07-14 08:27:44

标签: bash docker docker-compose dockerfile visual-studio-2019

我的 Dockerfile 不会自动运行我的入口点。

Dockerfile:

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base

RUN apt update
RUN apt --yes --force-yes install libssl1.1
RUN apt --yes --force-yes install libpulse0
RUN apt --yes --force-yes install libasound2
RUN apt --yes --force-yes install libicu63
RUN apt --yes --force-yes install libpcre2-16-0
RUN apt --yes --force-yes install libdouble-conversion1
RUN apt --yes --force-yes install libglib2.0-0
RUN apt --yes --force-yes install telnet
RUN apt --yes --force-yes install pulseaudio
RUN apt --yes --force-yes install libasound2-dev

WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["SDKStandalone/SDKStandalone.csproj", "SDKStandalone/"]
RUN dotnet restore "SDKStandalone/SDKStandalone.csproj"
COPY . .
WORKDIR "/src/SDKStandalone"
RUN dotnet build "SDKStandalone.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "SDKStandalone.csproj" -c Release -o /app/publish

FROM base AS final

WORKDIR /app
COPY --from=publish /app/publish .

RUN chmod +x /app/SDKContainer/startup.sh
ENTRYPOINT ["/app/SDKContainer/startup.sh"]

如果我将最后一行更改为:

ENTRYPOINT ["/bin/bash", "/app/SDKContainer/mySDK"]

我的启动文件包含:

#!/bin/bash

/app/SDKContainer/mySDK &

有效的是,如果我从正在运行的容器中打开 bash,然后执行以下任一操作:

chmod +x /app/SDKContainer/startup.sh
/app/SDKContainer/startup.sh

或者干脆

/app/SDKContainer/mySDK

这两个都工作正常,但我需要我的 SDK 在容器启动时自动运行,我不想手动启动它。我不知道这是否重要,但为了完整起见 - 我正在 Visual Studio 2019 中进行调试,它们通过 Docker compose YML 运行,并且我选择了“不调试”。

Docker 组合

version: '3.4'

services:
  myproject.server:
    image: ${DOCKER_REGISTRY-}myserver
    build:
      context: .
      dockerfile: Server/Dockerfile
  sdkstandalone:
    image: ${DOCKER_REGISTRY-}sdkstandalone
    container_name: sdk1
    build:
      context: .
      dockerfile: SDKStandalone/Dockerfile
  sdkstandalone2:
    image: ${DOCKER_REGISTRY-}sdkstandalone
    container_name: sdk2
    build:
      context: .
      dockerfile: SDKStandalone/Dockerfile

launchSettings.json

{
  "profiles": {
    "Docker Compose": {
      "commandName": "DockerCompose",
      "serviceActions": {
        "sdkstandalone": "StartWithoutDebugging",
        "myproject.server": "StartDebugging",
        "sdkstandalone2": "StartWithoutDebugging"
      },
      "commandVersion": "1.0"
    }
  }
}

2 个答案:

答案 0 :(得分:3)

当入口点进程终止时容器退出。您已确保它立即终止。取出 & 改为在前台运行进程;这将使您的 Docker 映像保持活动状态,直到作业完成。这是一个非常常见的 Docker 常见问题。

除非您的父图片是专门以这种方式设计的,否则您应该使用 CMD,而不是 ENTRYPOINT

另外,apt 可以一次性安装多个软件包。 RUN 开头附近的一长串 Dockerfile 命令可以减少到只有两个命令,并且运行速度明显加快。

答案 1 :(得分:0)

问题出在 Visual Studio 调试本身中。当它在没有调试的情况下运行时它不起作用,但是在没有 Visual Studio 的情况下直接从我的命令行运行 docker-compose 工作得很好。我会标记这是正确的答案,因为它解决了我的问题,但赞成 @triplee 以获得良好的建议和最佳实践