Dockerfile 不工作 - 运行ning 命令手动工作,但通过 运行 或入口点的相同命令不工作

Dockerfile not working - running command manually works, but same command through run or entrypoint doesn't work

我的 Docker 文件不会自动 运行 我的入口点。

Docker文件:

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 &

如果我从 运行ning 容器中打开 bash,然后执行以下任一操作,那么会起作用:

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

或者干脆

/app/SDKContainer/mySDK

两者都工作正常,但我需要我的 SDK 在容器启动时自动 运行,我不想手动启动它。我不知道这是否重要,但为了完整性 - 我在 Visual Studio 2019 年进行调试,他们正在 运行 通过 Docker 撰写 YML,我选择了 'do not debug'.

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"
    }
  }
}

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

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

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

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

这个问题让我很苦恼。经过几个小时寻找解决方案后,我找到了这个论坛 Debugging docker compose. VS can't attach to containers

就我而言,我更新了我的 VS,Docker Compose v2 存在这个问题。他们很快就会发布修复程序。

现在,禁用版本 2,重新启动 Docker 和 VS。它对我有用。

检查当前版本的命令:docker-compose --version

返回上一版本的命令:docker-compose disable-v2

希望对遇到类似问题的人有所帮助。