«npm run build» в Dockerfile: папка dist создается, но исчезает - PullRequest
0 голосов
/ 03 июня 2019

У меня есть Dockerfile для приложения Django и Vue.js, которое я использую вместе с Gitlab.

Проблема, которую я собираюсь описать, возникает только при развертывании через Gitlab CI и соответствующий файл .gitlab-ci.yml. При выполнении команды docker-compose up на моем локальном компьютере этого не происходит.

Итак, я запускаю docker-compose up, и все инструкции в Dockerfile работают нормально. Но когда я проверяю производственный сервер, папка dist (где должны храниться bundle.js и bundle.css) не существует.

Журналы, которые выплевываются при выполнении Dockerfile, подтверждают, что команды npm install и npm run build выполнены, и даже подтверждают, что файлы dist/bundle.js и dist/bundle.css были сгенерированы. Но почему-то они, похоже, удалены.

Это мой Dockerfile :

FROM python:3.7-alpine
MAINTAINER My Name

ENV PYTHONUNBUFFERED 1

RUN mkdir /app

# make the 'app' folder the current working directory
WORKDIR /app

# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY ./app .

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache postgresql-client
RUN apk add --update --no-cache --virtual .tmp-build-deps \
      gcc libc-dev linux-headers postgresql-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps

# copy both 'package.json' and 'package-lock.json' (if available)
COPY app/frontend/package*.json ./frontend/

# Install npm
RUN  apk add --update nodejs && apk add --update nodejs-npm

# install project dependencies
WORKDIR /app/frontend
RUN npm install

# build app for production with minification
RUN npm run build

RUN adduser -D user
USER user

CMD ["sh ../scripts/entrypoint.sh"]

Это .gitlab-ci.yml файл:

image: docker:latest

services:
  - docker:dind

before_script:
  - echo "Runnig before_script"
  - sudo apt-get install -y python-pip
  - sudo apt-get install -y nodejs
  - pip install docker-compose

stages:
  - test
  - build
  - deploy

test:
  stage: test
  script:
    - echo "Testing the app"
    - docker-compose run app sh -c "python /app/manage.py test && flake8"

build:
  stage: build
  only:
    - develop
    - production
    - feature/gitlab_ci
  script:
    - echo "Building the app"
    - docker-compose build

deploy:
  stage: deploy
  only:
    - master
    - develop
    - feature/gitlab_ci
  script:
    - echo "Deploying the app"
    - docker-compose up --build -d

Это содержимое файла docker-compose.yml :

version: "3"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python /app/manage.py runserver 0.0.0.0:8000"
    environment:
      - DB_HOST=db
      - DB_NAME=app
      - DB_USER=postgres
      - DB_PASS=postgres
    depends_on:
      - db
  db:
    image: postgres:10-alpine
    environment:
      - POSTGRES_DB=app
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

Это содержимое файла entrypoint.sh :

#!/bin/bash

(cd .. && ./manage.py collectstatic --noinput)
# Migration files are commited to git. Makemigrations is not needed.
# ./manage.py makemigrations app_name
(cd .. && ./manage.py migrate)

Хотелось бы узнать, почему исчезает папка dist/ и как ее сохранить.

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Когда в вашем файле docker-compose.yml указано

volumes:
  - ./app:/app

, оно скрывает все, что ваш Dockerfile создает в каталоге /app, и заменяет его на все, что находится в вашей локальной системе.Если у вашего хоста нет ./app/frontend/dist, тогда ваш контейнер не будет иметь этот путь, независимо от того, что делает Dockerfile.

Я бы вообще рекомендовал просто полностью удалить этот блок volumes:.Он вводит неуклюжий путь живой разработки (где все ваши инструменты должны знать, что фактический сервис работает в Docker) и одновременно не является тем, что вы запускаете в разработке (вы хотите, чтобы изображение было автономным, а ненеобходимо скопировать заявку отдельно от картинки).

0 голосов
/ 03 июня 2019

Проблема не в файле Docker.Это проблема с вашей зависимостью.пожалуйста, проверьте файл package.json в корневой папке.

...