编写docker file
docker build --build-arg flink_dist="$FLINK_DIST" -t "$REPO_URL/${IMAGE_NAME}" .
docker push $REPO_URL/kepler/${IMAGE_NAME}
Dockerfile详解
https://yeasy.gitbooks.io/docker_practice/image/build.html
构建docker镜像file应该尽可能精简,否则产生过多中间无用层会导致镜像变的臃肿,每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更
https://yeasy.gitbooks.io/docker_practice/image/commit.html
常见指令
USER
指定执行命令的用户,默认是以root执行,创建的文件都是root属主,可以多次改变属主
USER admin
ADD
将文件加入docker镜像,默认会进行解压
指定多个ARG参数
docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5 --build-arg number_of_replicas=2 --no-cache .
常见用法
多层镜像构建:
https://zhuanlan.zhihu.com/p/43319212
https://tonybai.com/2017/11/11/multi-stage-image-build-in-docker/
官网文档
https://docs.docker.com/engine/reference/builder/
Docker buildkit
我们使用docker 构建镜像通常有几种做法,第一种是在容器外先将二进制包构建好,然后再将包Add到镜像中,这样的好处是外面构建的tar包还可以留作其他用途,但是不好的地方是这样还依赖外围的打包的工具,其实Dockerfile中可以From一个maven的基础镜像,然后从基础镜像中直接build源码。
但是这样有个坏处是,每次build的时候都需要下载大量的依赖的第三方的jar,使得build的耗时大大加长。而docker buildkit
Makefile
我们也可以编写一个makefile来帮助项目的测试,构建和发布的管理
编写Makefile注意点
- Makefile只能使用tab来缩进,使用空格会报错
常见问题
无法Copy本地的其他绝对路径文件到镜像中
COPY /tmp/a.jar /opt/install
这种docker 命令无法生效,构建镜像时只能拷贝当前目录下的文件。(根据issue上的解释是出于安全的考虑)
https://stackoverflow.com/questions/47012495/docker-copy-from-ubuntu-absolute-path
https://github.com/moby/moby/issues/4592
关于什么是build context
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#understand-build-context