Docker - problem z reactem

0

Cześć,
mam pytanie dotyczące konteneryzacje frontendu (react).
Miałem problem z uruchomieniem reacta, W Dockerfile umieszczałem:

FROM node:13

WORKDIR /frontend

COPY package*.json /frontend
RUN npm install

EXPOSE 3000

CMD ["npm", "start"]

Niestety pojawiał się problem z npm.
Problem rozwiązałem poprzez usunięcie folderu node_modules i zainstalowanie npm w folderze frontend poleceniem npm install (używając "terminala"). Wówczas w dockerfile mogłem usunąć polecenie RUN npm install.
Miałem aktualny node_modules, wszystko działało.

Jednak coś nie daje mi spokoju.

Jak uruchomić npm install z poziomu dockera?

Dzięki za wszelkie wskazówki

1
FROM node:13

RUN npm install  # w tym momencie w obrazie nie ma package.json, wiec npm install nic nie zainstaluje
WORKDIR /frontend

COPY package*.json ./

EXPOSE 3000

CMD ["npm", "start"]
0

Odpisałeś szybciej niż zdążyłem edytować posta ^^
Masz rację, jednak to nie rozwiązuje problemu. (wyłącznie ręczna instalacja npm pozwala na uruchomienie)
Podczas instalacji npm z poziomu dockera wysypuje się masa błędów i niestety frontend nie rusza.

1

(...) Niestety pojawiał się problem z npm.
(...) wysypuje się masa błędów

Jaki problem? Jakich błędów?

0

Po uruchomieniu docker-compose up :

frontend_1              | > [email protected] start /frontend
frontend_1              | > react-scripts start
frontend_1              | 
frontend_1              | sh: 1: react-scripts: not found
frontend_1              | npm ERR! code ELIFECYCLE
frontend_1              | npm ERR! syscall spawn
frontend_1              | npm ERR! file sh
frontend_1              | npm ERR! errno ENOENT
frontend_1              | npm ERR! [email protected] start: `react-scripts start`
frontend_1              | npm ERR! spawn ENOENT
frontend_1              | npm ERR! 
frontend_1              | npm ERR! Failed at the [email protected] start script.
frontend_1              | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
frontend_1              | npm WARN Local package.json exists, but node_modules missing, did you mean to install?
frontend_1              | 
frontend_1              | npm ERR! A complete log of this run can be found in:
frontend_1              | npm ERR!     /root/.npm/_logs/2020-03-17T08_14_19_248Z-debug.log

Przejrzałem wiele wątków dotyczących m.in tego błędu, dlatego też usuwałem folder node_modules i ręcznie wklepywałem npm install.
Rozwiązanie działa,
Jednak chyba chodzi o to, żeby uruchomić to bezpośrednio z dockera. No a tu niestety problemu nie potrafię rozwiązać.

1

Hej,

A kod aplikacji montujesz poprzez volumen? Bo nie widzę tutaj instrukcji, która kopiuje kod źródłowy do kontenera? :)

0

Hej, @damian-szkoladockera bardzo mi miło, że udzieliłeś się w wątku :)
Swoją drogą nie znałem strony którą promujesz, na pewno przejrzę wiele wątków! Dzięki!

na jakiś czas pozostawiłem sprawę, teraz wracam, żeby dopiąć ją na ostatni guzik.
Początkowy stan:
Dockerfile w pliku frontend:

FROM node:13

RUN mkdir /code
RUN mkdir /code/frontend
RUN mkdir /code/frontend/dashboard
COPY . /code/frontend/dashboard
WORKDIR /code/frontend/dashboard

RUN npm install
EXPOSE 3000
CMD ["npm", "start"]

Docker-compose:

  frontend:
    image: frontend
    build: ./frontend/dashboard
    volumes:
      - ./frontend/dashboard:/code/frontend/dashboard
    ports:
      - "3000:3000"

Na ogół całość (no niemal) działa. Frontend dynamicznie się odświeża podczas pracy nad stroną. Jedyny problem - instalacja npm "z palca" - przed uruchomieniem docker-compose musze w folderze z frontendem uruchomić npm install.

Czy istnieje możliwość uruchomienia tego z poziomu docker-compose? W senie aby uruchamiając docker-compose up w folderze lokalnym pojawił się zainstalowany "npm_modules"?

1

Cześc @CzakuGim

Rozumiem Twoją potrzebę. Troche kodowałem w Reactcie :)

Zoptymalizowałem na szybko nieco Twój Dockerfile :)

FROM node:13

WORKDIR /code/frontend/dashboard
#  to jest niepotrzebne
RUN mkdir -p /code/frontend/dashboard

# najpierw zależności 
COPY package*.json ./

RUN npm install

# później kod
COPY . .

EXPOSE 3000
CMD ["npm", "start"]

A więc tak:

  • czy plik package.json jest równiez podmontowany do kontenera? tzn znajduje się lokalnie u Ciebie w katalogu "/frontend/dashboard"?

Jeżeli tak, to:

  1. Najpierw uruchamiasz całość - "docker-compose up -d" - to nie blokuje ci terminala, kontener działa w tle
  2. W momencie jakiejś zmiany w package.json, możesz uzyć polecenia "docker-compose exec frontend npm install"

Pozdrawiam!

0

Dzięki za odpowiedź,

Tak, package.json znajduje się w katalogu "/frontend/dashboard".
Struktura folderów:

projekt:
  - docker-compose.yml
 - frontend
    - dashboard 
         - public
         - src
         - Dockerfile
         - package.json
         - ...
 - backend
 - ...

Czyli jeśli dobrze rozumiem, npm install musi być zrealizowana ręcznie czy istnieje jakiś sposób na to?

0

Ale czy aż tak często musisz uruchamiać npm install?

Jeżeli katalog jest podmontowany, to node_modules powinno być trwałe. I tylko w momencie zmiany w pliku package.json, powinna być konieczność odpalania npm install.

1 użytkowników online, w tym zalogowanych: 0, gości: 1