Есть ли способ определить, в данный момент я нахожусь в контейнере Windows или Linux в самом Dockerfile? - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь запустить основное приложение asp.net в Docker-контейнере, для которого я собрал требуемый Dockerfile.Я также интегрировал модульные тесты и покрытие кода в Dockerfile для того же.

Вот мой Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY Demo.API/Demo.API.csproj Demo.API/
RUN dotnet restore Demo.API/Demo.API.csproj
COPY . .
WORKDIR /src/Demo.API
RUN dotnet build Demo.API.csproj -c Release -o /app

FROM build as unittest
WORKDIR /src
COPY Demo.UnitTests/Demo.UnitTests.csproj Demo.UnitTests/
RUN dotnet restore Demo.UnitTests/Demo.UnitTests.csproj
COPY . .
WORKDIR /src/Demo.UnitTests
RUN apt-get update && apt-get install -y dos2unix
RUN find . -type f -print0 | xargs -0 unix2dos
RUN dotnet test --verbosity=normal --results-directory /TestResults/ 
--logger "trx;LogFileName=test_results.xml" /p:CollectCoverage=true
/p:Exclude="[xunit*]*" /p:CoverletOutputFormat=opencover 
/p:CoverletOutput='reports/coverage/clover.xml' Demo.UnitTests.csproj

FROM build AS publish
RUN dotnet publish Demo.API.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Demo.API.dll"]

Здесь, в этой части:

RUN apt-get update && apt-get install -y dos2unix
RUN find . -type f -print0 | xargs -0 unix2dos
RUN dotnet test --verbosity=normal --results-directory /TestResults/ 
--logger "trx;LogFileName=test_results.xml" /p:CollectCoverage=true
/p:Exclude="[xunit*]*" /p:CoverletOutputFormat=opencover 
/p:CoverletOutput='reports/coverage/clover.xml' Demo.UnitTests.csproj

, во второй строке я пытаюсь преобразовать все мои текстовые файлы в формат dos.

Это потому, что эти файлы имеют CarriageReturnLinFeed (/ r / n), которые преобразуются в просто наличие LineFeed (/ n),потому что Linux использует только LineFeed (/ n).Я принудительно преобразовываю их обратно в CarriageReturnLinFeed (/ r / n), используя unix2dos.

Это очень важно, потому что некоторые из модульных тестов используют CarriageReturnLinFeed (/ r / n) в качестве основы для тестов, и будутв противном случае провалите тесты, если он получит только LineFeed.

Но для запуска

RUN apt-get update && apt-get install -y dos2unix

я должен быть в контейнере Linux.Но я хочу иметь возможность делать то же самое в контейнере Windows.

Есть ли способ определить, выполняю ли я в настоящее время файл dockerfile в контейнере Linux или Windows, и написать какой-то оператор if вСам dockerfile и условно запустить или не выполнить оператор apt-get?

...