为什么我的容器继续构建同一层?

时间:2019-02-09 15:53:22

标签: node.js docker

下面的容器当前在第二次运行后失败。在尝试调试它时,我必须再次运行它。

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的理解是容器中的层应该缓存,并且仅在文件更改时才能重建?

我希望能对此提出建议。

2 个答案:

答案 0 :(得分:1)

Dockerfile中的每条指令都会生成一个图像层(有一些例外),并且在构建期间图像层将用作缓存。但是,一旦使一层无效,就必须重新构建所有后续层。

在您的示例中,如果COPY . .指令产生了差异,则下面的RUN apk ...指令也将无效,从而使其重新运行。

我建议先复制Alpine软件包,然后再复制到项目文件中,然后再进行npm安装。

答案 1 :(得分:1)

您是在调试时更改docker文件还是当前存在docker文件的目录中的其他任何文件?如果是,则COPY . .基本上也在docker映像内复制您的docker文件或应用程序文件,并且由于文件在每次构建时都会更改,因此将不会从缓存中使用此层以下的所有层,包括COPY . .。因此,只会从缓存中使用WORKDIR /usr/src/app

希望这会有所帮助。