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