docker - Docker-ASP.CORE 2.2应用程序和SSH

标签 docker asp.net-core ssh dockerfile sshd

我正在尝试配置Docker容器,以便可以ssh进入它(该容器将在Azure上运行)。我设法创建了一个镜像,该镜像使用户可以ssh到从该镜像创建的容器中,Dockerfile看起来像这样(不是我的,我在互联网上找到了它):

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
EXPOSE 2222
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
COPY sshd_config /etc/ssh
RUN echo 'root:Docker' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

CMD ["/usr/sbin/sshd", "-D"]

我正在使用mcr.microsoft.com/dotnet/core/sdk:2.2-stretch,因为这是以后运行该应用程序所需要的。

有了上面的Dockerfile,我运行docker build . -t ssh。我可以确认可以通过以下说明将ssh放入从ssh图像创建的容器中:
docker run -d -p 0.0.0.0:2222:22 --name ssh ssh
ssh root@localhost -p 2222

我的应用程序的Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["Application.WebAPI/Application.WebAPI.csproj", "Application.WebAPI/"]
COPY ["Processing.Dependency/Processing.Dependency.csproj", "Processing.Dependency/"]
COPY ["Processing.QueryHandling/Processing.QueryHandling.csproj", "Processing.QueryHandling/"]
COPY ["Model.ViewModels/Model.ViewModels.csproj", "Model.ViewModels/"]
COPY ["Core.Infrastructure/Core.Infrastructure.csproj", "Core.Infrastructure/"]
COPY ["Model.Values/Model.Values.csproj", "Model.Values/"]
COPY ["Sql.Business/Sql.Business.csproj", "Sql.Business/"]
COPY ["Model.Events/Model.Events.csproj", "Model.Events/"]
COPY ["Model.Messages/Model.Messages.csproj", "Model.Messages/"]
COPY ["Model.Commands/Model.Commands.csproj", "Model.Commands/"]
COPY ["Sql.Common/Sql.Common.csproj", "Sql.Common/"]
COPY ["Model.Business/Model.Business.csproj", "Model.Business/"]
COPY ["Processing.MessageBus/Processing.MessageBus.csproj", "Processing.MessageBus/"]
COPY [".Processing.CommandHandling/Processing.CommandHandling.csproj", "Processing.CommandHandling/"]
COPY ["Processing.EventHandling/Processing.EventHandling.csproj", "Processing.EventHandling/"]
COPY ["Sql.System/Sql.System.csproj", "Sql.System/"]
COPY ["Application.Common/Application.Common.csproj", "Application.Common/"]
RUN dotnet restore "Application.WebAPI/Application.WebAPI.csproj"
COPY . .
WORKDIR "/src/Application.WebAPI"
RUN dotnet build "Application.WebAPI.csproj" -c Release -o /app

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

FROM ssh AS final
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Application.WebApi.dll"]

如您所见,在最后阶段,我将ssh图像用作基础图像。即使我能够将其引导到由ssh镜像创建的容器中,也无法将其引导至由后者的Dockerfile创建的容器中。这是我正在使用的docker-compose.yml,以便于启动容器:
version: '3.7'

services:
  application.webapi:
    image: application.webapi
    container_name: webapi
    ports:
      - "0.0.0.0:5000:80"
      - "0.0.0.0:2222:22"
    build:
      context: .
      dockerfile: Application.WebAPI/Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=docker

当我运行docker exec -it webapi bash并执行service ssh status时,我会得到[FAIL] sshd is not running ... failed!-但是当我执行service ssh start并尝试将其放入该容器时,它可以工作。不幸的是,这种方法是 Not Acceptable ,ssh守护程序应该在启动时启动。

我尝试使用debian上提供的cron和其他功能,但它是一个 slim 的版本,而systemd在那里不可用-我也不喜欢在 slim 的版本上安装数百个东西。

您有什么想法在这里可能出什么问题吗?

最佳答案

您的最终镜像中的启动命令定义有冲突。请注意,CMD不仅在图像中运行命令,它还定义了启动命令,并且与ENTRYPOINT有复杂的交互作用(简而言之:如果两者都存在,CMD只会为ENTRYPOINT提供额外的参数)。

您可以在Dockerfile文档中查看可能性表:https://docs.docker.com/engine/reference/builder/。另外,当在不同的层中混合并匹配CMDENTRYPOINT时,会带来额外的复杂性:

Note: If CMD is defined from the base image, setting ENTRYPOINT will reset CMD to an empty value. In this scenario, CMD must be defined in the current image to have a value.



据我所知,仅通过分层图像就无法获得想要的东西。您将需要在最终镜像中创建一个启动脚本,该脚本同时运行sshd -D然后运行dotnet Application.WebApi.dll

关于docker - Docker-ASP.CORE 2.2应用程序和SSH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58392649/

相关文章:

spring-boot - 将Spring Boot应用程序连接到Docker容器中的Oracle数据库12.2.0.1

docker - 如何获取由本地文件系统上的Docker容器生成的内容

ruby-on-rails - 在 Rails 项目上使用 capybara 和 selenium-webdriver 运行系统测试失败 : due to ArgumentError in bridge. rb:44:in `handshake

mysql - 如何使用 GenericContainer 配置 spring 数据源,该 GenericContainer 从自定义 MySQL Docker 镜像创建容器

ubuntu - 远程激活 debian-installer 中的网络控制台

c# - 多个HTTP请求触发HTTP Client超时

c# - 如何在 Asp Net Core RC1 MVC 中使用 token 身份验证添加 "ApiController"

c# - 如何在 Visual Studio 2015 中更改 ASP.NET Core 构建平台

bash - 在 SSH 中将私钥指定为字符串

python - Paramiko 在 Windows 上无法从 ssh-agent 找到 key