我已经在某些项目中使用Git几年了,但是我是Docker的新手。
今天,我想找到一个工作流程,使我可以为团队项目正确使用Git和Docker。
如今,在没有Docker的情况下,我们使用命名分支进行开发。功能完成后,我们将其拉向“主”。当我们要投入生产时,我们将创建主版本的preprod分支(例如preprod-2.3.0)进行测试。如果有更正,我们将推入当前的preprod并在master上合并。当preprod分支准备就绪(自动和手动测试)时,我们将创建一个与preprod具有相同版本的prod分支(例如:prod-2.3.0)。如果我们在prod中有紧急更正,则在继续正常过程(test + prod-> prod-2.3.1)之前,我们将从preprod创建一个新分支(例如:preprod-2.3.1)。
使用Docker进行开发时,我们要创建名为$ PROJECT_NAME / $ IMAGE_NAME:dev的本地映像(项目/ api:dev,项目/ db:dev,项目/ webui:dev ...)。 每次我们重建本地项目时,我们都会丢失开发映像,但是否则它将变得难以管理。 为了进行测试,我们还将使用dev的版本。
但是我对生产启动有疑问。
几个博客/文章在将代码推送到git之后创建docker映像,执行单元测试并最终保存有效的映像。此后,有效映像将被命名为“:latest”并用于生产实施。 在我们的案例中,我们可以使用该系统使用$ VERSION和最新标签来保存prod- $ VERSION分支的有效图像,以对图像进行版本控制。
我对这个系统的问题是,我觉得我正在失去Docker的好处之一。当我在本地执行测试时,我将测试代码以及开发映像。此图像应在CI和生产中使用。在此期间,CI会针对主映像,预生成映像以及最终生成的映像重新冻结映像几次,然后再进行冻结。 如果同时更改集线器映像的版本(例如nginx:latest,node:lastest),则可能会导致问题。 参见:https://nickjanetakis.com/blog/docker-tip-18-please-pin-your-docker-image-versions
另一种解决方案是使用preprod标签将图像直接保存在preprod中。经过测试后,我添加了标签“ prod”和“最新”。但是,如果在创建preprod期间进行了更新,我有时会浪费时间来理解为什么它在dev中而不在prod中起作用。但这至少避免了预生产和生产之间的问题。
我也找不到在nodejs锁(package.json / package-lock.json)处的系统,该系统允许运行npm build / npm ci(下载软件包的最新版本并更新指定哪个锁文件)精确使用/重建了与锁定文件相同的体系结构)。 参见:https://docs.npmjs.com/files/package-lock.json
您是否有一个系统/想法来确保映像与前一个映像(作为锁)相同? 还是允许您在团队中工作的工作流,而直接从开发人员(带有版本)中删除图像?
答案 0 :(得分:0)
我终于用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 build(preprod,prod ...),或仅使用“ docker build --file Dockerfile-lock。 “
#!/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