Копирование файлов в dockerfile не работает, ls показывает, что файлы есть

в настоящее время я действительно слеп и не понимаю, в чем моя проблема, и я надеюсь, что ваша свежая пара глаз поможет мне здесь.

У меня есть следующий 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?

Sathyajith Bhat 09.07.2024 07:52

вся сборка создается вне и заранее «сборки докера», но в рамках одного и того же задания

Jörg Lang 09.07.2024 07:56

Как именно вы пришли к выводу, что DLL не существует?

tripleee 09.07.2024 08:05

@tripleee, см. выше > Я заменил точку входа на CMD ["sh", "-c", "ls -la /app && Sleep 3600"] и уже вижу только следующее...

Jörg Lang 09.07.2024 08:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш 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», и внутри сборки отображаются файлы, которые я ищу, но я не вижу их, когда контейнер работает

Jörg Lang 09.07.2024 10:05

Вы только build выполняете Docker@2 задание, а не push, могу ли я узнать, добавите ли вы последний шаг, чтобы отправить изображение в ACR? И какой результат RUN ls -la /app, когда вы говорите it shows the files I'm looking for? Содержит ли он dll?

wade zhou - MSFT 09.07.2024 10:18

нажатие выполняется с помощью другой задачи ```` - задача: Docker@2 inputs: команда: push #containerRegistry: $(ACR_LOGIN_SERVER) репозиторий: $(ACR_LOGIN_SERVER)/$(dockerImageName) теги: |- $(releaseVersion) последняя версия displayName: 'Docker — Push'```

Jörg Lang 09.07.2024 11:11

и да, RUN ls -la /app показывает полное содержимое папки, из которой скопированы файлы.

Jörg Lang 09.07.2024 11:12

Вы прокомментировали #containerRegistry: $(ACR_LOGIN_SERVER) в задании выше. Подтвердите, если это опечатка, и сообщите мне, обновилось ли изображение в ACR. Также покажите результат RUN ls -la /app, он должен содержать файлы dll.

wade zhou - MSFT 09.07.2024 11:15

нет, никакой опечатки. поскольку «containerRegistry» предназначен для подключения к службе, которую мы не используем. Вот почему repository: $(ACR_LOGIN_SERVER)/$(dockerImageName)

Jörg Lang 09.07.2024 11:24

Скриншот добавлен в первый пост

Jörg Lang 09.07.2024 11:52
Ответ принят как подходящий

Я нашел проблему. В рамках развертывания создается карта конфигурации. mountPath указывал на папку, а не на файл

Рад это знать. Насколько я понимаю, образ в конвейере создается нормально, проблема возникает, когда вы развертываете образ в AKS, правильно ли это?

wade zhou - MSFT 09.07.2024 15:31

да, полностью прав

Jörg Lang 09.07.2024 15:38

Спасибо за быстрый ответ! Счастливый день! :)

wade zhou - MSFT 09.07.2024 15:40

Другие вопросы по теме

Похожие вопросы