1、Dockerfile 介绍
如果说容器就是“小板房”,镜像就是“样板间”。那么,要造出这个“样板间”,就必然要有一个“施工图纸”,由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。
比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤,最后就会创建出一个新的镜像出来。
2、编写java项目对应的Dockerfile
# 使用 OpenJDK 8 作为基础镜像
FROM openjdk:8-jdk-alpine
# 作者信息
LABEL maintainer="flgb"
# 设置环境变量
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
JAVA_OPTS="-Xms2048m -Xmx2048m -Dspring.profiles.active=prod -Dserver.port=6088"\
PORT=6088
# spring-boot-admin.jar相对于Dockerfile的路径
COPY /spring-boot-admin.jar /spring-admin.jar
# sh shell -c 执行后面命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /spring-admin.jar"]
#通过 EXPOSE 命令暴露外部访问容器端口
EXPOSE $PORT
注意点
ADD 和COPY 的区别
COPY 和 ADD 都是用于将文件从主机复制到 Docker 容器内部的命令,但它们之间有一些区别:
- COPY 命令只能复制本地主机上的文件或目录到容器内部,不能从 URL 或者其他网络资源复制文件。而 ADD 命令可以从本地主机、URL
或者其他网络资源复制文件。 - ADD 命令支持自动解压缩 tar 类型的文件(如压缩文件
.tar、.tar.gz、.tar.bz2、.tar.xz),并将解压后的内容复制到容器内。而 COPY
命令则只是简单地复制文件,不会自动解压缩。 - 由于 ADD 命令的功能更多,因此在复制文件时,建议优先使用 COPY 命令,除非需要 ADD 的特殊功能。
CMD 和 ENTRYPOINT的区别
CMD 指令:
- CMD 用于指定容器启动时要执行的命令。
- 可以有多个 CMD 指令,但只有最后一个生效。
- 如果 Dockerfile 中没有 CMD 指令,则默认会执行容器启动时所用的镜像的 CMD 命令。
- CMD 指令可以被 Docker run 命令中的参数覆盖。
ENTRYPOINT 指令:
-
ENTRYPOINT 用于指定容器启动时要执行的可执行文件或脚本。
只需要运行该镜像,就会自动执行 ENTRYPOINT 指定的命令 -
如果 Dockerfile 中存在多个 ENTRYPOINT 指令,则只有最后一个生效。
-
在运行容器时,可以通过在 docker run 命令中指定参数来覆盖 ENTRYPOINT 中的内容。
-
如果 Dockerfile 中同时存在 ENTRYPOINT 和 CMD 指令,则 CMD 的内容会被作为参数传递给 ENTRYPOINT
所指定的可执行文件或脚本。
3、构建java项目镜像
docker build [OPTIONS] PATH | URL | -
其中,PATH 可以是本地文件系统上 Dockerfile 文件所在的路径,也可以是 URL,或者是 -(表示使用标准输入)。OPTIONS 是一些可选参数,常用的参数包括:
- -t, --tag:为镜像设置一个标签,格式为 :。例如,-t myimage:1.0。
- -f, --file:指定要使用的 Dockerfile 文件的路径。如果不指定,默认为当前目录下的 Dockerfile 文件。
- 其他选项包括 --build-arg、–pull、–no-cache 等,可以根据需要进行设置。
例如,如果 Dockerfile 文件位于当前目录下,可以使用以下命令构建镜像并设置标签:
docker build -t spring-boot:1.0 .
上传dockerfile和spring-boot-admin jar到对应路径/data/java/spring-boot下
构建镜像
docker build -t spring-boot:1.0
Build的路径问题
经常会遇到如下报错:
COPY failed: stat xxxx: no such file or directory
1、Dockerfile 文件查找不到
如果dockerfile不在当前目录,则需要指定dockerfile 目录构建
docker build -f "/data/java/spring-boot/Dockerfile" -t spring-boot:1.0
2、Copy /spring-boot-admin.jar文件找不到的问题
COPY 命令中指定的源路径应该是相对于 Dockerfile 的路径。
- 如果 spring-boot-admin.jar 文件位于与 Dockerfile 同级的目录下,应该将 COPY 命令修改为:
COPY spring-boot-admin.jar /spring-admin.jar
- 如果 spring-boot-admin.jar 文件位于 Dockerfile 的上级目录中,可以使用 … 来指定父级目录
COPY ../spring-boot-admin.jar /spring-admin.jar
- PS:一开始把COPY 的路径设置成了/data/java/spring-boot/spring-boot-admin.jar一直找不到,报错:
failed to walk /var/lib/docker/tmp/buildkit-mount2576932656/data/java/spring-boot: lstat /var/lib/docker/tmp/buildkit-mount2576932656/data/java/spring-boot: no such file or directory
4、生成容器
- 执行命令
docker run -p 6088:6088 --name springboot --restart always \
> -d spring-boot:1.0:1.0
查看项目启动日志,启动成功