в настоящее время я действительно слеп и не понимаю, в чем моя проблема, и я надеюсь, что ваша свежая пара глаз поможет мне здесь.
У меня есть следующий Dockerfile
ARG base_image=mcr.microsoft.com/dotnet/runtime
ARG base_image_version=8.0
ARG port=80
# Use a runtime image as the base image
#FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
FROM ${base_image}:${base_image_version} AS runtime
# The name of DLL which needs to be used for starting the application
ARG DLL_NAME
ENV env_dll_name=${DLL_NAME}
# Set the working directory in the container
WORKDIR /app
# Copy the published application files
COPY --chown=$APP_UID:$APP_UID . ./
# Change ownership of the files to the dedicated user
RUN chown -R $APP_UID:$APP_UID /app
# Switch to the dedicated user
USER $APP_UID
# List the contents of the /app directory to verify the files copied
RUN ls -la /app
# List the DLL to be executed
RUN echo "DLL to execute: ${env_dll_name}"
# Expose the port that the application will listen on
EXPOSE ${port}
RUN ls -la .
# Define the entry point for the container
ENTRYPOINT ["sh", "-c", "dotnet ${env_dll_name}"]
Конвейер Azure DevOps выполняет следующие задачи.
- script: |
pwd
ls -la .
ls -la $(Build.ArtifactStagingDirectory)
ls -la $(Build.ArtifactStagingDirectory)/PublishOutput
- task: Docker@2 displayName: 'Docker - Build' inputs:
command: build
#containerRegistry: $(ACR_LOGIN_SERVER)
repository: $(ACR_LOGIN_SERVER)/$(dockerImageName)
Dockerfile: '$(Build.Repository.LocalPath)/Dockerfile' # Path to your Dockerfile
buildContext: '$(Build.ArtifactStagingDirectory)/PublishOutput'
arguments: '--progress=plain --build-arg DLL_NAME=$(project_name).dll'
tags: |-
$(releaseVersion)
latest
Строки RUN ls -la
показывают ожидаемое содержимое папки.
Но когда контейнер запускается в AKS, происходит сбой, поскольку библиотека dll не найдена.
Я заменил точку входа на CMD ["sh", "-c", "ls -la /app && sleep 3600"]
и уже вижу только следующие
drwxrwxrwx 3 root root 4096 Jul 8 17:37 .
drwxr-xr-x 1 root root 4096 Jul 9 04:38 ..
drwxr-xr-x 2 root root 4096 Jul 8 17:37 ..2024_07_08_17_37_44.4116578998
lrwxrwxrwx 1 root root 32 Jul 8 17:37 ..data -> ..2024_07_08_17_37_44.4116578998
lrwxrwxrwx 1 root root 23 Jul 8 17:37 appsettings.json -> ..data/appsettings.json
Что я делаю не так? Пожалуйста помоги
Редактировать: Результат сборки dotnet создается
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
projects: |
**/*.csproj
!**/*Test.csproj
!**/*Tests.csproj
arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/PublishOutput'
zipAfterPublish: false
modifyOutputPath: false
publishWebProjects: false
displayName: 'dotnet - Publish Project'
Редактировать: Снимок экрана из Docker — задача сборки
вся сборка создается вне и заранее «сборки докера», но в рамках одного и того же задания
Как именно вы пришли к выводу, что DLL не существует?
@tripleee, см. выше > Я заменил точку входа на CMD ["sh", "-c", "ls -la /app && Sleep 3600"] и уже вижу только следующее...
Ваш Dockerfile существует в $(Build.Repository.LocalPath)
(например: /home/vsts/work/1/s
), но dll была встроена в $(build.ArtifactStagingDirectory)/PublishOutput
, что отличается. И вы указываете buildContext
для этого каталога, который обычно должен совпадать с каталогом Dockerfile.
Следовательно, после задачи публикации DotNetCoreCLI@2
вы можете скопировать dll в рабочий каталог, в котором существует Dockerfile:
- script: |
pwd
ls -la .
cp $(build.ArtifactStagingDirectory)/PublishOutput/*.dll .
Я прокомментировал repository
и buildContext
для Docker@2
задачи:
- task: Docker@2
displayName: 'Docker - Build'
inputs:
command: build
#containerRegistry: $(ACR_LOGIN_SERVER)
#repository: $(ACR_LOGIN_SERVER)/$(dockerImageName)
Dockerfile: '$(Build.Repository.LocalPath)/Dockerfile' # Path to your Dockerfile
#buildContext: '$(Build.ArtifactStagingDirectory)/PublishOutput'
arguments: '--progress=plain --build-arg DLL_NAME=$(project_name).dll'
tags: |-
$(releaseVersion)
latest
Он может получить файл dll в докере:
И вот тут начинается самое интересное: как видите, я уже запускаю «RUN ls -la /app», и внутри сборки отображаются файлы, которые я ищу, но я не вижу их, когда контейнер работает
Вы только build
выполняете Docker@2
задание, а не push
, могу ли я узнать, добавите ли вы последний шаг, чтобы отправить изображение в ACR? И какой результат RUN ls -la /app
, когда вы говорите it shows the files I'm looking for
? Содержит ли он dll?
нажатие выполняется с помощью другой задачи ```` - задача: Docker@2 inputs: команда: push #containerRegistry: $(ACR_LOGIN_SERVER) репозиторий: $(ACR_LOGIN_SERVER)/$(dockerImageName) теги: |- $(releaseVersion) последняя версия displayName: 'Docker — Push'```
и да, RUN ls -la /app
показывает полное содержимое папки, из которой скопированы файлы.
Вы прокомментировали #containerRegistry: $(ACR_LOGIN_SERVER)
в задании выше. Подтвердите, если это опечатка, и сообщите мне, обновилось ли изображение в ACR. Также покажите результат RUN ls -la /app
, он должен содержать файлы dll.
нет, никакой опечатки. поскольку «containerRegistry» предназначен для подключения к службе, которую мы не используем. Вот почему repository: $(ACR_LOGIN_SERVER)/$(dockerImageName)
Скриншот добавлен в первый пост
Я нашел проблему. В рамках развертывания создается карта конфигурации. mountPath указывал на папку, а не на файл
Рад это знать. Насколько я понимаю, образ в конвейере создается нормально, проблема возникает, когда вы развертываете образ в AKS, правильно ли это?
да, полностью прав
Спасибо за быстрый ответ! Счастливый день! :)
где/как создается dll?