我正在尝试将我的鹈鹕站点项目停靠。我创建了一个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中正确设置了我的卷目录...
提前致谢!
您的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
。我通常发现在我开发时本地运行python
,npm
等更容易,而不是编写和调试这个50行YAML文件并运行sudo docker-compose up
。