我有一个多阶段Dockerfile。在第一阶段,来自github回购的git clone
。在后面的阶段,我做其他的事情,如pip
等,并使用第1阶段的文件。我只想禁用第一阶段的缓存。
看起来docker build --target stage1 --no-cache
不符合我的要求。
有没有办法只禁用某个阶段?
我的Dockerfile如下所示:
FROM yijian/git-alpine
WORKDIR /tmp
RUN git clone https://github.com/abc/abc.git
FROM python:3.5.3-slim
RUN mkdir /app
ADD requirements.txt /app
ADD pip/pip.conf /root/.pip/pip.conf
WORKDIR /app
RUN pip3 install --upgrade pip && \
pip3 install pbr && \
pip3 install -r requirements.txt
ADD server.py /app
ADD docker/start.sh /app
RUN chmod a+x /app/start.sh
COPY --from=0 /tmp/abc/directory /usr/local/lib/python3.5/site-packages/abc/directory
EXPOSE 9092
ENTRYPOINT ["./start.sh"]
答案 0 :(得分:0)
我不相信单个Dockerfile可以为特定状态禁用缓存。这可能是一个很好的功能请求,但我宁愿将其视为文件中的声明性语句而不是命令行。
根据Docker的参考网站: https://docs.docker.com/engine/reference/commandline/build/#usage
“--target”标志允许您从Dockerfile中选择目标阶段,这意味着它只会运行Dockerfile的那一部分。我希望--no-cache标志可以与这个标志一起使用,但是我不希望Dockerfile的其他部分运行。
我相信你想要发生的事情会占用多个命令,这可能会破坏多级Dockerfile的目的。
这需要更多的工作,但根据你想要缓存的内容,你可以包括一个脚本,比如bash或powershell,它们可以实现这个目标。
另一个选项(取决于您的需要)可能是使用一个单独的Docker容器来缓存您需要的内容。例如,我创建了一个CI构建,它使用仅导入依赖项的Dockerfile,然后我的主构建发生在引用第一个容器的容器中。我已经使用“dotnet restore”命令完成了这项操作,因此预先加载了依赖项,并使用“npm install”完成了此操作。此方法适用于任何允许您指定源的包管理工具。所以你有一个project.json,你可以提取公共依赖项并将其命名为cache.package.json,然后构建一个已经为你完成大量下载的基本映像,然后理想情况下当你在更频繁的时候再次运行它构建它需要减少。利用Docker提供的分层方法!
答案 1 :(得分:0)
如果您较早的阶段更改的频率比较晚的阶段更改的频率高,则可能需要考虑逆转阶段的顺序。
阶段1.使用pip设置环境(可能在虚拟环境中)。
第2阶段。从上一阶段复制虚拟环境的环境文件,然后执行git clone。
只要您的第1阶段不需要更改缓存,就可以在那里使用缓存,并且只有git clone部分会被更新。