【问题标题】:Dockerfile not working - running command manually works, but same command through run or entrypoint doesn't workDockerfile 不工作 - 手动运行命令可以工作,但通过运行或入口点的相同命令不起作用
【发布时间】:2021-09-23 05:25:40
【问题描述】:

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

【问题讨论】:

  • 使用Dockefile时出现什么错误
  • 没有错误,容器启动但SDK没有启动

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您对合并安装的建议。我删除了 & 符号,但使用 startup.sh 脚本仍然无法正常工作。我还尝试用CMD ["/app/SDKContainer/mySDK"] 结束dockerfile,但这也不起作用。我这里还有什么遗漏的吗?
  • 如果不了解 SDK 的功能以及您将如何判断它何时工作,我不能说。通常“SDK”意味着一堆组件,您可以添加一些自己的代码来执行它提供的某些特定功能。也许您可以澄清这些部分?
  • 当然——在我的应用程序中,我有一个按钮,用于启动与 SDK 的 TCP 连接。当 SDK 运行时,我得到成功,当它没有运行时,我得到连接被拒绝。通过在运行 SDK 的容器的 bash 中键入 /app/SDKContainer/mySDK,我获得了成功。通过尝试通过 Dockerfile 中的 bash 启动它,或者通过 .sh 文件间接通过 Dockerfile 启动它,我得到“连接被拒绝”,表明它没有运行。随后手动启动它确实有效
  • 我赞成您的回答,但实际问题是由于 VS2019。非常感谢你
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    Commando 回到以前的版本:docker-compose disable-v2

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多