我正在使用CI / CD系统从git存储库中自动构建Docker映像。图片的图片标签对应于相应git commit的短(即8个字符)哈希,例如myimage:123456ab
。
该存储库包含源代码,这些源代码打包在Docker映像中,并且诸如文档和部署配置之类的内容被使用.dockerignore
文件(类似于.gitignore
)排除在外。
虽然该过程通常可以正常工作,但它会导致重建和重新部署完全相同的Docker映像,因为仅对不属于该映像的文件(例如存储库README)进行了更改。
仅使用shell(在本例中为bash),git和标准* nix工具,可以获取更改文件的最新提交的简短哈希,而该提交被不忽略了.dockerignore
文件?这也应涵盖删除不可忽略的文件。
答案 0 :(得分:2)
您可以结合使用git log
和git show
来做到这一点。
以下脚本将向后浏览修订历史记录,并发现第一个提交具有.dockerignore
不会忽略的更改
for commit in $(git log --pretty=%H)
do
# Get the changed file names for the commit.
# Use `sed 1d` to remove the first line, which is the commit description
files=$(git show $commit --oneline --name-only | sed 1d)
if docker-check-ignore $files
then
echo $commit
exit 0
fi
done
exit 1
然后您可以将docker-check-ignore
定义为如下脚本:
#!/bin/sh
DIR=$(mktemp -d)
pushd $DIR
# Set up a temporary git repository so we can use
# git check-ignore with .dockerignore
git init
popd
cp .dockerignore $DIR/.gitignore
pushd $DIR
git check-ignore $@
# Store the error code
ERROR=$?
popd
rm -rf $DIR
exit $ERROR
我将减少文件系统操作的次数,而不是为每次提交创建/删除目录。
答案 1 :(得分:1)
$entry->vendors