Сборка Docker-compose завершится неудачно, если в локальном проекте присутствуют node_modules - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь понять основы docker / docker-compose, поэтому я начал собственный дидактический эксперимент. По сути, я хочу протестировать весь цикл: разработать код локально, написать файлы docker и docker-compose, переместить их в репозиторий github, клонировать репозиторий в тестовый каталог, выполнить docker-compose up --build и наблюдать за магией. Чтобы проверить все это, я использовал приложение Angular, которое я уже написал. Файл Docker выглядит так:

# base image
FROM node:10.13.0-jessie

# set working directory
RUN mkdir /usr/src/app
WORKDIR /usr/src/app

# add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install -g @angular/cli

# add app
COPY . /usr/src/app

# expose port
EXPOSE 4200

# start app
CMD ng serve --host 0.0.0.0

и Docker-compose.yml:

version: '3.7'

services:
  myapp-frontend:
    container_name: frontend
    build: ./
    working_dir: /usr/src/app
    command: ng serve --host 0.0.0.0
    ports:
      - "4200:4200"

Итак, все работает как положено, если я не решу начать разработку в тестовой папке. В этом случае после выполнения npm install для загрузки всех узлов_модулей при повторной попытке docker-compose up --build сборка завершается со следующей ошибкой

Traceback (most recent call last):
  File "site-packages\docker\utils\build.py", line 96, in create_archive
OSError: [Errno 22] Invalid argument: 'path\\myapp-frontend\\node_modules \\.bin\\acorn'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker-compose", line 6, in <module>
  File "compose\cli\main.py", line 71, in main
  File "compose\cli\main.py", line 127, in perform_command
  File "compose\cli\main.py", line 1052, in up
  File "compose\cli\main.py", line 1048, in up
  File "compose\project.py", line 471, in up
  File "compose\service.py", line 336, in ensure_image_exists
  File "compose\service.py", line 1067, in build
  File "site-packages\docker\api\build.py", line 154, in build
  File "site-packages\docker\utils\build.py", line 31, in tar
  File "site-packages\docker\utils\build.py", line 100, in create_archive
OSError: Can not read file in context: path\myapp-frontend\node_modules\.bin\acorn
[27228] Failed to execute script docker-compose

Насколько я понял, вся строительная часть приложения Angular происходит в контейнере (и на самом деле docker-compose прекрасно работает, когда я клонирую репозиторий), так почему он вдруг заботится о node_modules в локальном ( OS) проект?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Попробуйте зайти внутрь исходного изображения (просто запустите его)

docker run --rm -it node:10.13.0-jessie bash

и попробуйте свои команды шаг за шагом, чтобы отладить и получить полный контроль над ним. Затем добавьте, что работает в ваш Dockerfile.

Для копирования данных в работающий контейнер используйте

docker cp package.json mycontainer:/usr/src/app/package.json
0 голосов
/ 06 ноября 2018

Я действительно не знаю причину этого поведения, но вы не должны копировать node_module внутри. Смотрите комментарии ниже

# install and cache app dependencies, **OK**
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install -g @angular/cli

# add app, **this also copies your local node_modules, overwriting previously installed**
COPY . /usr/src/app

Таким образом, вы можете решить эту проблему, добавив .dockerignore файл

.dockerignore
./log
./tmp
.git
*Dockerfile*
*docker-compose*
node_modules
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...