Почему моя структура каталогов файлов Python не соответствует выходным данным Dockerfile?

Мой Dockerfile (управляется гораздо более крупным docker-compose):

# set base image (host OS)
FROM python:3.7

ARG scorer

# set the working directory in the container
WORKDIR /code

# Download and install kenlm and stt for generating scorer files
RUN git clone https://github.com/kpu/kenlm.git --depth=1
RUN git clone https://github.com/coqui-ai/stt --depth=1
RUN apt-get update && apt-get install -y build-essential libboost-all-dev cmake libeigen3-dev
RUN mkdir /code/kenlm/build
RUN cd /code/kenlm/build && cmake .. && make -j 4

# copy the dependencies file to the working directory
COPY requirements.txt .

# copy libraries (asr-common)
COPY lib ./lib

# install dependencies
RUN pip install -r requirements.txt

# copy the content of the local src directory to the working directory
COPY src_code_folder ./src_code_folder
RUN mkdir -p /code/models
RUN ls -lF models
# empty directory as expected
COPY models/scorers/$scorer /code/models/${scorer}
RUN ls -lF models
# output (as expected):
# some.scorer*
RUN curl -o /code/models/model.tflite -L https://coqui.gateway.scarf.sh/english/coqui/v1.0.0-large-vocab/model.tflite
RUN ls -lF
# output (as expected):
# src_code_folder/
# kenlm/
# lib/
# models/
# requirements.txt*
# stt/

RUN ls -F models
# output (as expected):
# some.scorer*
# model.tflite*

# command to run on container start
CMD [ "python", "-m", "src_code_folder" ]

и соответствующий код из docker-compose.yml:

  coqui-asr:
    build:
      context: microservices/coqui-asr
      args:
        scorer: some.scorer
    container_name: coqui-asr
    restart: always
    environment:
      - MQTT_ENDPOINT
    depends_on:
      - broker
    volumes:
      - ./microservices/coqui-asr/models:/code/models

Код Python, который я использую для проверки структуры каталогов:

pbmms = glob.glob(os.path.join(args.models_dir, "*.tflite"))
scorers = glob.glob(os.path.join(args.models_dir, "*.scorer"))
logger.debug(f"Input: {args.models_dir}")

logger.debug(f"tflite file: {pbmms}")
logger.debug(f"scorer file: {scorers}")
logger.debug(f"this directory: {os.path.dirname(os.path.realpath(__file__))}")
logger.debug(f"current working directory: {os.getcwd()}")
for (dirpath, dirnames, filenames) in os.walk(os.getcwd()):
    if 'code/stt' in dirpath or 'code/kenlm' in dirpath:
        # these cloned repos have a LOT of folders we don't need to see
        continue
    logger.debug(f"Path: {dirpath}")
    logger.debug(f"\tDirectory: {dirnames}")
for (dirpath, dirnames, filenames) in os.walk("models/"):
    logger.debug(f"Path: {dirpath}")
    logger.debug(f"\tDirectory: {dirnames}")
    logger.debug(f"\tFile: {filenames}")
assert len(pbmms) == 1  # passes
assert len(scorers) == 1  # fails

и его вывод:

DEBUG Input: models
DEBUG tflite file: ['models/model.tflite']
DEBUG scorer file: []
DEBUG this directory: /code/src_code_folder
DEBUG current working directory: /code
DEBUG Path: /code
DEBUG      Directory: ['src_code_folder', 'models', 'lib', 'kenlm', 'stt']
...
irrelevant output of all the other folders
...
DEBUG Path: models/
DEBUG      Directory: ['scorers']          <----- WHY IS THIS HERE
DEBUG      File: ['model.tflite']
DEBUG Path: models/scorers                 <----- WHY DOES THIS APPEAR
DEBUG      Directory: []
DEBUG      File: ['some.scorer', 'other.scorer']

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/local/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/code/src_code_folder/__main__.py", line 71, in <module>
    main(args)
  File "/code/src_code_folder/__main__.py", line 33, in main
    assert len(scorers) == 1
AssertionError

Я не понимаю, почему структура каталогов, видимая/выводимая Dockerfile, будет полностью отличаться от структуры каталогов, видимой/выводимой моим файлом Python. По какой-то причине, хотя код Python запускается контейнером Docker (и внутри него) и копируются только определенные файлы и папки, файловая система, видимая/выводимая Python, кажется, соответствует файловой структуре моей хост-системы:

Очевидно, что некоторые вещи копируются, но совсем не то, что я ожидал, основываясь на моих командах Dockerfile и выводе из указанного Dockerfile.


Пожалуйста, дайте мне знать, если мне нужно добавить дополнительную информацию.

Как у вас работает контейнер?

David Maze 18.10.2022 03:59

@DavidMaze Я отредактировал сообщение и добавил код docker-compose, который вызывает этот контейнер.

elkshadow5 18.10.2022 04:46

Блок volumes: скрывает все, что Dockerfile делает в /code/models, и заменяет его каталогом, смонтированным привязкой, с хоста. Если вы удалите этот блок, увидите ли вы ожидаемые файлы?

David Maze 18.10.2022 06:07

@DavidMaze это было решением! Большое спасибо! Вы хотите опубликовать это как ответ или я должен?

elkshadow5 18.10.2022 18:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем файле Compose указано:

volumes:
  - ./microservices/coqui-asr/models:/code/models

Это указывает на то, что каталог /code/models в образе и любые настройки, которые вы сделали для него локально, должны быть скрыты и заменены именованным каталогом хоста.

Однако ваше изображение уже содержит модели, и для них была выполнена дополнительная предварительная обработка. Вы должны удалить этот блок volumes:, чтобы увидеть исходное содержимое изображения.

Я предполагаю, что команда volumes: в docker-compose запускается после сборки контейнера и перезаписывает любые каталоги, созданные Dockerfile (если они имеют совпадающие имена/пути).

elkshadow5 19.10.2022 22:48

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

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