Сборка Yarn не генерирует index.html во время сборки Docker, но работает вручную в контейнере (Nginx, React, Gunicorn, Django)
Я пытаюсь создать сайт с Nginx, React, Gunicorn и Django, используя Docker. Все работает хорошо, за исключением одной проблемы:
Когда я собираю контейнер Docker, команда yarn build не генерирует файл index.html внутри контейнера. Однако, когда я запускаю команду yarn build вручную внутри контейнера, она работает, и файл index.html появляется в папке /app/build.
О, я обнаружил, что Build dir не имеет index.html, имея 500 ошибку на сайте и эту ошибку в логах enginx :
[ошибка] 29#29: *1 цикл перезаписи или внутреннего перенаправления при внутреннем перенаправлении на «/index.html»...
Вот мой docker-compose.yml:
services:
db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
backend:
build: ./backend
command: gunicorn aware.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./backend:/app
depends_on:
- db
environment:
- DJANGO_SETTINGS_MODULE=aware.settings
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
networks:
- app-network
frontend:
build: ./frontend/front
volumes:
- ./frontend/front:/app
- ./frontend/front/build:/app/build
networks:
- "app-network"
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./frontend/front/build:/app/frontend/front/build
- ./frontend/front/build/static:/app/frontend/front/build/static
- ./backend/media:/app/backend/media
- ./frontend/front/build/favicon.ico:/app/frontend/front/build/favicon.ico
depends_on:
- backend
- frontend
networks:
- app-network
volumes:
db_data:
networks:
app-network:
driver: bridge
Вот мой nginx.config
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
server {
listen 80;
server_name example.ro www.example.ro;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri /index.html;
}
location /api/ {
proxy_pass http://backend:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /app/frontend/front/build/static/;
}
location /media/ {
alias /app/backend/media/;
}
location /favicon.ico {
root /app/frontend/front/build;
try_files $uri /favicon.ico;
}
}
}
Вот мой докерфайл с фронта:
FROM node:20 AS build
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install
COPY . .
RUN yarn build && ls -lah build
RUN ls -lah /app/build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Я проверил журналы, и yarn build, похоже, выполняется правильно, но он не генерирует index.html в папке build. Я попробовал запустить yarn build вручную внутри контейнера, и он успешно сгенерировал файл index.html в каталоге /app/build. Я также проверил конфигурацию тома Docker, чтобы убедиться, что файлы смонтированы правильно.
Одна из проблем, которую я обнаружил, заключается в том, что я не получаю никаких журналов при запуске переднего контейнера. Я не знаю, почему.