Докеринг пеликан проект - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь докеризировать мой проект сайта пеликана. Я создал docker-compose.yml файл и Dockerfile .

Однако, каждый раз, когда я пытаюсь построить свой проект (docker-compose up), я получаю следующие ошибки как при установке pip, так и при установке npm:

npm WARN saveError ENOENT: no such file or directory, open '/src/package.json'
...
Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'

Структура каталогов проекта выглядит следующим образом:

 - **Dockerfile**
 - **docker-compose.yml**
 - content/ 
 - pelican-plugins/ 
 - src/
   - Themes/
   - Pelican config files
   - requirements.txt
   - gulpfile.js
   - package.js

Все make-файлы пеликанов и т. Д. Находятся в каталоге src.

Я пытаюсь загрузить каталоги content, src и pelican-plugins как тома, чтобы я мог изменить их на своем локальном компьютере для использования в док-контейнере.

Вот мой Dockerfile :

FROM python:3

WORKDIR /src
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential

# Install Node.js 8 and npm 5
RUN apt-get update
RUN apt-get -qq update
RUN apt-get install -y build-essential
RUN apt-get install -y curl
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash
RUN apt-get install -y nodejs

# Set the locale
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8

RUN npm install
RUN python -m pip install --upgrade pip

RUN pip install -r requirements.txt

ENV SRV_DIR=/src
RUN chmod +x $SRV_DIR

RUN make clean
VOLUME /src/output
RUN make devserver
RUN gulp

А вот мой docker-compose.yml файл:

version: '3'
services:
  web:
    build: .
    ports:
    - "80:80"
    volumes:
    - ./content:/content
    - ./src:/src
    - ./pelican-plugins:/pelican-plugins
volumes:
  logvolume01: {}

Похоже, я правильно настроил каталоги томов в dockerfiles ...

Заранее спасибо!

1 Ответ

1 голос
/ 16 апреля 2019

Ваш Dockerfile вообще не COPY (или ADD) файлов, поэтому каталог /src пуст.

Вы можете проверить это сами. Когда вы запустите docker build, он напечатает вывод как:

Step 13/22 : ENV LC_ALL en_US.UTF-8
 ---> Running in 3ab80c3741f8
Removing intermediate container 3ab80c3741f8
 ---> d240226b6600
Step 14/22 : RUN npm install
 ---> Running in 1d31955d5b28
npm WARN saveError ENOENT: no such file or directory, open '/src/package.json'

Последняя строка в каждом шаге с шестнадцатеричным числом на самом деле является действительным идентификатором изображения, который является окончательным результатом выполнения каждого шага, и затем вы можете:

% docker run --rm -it d240226b6600 sh
# pwd
/src
# ls

Чтобы исправить это, вам нужна строка в Dockerfile, например

COPY . .

Возможно, вам также потребуется перейти в подкаталог src, чтобы запустить npm install и т. П., Как показано в вашей структуре каталогов. Это может выглядеть так:

WORKDIR /src
COPY . .
# Either put "cd" into the command itself
# (Each RUN command starts a fresh container at the current WORKDIR)
RUN cd src && npm install
# Or change WORKDIRs
WORKDIR /src/src
RUN pip install -r requirements.txt
WORKDIR /src

Помните, что все в Dockerfile происходит до того, как будет учтена любая настройка в docker-compose.yml за пределами блока build:. Переменные среды, подключения томов и параметры сети для контейнера не влияют на последовательность сборки образа.

С точки зрения стиля Dockerfile ваше объявление VOLUME будет иметь некоторые неожиданные неожиданные побочные эффекты и, вероятно, не нужно; Я бы удалил это. В вашем Dockerfile также отсутствует CMD, который должен запустить контейнер. Вам также следует объединить RUN apt-get update && apt-get install в отдельные команды; как работает кэширование на уровне Docker и как работают репозитории Debian, очень легко получить индекс кэшированного пакета, который называет файлы недели назад, которые больше не существуют.

Хотя описываемая вами установка довольно популярна, она также по существу скрывает все, что Dockerfile делает с вашим локальным исходным деревом. Например, npm install, который вы здесь описываете, будет неактивным, поскольку при монтировании тома будет скрываться /src/src/node_modules. Обычно мне проще запускать python, npm, и т. Д. локально во время разработки, а не писать и отлаживать этот 50-строчный файл YAML и запускать sudo docker-compose up.

...