Parece que este é um problema conhecido , mas não é o suficiente para que as pessoas se importem!
- Existe uma maneira de adicionar apenas arquivos alterados para uma imagem do docker como uma nova camada - sem recorrer ao docker commit? é uma pergunta do StackOverflow que cobre o mesmo terreno.
- Parece que o comportamento que eu esperava funcionou com o driver de armazenamento de sobreposição, mas depois de algumas atualizações do sistema eu comecei a usar o overlay2, que copia todos os arquivos em uma camada e não apenas os modificados
- Embora uma solução seja revertida para overlay, parece ser bastante depreciada nesse ponto. Um método alternativo para criar camadas 'diff' é detalhado aqui
Acabei fazendo uma coisa simples mencionada em um dos comentários no relatório de erros :
#clean up any previous attempt...
docker rm -f uniquename 2> /dev/null
# now take your base container, mount the updated dir as /src
# then rsync from /src to the target dir - only updated files will
# actually be written, and we use --delete to ensure removed files are
# taken out...
docker run --name uniquename \
-v ~/repo/mycode:/src \
${REPO}/${IMAGE}:${BASE} \
rsync -ar --no-owner --no-group \
--exclude-from '/src/.dockerignore' --delete \
/src/ /app/
# we can commit that updated container with a tag
docker commit uniquename ${REPO}/${IMAGE}:${NEW_TAG}
Mais uma coisa - essa solução pareceu eliminar o CMD
existente, que fornecia o comando de inicialização padrão de contêineres. Então, depois de adicionar essa camada de diferenças, eu tinha outro Dockerfile para criar um contêiner da compilação 'diff' acima com o CMD
adicionado de volta.