Git 和 Docker 团队工作流程
Git and Docker team workflow
我已经在某些项目中使用 Git 几年了,但我是 Docker 的新手。
今天,我想找到一个工作流程,让我可以在我的团队项目中正确使用 Git 和 Docker。
今天
今天,在没有 Docker 的情况下,我们使用命名分支进行开发。当功能最终确定时,我们将它们拉向“master”。当我们想要投入生产时,我们会创建一个版本化的 preprod 分支(例如 preprod-2.3.0)用于测试的 master。如果我们有更正,我们将推送当前的 preprod 并在 master 上合并。当 preprod 分支准备就绪(自动和手动测试)时,我们创建一个与 preprod 版本相同的 prod 分支(例如:prod-2.3.0)。如果我们在 prod 中有紧急更正,我们会从 preprod(例如:preprod-2.3.1)创建一个新分支,然后再继续正常过程(test + prod -> prod-2.3.1)。
与Docker
使用Docker,为了开发,我们要创建名为$PROJECT_NAME/$IMAGE_NAME:dev (project/api:dev, project/db:dev, project/webui:dev...)。
每次我们重建本地项目时,我们都会丢失开发图像,否则就会变得难以管理。
为了测试,我们还将使用 dev.
的版本
但我有问题的地方是生产发布。
在git上推送代码后,几个blogs/articles创建docker图像,执行单元测试并最终保存有效图像。此后,一个有效的图像将被命名为“:latest”并用于生产实施。
在我们的例子中,我们可以使用这个系统来保存 prod-$VERSION 分支的有效图像,使用 $VERSION 和 latest 标签来对图像进行版本控制。
问题
我对这个系统的问题是,我觉得我正在失去 Docker 的一项好处。当我在本地执行测试时,我会测试代码以及开发映像。 CI 和生产中应该使用此图像。在那里,图像由 CI 为 master、preprod 和 finally prod 重新创建几次,然后才被冻结。
如果 hub 图像的版本(例如 nginx:latest、node:lastest)在此期间发生了变化,这可能会导致问题。
参见:https://nickjanetakis.com/blog/docker-tip-18-please-pin-your-docker-image-versions
另一种解决方案是使用 preprod 标签将图像直接保存在 preprod 中。经过测试后,我添加了标签“prod”和“latest”。但是,如果在创建 preprod 期间发生更新,我有时会浪费时间来理解为什么它在 dev 而不是 prod 中工作。但至少避免了预生产和生产之间的问题。
我也找不到允许 运行 npm build/npm [=56= 的 nodejs 锁(包。json/package-lock.json)的系统](下载最新版本的包并更新锁定文件,具体ci哪个版本之前ci确实used/rebuilt与锁定文件具有相同的体系结构)。
参见:https://docs.npmjs.com/files/package-lock.json
问题
你有system/idea来确保图像与之前的图像相同(作为锁)吗?
或者允许您在团队中工作的工作流程,同时直接从开发人员(有版本)删除图像?
我终于用 bash 别名或一两个脚本制作了自己的锁系统 :
bash别名(添加dockerci命令并改进docker构建):
dockeralias() {
args=$@
args_cat=
shift
args_without_cat_files_and_final=""
dockerfile="Dockerfile"
while test $# -gt 1; do
case "" in
-f|--file)
shift
dockerfile=
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
args_without_cat_files_and_final="$args_without_cat_files_and_final "
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替换docker build in dev
#!/bin/bash
docker build "$@"
dockerfile="Dockerfile"
while test $# -gt 0; do
case "" in
-f|--file)
shift
dockerfile=
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替换docker内置CI(预生产,生产...)或只需使用“docker build --file Dockerfile-lock .”
#!/bin/bash
args=""
dockerfile="Dockerfile"
while test $# -gt 1; do
case "" in
-f|--file)
shift
dockerfile=
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
args="$newargs "
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-lock
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
我已经在某些项目中使用 Git 几年了,但我是 Docker 的新手。
今天,我想找到一个工作流程,让我可以在我的团队项目中正确使用 Git 和 Docker。
今天
今天,在没有 Docker 的情况下,我们使用命名分支进行开发。当功能最终确定时,我们将它们拉向“master”。当我们想要投入生产时,我们会创建一个版本化的 preprod 分支(例如 preprod-2.3.0)用于测试的 master。如果我们有更正,我们将推送当前的 preprod 并在 master 上合并。当 preprod 分支准备就绪(自动和手动测试)时,我们创建一个与 preprod 版本相同的 prod 分支(例如:prod-2.3.0)。如果我们在 prod 中有紧急更正,我们会从 preprod(例如:preprod-2.3.1)创建一个新分支,然后再继续正常过程(test + prod -> prod-2.3.1)。
与Docker
使用Docker,为了开发,我们要创建名为$PROJECT_NAME/$IMAGE_NAME:dev (project/api:dev, project/db:dev, project/webui:dev...)。 每次我们重建本地项目时,我们都会丢失开发图像,否则就会变得难以管理。 为了测试,我们还将使用 dev.
的版本但我有问题的地方是生产发布。
在git上推送代码后,几个blogs/articles创建docker图像,执行单元测试并最终保存有效图像。此后,一个有效的图像将被命名为“:latest”并用于生产实施。 在我们的例子中,我们可以使用这个系统来保存 prod-$VERSION 分支的有效图像,使用 $VERSION 和 latest 标签来对图像进行版本控制。
问题
我对这个系统的问题是,我觉得我正在失去 Docker 的一项好处。当我在本地执行测试时,我会测试代码以及开发映像。 CI 和生产中应该使用此图像。在那里,图像由 CI 为 master、preprod 和 finally prod 重新创建几次,然后才被冻结。 如果 hub 图像的版本(例如 nginx:latest、node:lastest)在此期间发生了变化,这可能会导致问题。 参见:https://nickjanetakis.com/blog/docker-tip-18-please-pin-your-docker-image-versions
另一种解决方案是使用 preprod 标签将图像直接保存在 preprod 中。经过测试后,我添加了标签“prod”和“latest”。但是,如果在创建 preprod 期间发生更新,我有时会浪费时间来理解为什么它在 dev 而不是 prod 中工作。但至少避免了预生产和生产之间的问题。
我也找不到允许 运行 npm build/npm [=56= 的 nodejs 锁(包。json/package-lock.json)的系统](下载最新版本的包并更新锁定文件,具体ci哪个版本之前ci确实used/rebuilt与锁定文件具有相同的体系结构)。 参见:https://docs.npmjs.com/files/package-lock.json
问题
你有system/idea来确保图像与之前的图像相同(作为锁)吗? 或者允许您在团队中工作的工作流程,同时直接从开发人员(有版本)删除图像?
我终于用 bash 别名或一两个脚本制作了自己的锁系统 :
bash别名(添加dockerci命令并改进docker构建):
dockeralias() {
args=$@
args_cat=
shift
args_without_cat_files_and_final=""
dockerfile="Dockerfile"
while test $# -gt 1; do
case "" in
-f|--file)
shift
dockerfile=
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
args_without_cat_files_and_final="$args_without_cat_files_and_final "
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替换docker build in dev
#!/bin/bash
docker build "$@"
dockerfile="Dockerfile"
while test $# -gt 0; do
case "" in
-f|--file)
shift
dockerfile=
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替换docker内置CI(预生产,生产...)或只需使用“docker build --file Dockerfile-lock .”
#!/bin/bash
args=""
dockerfile="Dockerfile"
while test $# -gt 1; do
case "" in
-f|--file)
shift
dockerfile=
shift
;;
-f=*)
dockerfile=${1#"-f="}
shift
;;
--file=*)
dockerfile=${1#"--file="}
shift
;;
*)
args="$newargs "
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-lock
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