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
希望对遇到类似问题的人有所帮助。
我的 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
希望对遇到类似问题的人有所帮助。