Docker не копирует папку с активами - PullRequest
1 голос
/ 29 мая 2020

У меня нет файла .dockerignore, но Docker не копирует папку с ресурсами в изображения при сборке.

проект:

  • активы
    • модели
      • v1
  • sr c
  • venv
  • Dockerfile

App.py:

    import numpy as np
    import tensorflow as tf                                   
                                  [...]
    with open('../assets/model/v1/model_architecture_V1.json', 'r') as f:
        model_json = f.read()

    model.load_weights("../assets/model/v1/model_weight_V1.h5")

                                  [...]

    if __name__ == '__main__':
       app.run(host='0.0.0.0', port=4000, debug=True)

Dockerfile:

    FROM python:3

    WORKDIR /app

    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt

    COPY . .

    CMD ["python3","src/app.py"]

Когда я запускаю образ проекта, Python выдает мне эту ошибку:

enter image description here

  • Когда я запускаю приложение без Docker, проблем нет.

Ответы [ 2 ]

1 голос
/ 30 мая 2020
CMD ["python3","src/app.py"]

Обратите внимание на это утверждение, вы запускаете сценарий app.py вне папки src, но не внутри папки src. Итак, функция open() принимает либо абсолютный, либо относительный путь. Когда дело доходит до относительного пути, вам необходимо указать путь, откуда вы запускаете python скрипт app.py, поскольку вы работаете за пределами папки src, поэтому ваш путь также должен быть указан таким же образом. Таким образом, это будет assests/models/v1/model_architecture_V1.json

Нет ничего общего с файлом docker или его положением здесь. Вы должны понимать, как происходит копирование и перемещение в каталоги в вашем контейнере, а затем также понимать природу python, вам необходимо указать относительный путь на основе того, где вы запускаете скрипт, но не относительно позиции скрипта python app.py.

1 голос
/ 30 мая 2020

При локальном тестировании ../assets/.. действительно. Но во время сборки Docker папки Dockerfile и assets расположены на одном уровне. Итак, вам нужно изменить путь к файлу на assets/... Чтобы справиться с этим эффективно, в Python проверьте os.path.join.

    Step 3/6 : COPY . .
    ---> 49a93d46bdde
    Step 4/6 : RUN ls -lah
     ---> Running in f57d57b59dce
    total 24K
    drwxr-xr-x 1 root root 4.0K May 29 21:21 .
    drwxr-xr-x 1 root root 4.0K May 29 21:21 ..
    -rw-r--r-- 1 root root  168 May 29 21:19 Dockerfile
    drwxr-xr-x 3 root root 4.0K May 29 20:53 assests
    drwxr-xr-x 2 root root 4.0K May 29 21:21 src
    drwxr-xr-x 2 root root 4.0K May 29 20:54 venv

    ---

    with open('assests/models/v1/model_architecture_V1.json', 'r') as f:
       model_json = f.read()

Пример вывода

docker run harik8/app:latest                  
{
    "glossary": {
        "title": "example glossary",
                "GlossDiv": {
            "title": "S",
                        "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                                        "SortAs": "SGML",
                                        "GlossTerm": "Standard Generalized Markup Language",
                                        "Acronym": "SGML",
                                        "Abbrev": "ISO 8879:1986",
                                        "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                                                "GlossSeeAlso": ["GML", "XML"]
                    },
                                        "GlossSee": "markup"
                }
            }
        }
    }
}
...