Dockerising鹈鹕项目

问题描述 投票:0回答:1

我正在尝试将我的鹈鹕站点项目停靠。我创建了一个docker-compose.yml文件和一个Dockerfile。

但是,每次我尝试构建我的项目(docker-compose up)时,pip install和npm install都会出现以下错误:

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

所有的pelican makefile等都在src目录中。

我正在尝试将内容,src和pelican-plugins目录加载为卷,以便我可以在本地计算机上修改它们以供docker容器使用。

这是我的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中正确设置了我的卷目录...

提前致谢!

docker docker-compose dockerfile pelican
1个回答
1
投票

您的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'

每个步骤中只有十六进制数的最后一行实际上是一个有效的图像ID,它是运行每个步骤的最终结果,然后您可以:

% 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。我通常发现在我开发时本地运行pythonnpm等更容易,而不是编写和调试这个50行YAML文件并运行sudo docker-compose up

© www.soinside.com 2019 - 2024. All rights reserved.