Dockerising 鹈鹕项目

Dockerising pelican project

我正在尝试 docker 完善我的 Pelican 网站项目。我创建了一个 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 文件根本没有 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

要解决此问题,您需要在 Docker 文件中添加一行

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 中的所有内容都发生在 build: 块之外的 docker-compose.yml 中的任何设置甚至被考虑之前。容器的环境变量、卷安装和网络选项对映像构建顺序没有影响。

就 Docker 文件样式而言,您的 VOLUME 声明将产生一些棘手的意外副作用,并且可能是不必要的;我会删除它。您的 Docker 文件还缺少容器应 运行 的 CMD。您还应该将 RUN apt-get update && apt-get install 组合成单个命令; Docker 层缓存的工作方式和 Debian 存储库的工作方式,很容易得到一个缓存包索引,该索引命名一周前不再存在的文件。

虽然您所描述的设置相当流行,但它实际上也隐藏了一切 Docker文件对您的本地源代码树所做的事情。例如,您在此处描述的 npm install 将是空操作,因为卷装载将隐藏 /src/src/node_modules。我通常发现在开发时在本地 运行 pythonnpm 比编写和调试这 50 个更容易-行 YAML 文件和 运行 sudo docker-compose up.