Ваш 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
.