我有一个自我管理的GitLab实例,我的一个项目有一个包含3个子目录的文件夹,这3个子目录有一个Dockerfile
我所有的Dockerfile都有一个grep
命令从位于根目录下的CHANGELOG.md
获取最新版本。
我尝试了这样的东西回去2步,但它不工作(grep: ../../CHANGELOG。md:没有这样的文件或目录)
Dockerfile:
grep -m 1 '^## v.*$' "../../CHANGELOG.md"
例子:
链接:
https://mygitlab/project/images/myproject
回购内容:
.
├──build
├──image1
├──image2
├──image3
├──CHANGELOG.md
gitlab-ci.yaml
script:
- docker build --network host -t $VAL_IM ./build/image1
- docker push $VAL_IM
问题发生在我构建图像时。
docker build——network host -t $VAL_IM ./build/image1
这里,您已经将构建上下文设置为./build/image1
——构建不能访问构建上下文之外的目录或文件。还请记住,如果您在docker构建中使用RUN
,它只能访问已经在容器内复制的文件(并且如前所述,您不能在构建上下文之外复制文件!),因此这并不完全像所说的那样有意义。
如果你使用这种版本控制策略,你可能想要做的是在调用docker build
之前执行grep命令作为GitLab作业的一部分,并将版本作为构建参数传入。
在Dockerfile中添加ARG
:
FROM # ...
ARG version
# now you can use the version in the build... eg:
LABEL com.example.version="$version"
RUN echo version is "$version"
那么你的GitLab作业可能是这样的:
script:
- version=$(grep -m 1 '^## v.*$' "./CHANGELOG.md")
- docker build --build-arg version="${version}" --network host -t $VAL_IM ./build/image1
- docker push $VAL_IM