我正在尝试将运行 C# .Net 6 Web API 的 docker 映像部署到 Azure 应用服务(用于容器)。该服务当前使用
FROM mcr.microsoft.com/dotnet/aspnet:6.0
基本映像运行,但我想更改为 alpine:3.19
。更新后的 docker 文件如下所示:
# Build Stage
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /app
COPY MyProject/MyProject.csproj ./MyProject/
RUN dotnet restore MyProject/MyProject.csproj
COPY MyProject/* ./MyProject/
RUN dotnet publish --configuration Release --output out MyProject/MyProject.csproj
# Unit Test Runner
FROM build as unit-tests
WORKDIR /app/MyProject.UnitTests
COPY MyProject.UnitTests/. .
ENTRYPOINT [ "dotnet", "test"]
# Integration Test Runner
FROM build as integration-tests
WORKDIR /app/MyProject.IntegrationTests
COPY MyProject.IntegrationTests/. .
ENTRYPOINT [ "dotnet", "test"]
# Run Stage
FROM alpine:3.19
RUN apk update \
&& apk upgrade \
&& apk add --no-cache dotnet6-runtime \
&& apk add --no-cache aspnetcore6-runtime
WORKDIR /app
COPY --from=build /app/out .
# Allow SSH access
COPY entrypoint.sh ./
COPY sshd_config /etc/ssh/
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache openssh \
&& apk add --no-cache tini \
&& apk add --no-cache netcat-openbsd \
&& echo "root:Docker!" | chpasswd \
&& chmod u+x ./entrypoint.sh \
&& cd /etc/ssh/ \
&& ssh-keygen -A
ENV PORT 80
EXPOSE 80
EXPOSE 443
EXPOSE 2222
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["./entrypoint.sh"]
entrypoint.sh 看起来像这样:
#!/bin/bash
set -e
#--- Starting SSH
/usr/sbin/sshd
exec dotnet MyProject.dll
当我部署到应用程序服务时,容器启动。我可以从显示后台服务正在运行的日志中看出这一点。问题是容器似乎无法通过端口 80 访问。Web 应用程序启动过程会发出如下日志:
等待容器预热请求的响应 app_my-project_1_3addd53d。经过时间 = 30.5399342秒
最终失败之前:
2023-12-13T02:18:20.920Z 错误 - 容器 app_my-project_1_3addd53d 没有响应 端口 80 上的 HTTP ping,站点启动失败。查看容器日志 调试。 2023-12-13T02:18:20.970Z 信息 - 停止站点 app_my-project_1 因为它在 启动。
我尝试设置以下应用程序设置:
WEBSITES_PORT = 80
这并没有产生什么影响。从日志中我可以看到运行的是以下 docker 命令:
docker run -d --expose=80 --name app_my-project_1_3addd53d -e WEBSITE_USE_DIAGNOSTIC_SERVER=false -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITES_PORT=8080 -e WEBSITE_SITE_NAME=app_my-project -e WEBSITE_AUTH_ENABLED=False -e PORT=8080 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=app_my-project.azurewebsites.net -e WEBSITE_INSTANCE_ID=2f7d09e6f18b384667ff962cc75fe4cbeb8ff744d3ba3c5cc3766bd82eb68007 -e HTTP_LOGGING_ENABLED=1 myregistry.azurecr.io/app_my-project:tag
找到了!
我需要将以下内容添加到我的 Dockerfile 中:
ENV ASPNETCORE_URLS=http://+:80