下面的容器当前在第二次运行后失败。在尝试调试它时,我必须再次运行它。
FROM node:10-alpine
# Create app directory
WORKDIR /usr/src/app
# Copy app
COPY . .
# USER root
# install packages
RUN apk --no-cache --virtual build-dependencies add \
git \
python \
make \
g++ \
&& npm config set user 0 \
&& npm config set unsafe-perm true \
&& npm i -g wait-on concurrently truffle@4.1.15\
&& npm install \
&& apk del build-dependencies
RUN truffle compile --all // FAILS HERE
# Expose the right ports, the commands below are irrelevant when using a docker-compose file.
EXPOSE 3000
CMD ["npm", "run", "server"]
每当我重建容器时,它都会从第一个RUN重新开始,这会使过程变长。
我对docker的理解是容器中的层应该缓存,并且仅在文件更改时才能重建?
我希望能对此提出建议。
答案 0 :(得分:1)
Dockerfile中的每条指令都会生成一个图像层(有一些例外),并且在构建期间图像层将用作缓存。但是,一旦使一层无效,就必须重新构建所有后续层。
在您的示例中,如果COPY . .
指令产生了差异,则下面的RUN apk ...
指令也将无效,从而使其重新运行。
我建议先复制Alpine软件包,然后再复制到项目文件中,然后再进行npm安装。
答案 1 :(得分:1)
您是在调试时更改docker文件还是当前存在docker文件的目录中的其他任何文件?如果是,则COPY . .
基本上也在docker映像内复制您的docker文件或应用程序文件,并且由于文件在每次构建时都会更改,因此将不会从缓存中使用此层以下的所有层,包括COPY . .
。因此,只会从缓存中使用WORKDIR /usr/src/app
。
希望这会有所帮助。