我的 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"
}
}
}
答案 0 :(得分:3)
当入口点进程终止时容器退出。您已确保它立即终止。取出 &
改为在前台运行进程;这将使您的 Docker 映像保持活动状态,直到作业完成。这是一个非常常见的 Docker 常见问题。
除非您的父图片是专门以这种方式设计的,否则您应该使用 CMD
,而不是 ENTRYPOINT
。
另外,apt
可以一次性安装多个软件包。 RUN
开头附近的一长串 Dockerfile
命令可以减少到只有两个命令,并且运行速度明显加快。
答案 1 :(得分:0)
问题出在 Visual Studio 调试本身中。当它在没有调试的情况下运行时它不起作用,但是在没有 Visual Studio 的情况下直接从我的命令行运行 docker-compose 工作得很好。我会标记这是正确的答案,因为它解决了我的问题,但赞成 @triplee 以获得良好的建议和最佳实践