Git和Docker团队工作流程



我已经为一些项目使用Git几年了,但我是Docker的新手。

今天,我想找到一个工作流程,让我可以在团队项目中正确使用Git和Docker。

今天

今天,在没有Docker的情况下,我们使用命名分支进行开发。当功能最终确定时,我们将它们拉向";"大师";。当我们想投入生产时,我们会创建一个版本化的预印本分支(例如预印本-2.3.0)用于测试。如果我们有更正,我们推送当前预印本并在master上合并。当预印本分支准备就绪(自动和手动测试)时,我们会创建一个与预印本版本相同的产品分支(例如:prod-2.30)。如果我们在产品中有紧急更正,我们会在继续正常过程(测试+产品->产品-2.3.1)之前,从预印本创建一个新分支。

使用Docker

使用Docker,为了进行开发,我们希望创建名为$PROJECT_NAME/$IMAGE_NAME:dev的本地映像(PROJECT/api:dev、PROJECT/db:dev和PROJECT/webui:dev…)。每次我们重建当地项目时,我们都会失去发展形象,但否则就会变得难以管理。为了进行测试,我们还将使用dev.的版本

但我有问题的地方是生产发布会。

一些博客/文章在git上推送代码后创建docker图像,执行单元测试,并最终保存有效图像。此后,有效图像将被命名为":最新的";并用于生产实施。在我们的例子中,我们可以使用这个系统来保存prod-$VERSION分支的有效图像,使用$VERSION和最新的标签来对图像进行版本化。

问题

我对这个系统的问题是,我觉得我正在失去Docker的一个好处。当我在本地执行测试时,我测试代码,但也测试开发镜像。应该在CI和生产中使用此图像。在那里,CI会多次重新创建图像,用于master、preprod,最后在冻结之前进行prod。如果集线器映像的版本(例如nginx:latest、node:lastest)在此期间发生了更改,这可能会导致问题。请参阅:https://nickjanetakis.com/blog/docker-tip-18-please-pin-your-docker-image-versions

另一种解决方案是将图像直接保存在带有预印本标签的预印本中。在测试之后,我添加标签";"戳";以及";最新";。但是,如果在创建预印本的过程中发生更新,我有时会浪费时间来理解为什么它在开发中有效,而在生产中无效。但至少它避免了预生产和生产之间的问题。

我在nodejs锁(package.json/package-lock.json)上也找不到允许运行npm-build/npm-ci的系统(下载最新版本的包并更新锁文件,指定哪个版本与锁文件使用/重建了相同的架构)。请参阅:https://docs.npmjs.com/files/package-lock.json

问题

你有一个系统/想法来确保图像与前一个相同(作为锁)吗?或者一个允许您在团队中工作,同时直接从开发人员(带版本)中删除图像的工作流?

我终于用bash别名或一两个脚本制作了自己的锁系统:

bash别名(添加docker ci命令并改进docker构建):

dockeralias() {
args=$@
args_cat=$1
shift
args_without_cat_files_and_final=""    
dockerfile="Dockerfile"
while test $# -gt 1; do
case "$1" in
-f|--file)
shift
dockerfile=$1
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
args_without_cat_files_and_final="$args_without_cat_files_and_final $1 "
shift
;;
esac
done
lockfile="$dockerfile-lock"
args_final=$@
if [ $args_cat == "ci" ]; then
echo "Build from $lockfile"
command docker build $args_without_cat_files_and_final --file $lockfile $args_final
return
fi
if ! command docker $args; then
return
fi
if [ $args_cat == "build" ]; then
echo "Make $lockfile from $dockerfile"
cp $dockerfile $lockfile
grep ^FROM $lockfile | while read -r line ; do
image=`echo $line | cut -d" " -f2`
digest=`command docker inspect --format='{{index .RepoDigests 0}}' $image`
echo "$image > $digest"
sed -i -e "s/$image/$digest/g" $lockfile
done
fi
}
alias docker=dockeralias

或者docker build.sh替换dev 中的docker build

#!/bin/bash
docker build "$@"
dockerfile="Dockerfile"
while test $# -gt 0; do
case "$1" in
-f|--file)
shift
dockerfile=$1
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
shift
;;
esac
done
lockfile="$dockerfile-lock"
echo "Make $lockfile from $dockerfile"
cp $dockerfile $lockfile
grep ^FROM $lockfile | while read -r line ; do
image=`echo $line | cut -d" " -f2`
digest=`docker inspect --format='{{index .RepoDigests 0}}' $image`
echo "$image > $digest"
sed -i -e "s/$image/$digest/g" $lockfile
done

docker ci.sh来替换ci中的docker构建(预印本、产品…),或者只使用">docker构建--文件Dockerfile锁定。">

#!/bin/bash
args=""
dockerfile="Dockerfile"
while test $# -gt 1; do
case "$1" in
-f|--file)
shift
dockerfile=$1
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
args="$newargs $1 "
shift
;;
esac
done
lockfile="$dockerfile-lock"
echo "Build from $lockfile"
docker build $args --file $lockfile "$@"

这里有一个脚本的例子:

来自Dockerfile

FROM node:latest
EXPOSE 8080
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD npm start

创建Dockerfile锁

FROM node@sha256:d2180576a96698b0c7f0b00474c48f67a494333d9ecb57c675700395aeeb2c35
EXPOSE 8080
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD npm start

我还在docker论坛上写了一个功能请求:https://forums.docker.com/t/dockerfile-lock/67031

最新更新