Если ваша система CI позволяет вам выполнить несколько шагов docker build
, вы можете разделить это на два файла Docker.
# Dockerfile.dependencies
# docker build -f Dockerfile.dependencies -t me/dependencies .
FROM node:10.13
...
RUN npm install
# Dockerfile
# docker build -t me/application .
FROM me/dependencies:latest AS build
COPY ./src ./src
RUN ./node_modules/.bin/babel ./src/ -d ./dist/ --copy-files
FROM node:10.13-alpine
...
CMD ["node", "app.js"]
Если вы сделаете это, то вы можете удалить неиспользуемые изображения после каждой сборки:
docker image prune
Самая последняя сборка изображения зависимостей будет иметь метку, поэтому она не будет "зависать" и не будет отображаться в списке изображений. При каждой сборке ее метка будет «взята из» предыдущей сборки (если она изменилась), поэтому эта последовательность будет очищать предыдущие сборки. Это также удалит образы «сборки», хотя, как вы заметили, если что-нибудь изменилось, чтобы вызвать сборку, оно, вероятно, будет находиться в дереве src
, и поэтому принудительное перестроение там разумно.
В этом конкретном случае уместно просто использовать тег latest
. Если у окончательно созданных изображений есть еще несколько уникальных тегов (скажем, на основе номера версии или временной метки), и они накапливаются, вам может потребоваться более творческая фильтрация этого списка изображений, чтобы очистить их.