【笔记】Dockerfile自定义镜像

前言

Dockerfile自定义镜像学习笔记
Dockerfile是一个文本文件,用于存放自动化部署镜像的脚本代码

镜像结构

  • 镜像:将应用程序及其需要的系统函数库、环境、配置、依赖打包而成的
  • 基础镜像(BaseImage):应用依赖的系统函数库、环境、配置、文件等
  • 入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
  • 层(Layer):在基础镜像基础上添加安装包、依赖、配置等时,每次操作都形成一层

定义Dockerfile

指定基础镜像

<system>:操作系统名
<version>:操作系统版本

Dockerfile
1
FROM <system>:<version>

设置环境变量

<key>:环境变量键
<value>:环境变量值

Dockerfile
1
ENV <key> <value>

拷贝文件到镜像内

<file_local>:本地文件
<src_image>:镜像内的目录

Dockerfile
1
COPY <file_local> <src_image>

镜像内执行命令

<shell>:Shell命令

Dockerfile
1
RUN <shell>

指定向外暴露的端口号

<port>:端口号

Dockerfile
1
EXPOSE <port>

启动容器时执行的主程序

  • 在启动容器时指定启动命令时(docker run 镜像名 命令不会被覆盖
Dockerfile
1
EXTRYPONIT java -jar xxx.jar
  • 在启动容器时指定启动命令时(docker run 镜像名 命令被覆盖
Dockerfile
1
CMD ["java", "-jar", "xxx.jar"]
  • 组合使用,通过EXTRYPONIT指定主程序,通过CMD指定参数
Dockerfile
1
2
EXTRYPONIT java -jar xxx.jar
CMD ["--version"]

Java项目Dockerfile案例

java:8-alpine:包含了操作系统和jdk8环境的基础镜像

Dockerfile
1
2
3
4
FROM java:8-alpine
COPY ./app.jar /app.jar
EXPORT 8080
ENTRYPOINT java -jar /app.jar

通过Dockerfile构建镜像

<image_name>:<version>:镜像名和版本号
<src_dockerfile>:Dockerfile所在的目录,如果是当前目录就指定.

1
docker build -t <image_name>:<version> <src_dockerfile>

Dockerfile传递参数

Dockerfile中定义参数占位符

  • 通过${变量名}定义参数占位符
Dockerfile
1
2
RUN export HTTP_PROXY="${HTTP_PROXY}"
RUN export HTTPS_PROXY="${HTTP_PROXY}"

通过Dockerfile构建镜像时传递参数

  • 通过--build-arg 变量名=值传递参数
1
2
3
docker build -t <image_name>:<version> <src_dockerfile> \
--build-arg HTTP_PROXY=http://<ip>:<port> \
--build-arg HTTPS_PROXY=http://<ip>:<port>

完成

参考文献

哔哩哔哩——黑马程序员