Я новичок в Docker и Azure в целом, так что терпите меня ...
ДЛЯ НАЧИНАЮЩИХ
У меня есть образ Docker на основе контейнера Linux, который я могу запустить и подключиться к нему локально.
Вот файл докеров, который я собрал
#Use microsoft's sdk image for build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app
#1. copy csproj and restore as distinct layers
COPY *.sln .
COPY Client.Web/*.csproj ./Client.Web/
COPY DataOneDecoder/*.csproj ./DataOneDecoder/
COPY DealershipTenant/*.csproj ./DealershipTenant/
COPY Portal.Web/*.csproj ./Portal.Web/
COPY Multitenancy/*.csproj ./Multitenancy/
COPY Shared/*.csproj ./Shared/
COPY AdfSerialization/*.csproj ./AdfSerialization/
#2. dotnet-restore
RUN dotnet restore
#3. copy everything else and build app
COPY Client.Web/. ./Client.Web/
COPY DataOneDecoder/. ./DataOneDecoder/
COPY DealershipTenant/. ./DealershipTenant/
COPY Portal.Web/. ./Portal.Web/
COPY Multitenancy/. ./Multitenancy/
COPY Shared/. ./Shared/
COPY AdfSerialization/. ./AdfSerialization/
#4. Install nodejs and npm
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs
RUN echo "NODE Version: " && node --version
RUN echo "NPM Version: " && npm --version
#5. Navigate to Portal.Web and install npm dependencies
WORKDIR /app/Portal.Web
RUN npm install
#6. Build and publish solution
WORKDIR /app/
RUN dotnet publish -c Release -o out
#7. Copy built application to runtime image, expose port 5000, and define entrypoint
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime
COPY --from=build /app/out ./
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet", "Portal.Web.dll"]
Локально я могу открыть приложение на порту 80, сопоставленном с портом 5000 (отображается в файле dockerfile), используя следующие команды
docker build -t exampleApp . --no-cache
docker run -d -p 80:5000 --name exampleContainer exampleApp
Теперь в стране Azure я настроил конвейер gitlab, который создает и развертывает контейнер в моем реестре контейнеров Azure.
Оттуда я использую интерфейс командной строки для развертывания контейнера в группе контейнеров и, в конечном итоге, в качестве экземпляра контейнера.
az container create \
--name dstestacg \
--resource-group $RES_GROUP \
--image $ACR_LOGIN_SERVER/portal_web_test:38b63ff933ea5a04b9ed7906ee01db33afb9abb6 \
--registry-login-server $ACR_LOGIN_SERVER \
--registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
--registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
--restart-policy Never \
--ip-address Public \
--cpu 2 \
--memory 3.5 \
--ports 80 \
--environment-variables 'ASPNETCORE_URLS'='http://*:5000' \
--command-line "tail -f /dev/null"
Похоже, что приложение запущено (я вижу всплеск использования ресурсов, больше, чем я испытывал, когда приложение не работало), но я не могу подключиться к общедоступному IP-адресу с портом 80. Я получаю ошибку ERR_CONNECTION_RESET в браузере
Я немного не понимаю, как это размещается на машине без Windows. Я считаю, что это с Kestrel, который, как я предполагаю, использовал мой локальный контейнер Linux. Я не уверен, почему я могу получить доступ к контейнеру через порт 80 локально, но не как к экземпляру контейнера Azure.
Любая помощь будет принята с благодарностью, и если вам нужна дополнительная информация, пожалуйста, спросите.
Спасибо!
Обновлен файл Docker и команда Azure CLI после обсуждения сопоставления портов.
#Use microsoft's sdk image for build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app
#1. copy csproj and restore as distinct layers
COPY *.sln .
COPY Client.Web/*.csproj ./Client.Web/
COPY DataOneDecoder/*.csproj ./DataOneDecoder/
COPY DealershipTenant/*.csproj ./DealershipTenant/
COPY Portal.Web/*.csproj ./Portal.Web/
COPY Multitenancy/*.csproj ./Multitenancy/
COPY Shared/*.csproj ./Shared/
COPY AdfSerialization/*.csproj ./AdfSerialization/
#2. dotnet-restore
RUN dotnet restore
#3. copy everything else and build app
COPY Client.Web/. ./Client.Web/
COPY DataOneDecoder/. ./DataOneDecoder/
COPY DealershipTenant/. ./DealershipTenant/
COPY Portal.Web/. ./Portal.Web/
COPY Multitenancy/. ./Multitenancy/
COPY Shared/. ./Shared/
COPY AdfSerialization/. ./AdfSerialization/
#4. Install nodejs and npm
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs
RUN echo "NODE Version: " && node --version
RUN echo "NPM Version: " && npm --version
#5. Navigate to Portal.Web and install npm dependencies
WORKDIR /app/Portal.Web
RUN npm install
#6. Build and publish solution
WORKDIR /app/
RUN dotnet publish -c Release -o out
#7. Copy built application to runtime image, expose port 5000, and define entrypoint
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime
COPY --from=build /app/out ./
EXPOSE 5000/tcp
ENV ASPNETCORE_URLS=http://*:5000
ENV ASPNETCORE_ENVIRONMENT=Development
ENTRYPOINT ["dotnet", "Portal.Web.dll"]
az container create \
--name idkman \
--resource-group $RES_GROUP \
--image $ACR_LOGIN_SERVER/portal_web_test:deb5e784f1a7f9904f50a97b93ff42380b85158c \
--registry-login-server $ACR_LOGIN_SERVER \
--registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
--registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
--restart-policy Never \
--ip-address Public \
--cpu 2 \
--memory 3.5 \
--ports 5000 \
--environment-variables 'PORT'='5000'