Docker - приложение ASP.CORE 2.2 и SSH - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь настроить свой док-контейнер так, чтобы в него можно было войти по 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 и пытаюсь ssh в этот контейнер, это работает. К сожалению, этот подход неприемлем, демон ssh должен запускаться при запуске.

Я пытался использовать cron и другие вещи, доступные в debian, но это тонкая версия и там недоступен systemd - я тоже не увлекаюсьустановка сотен вещей в тонких версиях.

У вас есть идеи, что здесь может быть не так?

...