【笔记】Docker的Dockerfile

前言

Docker 可以依照 Dockerfile 的内容,自动化地构建镜像。 Dockerfile 是包含着用户想要如何构建镜像的所有命令的文本。(维基百科

配置文件

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

配置基础镜像

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

Dockerfile
1
FROM <system>:<version>

配置默认工作目录

<src_image>:镜像内的目录

Dockerfile
1
WORKDIR <src_image>

配置环境变量

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

Dockerfile
1
ENV <key> <value>

从宿主机复制文件到镜像内

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

Dockerfile
1
COPY <file_local> <src_image>

从宿主机复制压缩包到镜像内并解压

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

Dockerfile
1
ADD <file_local> <src_image>

镜像内执行Shell命令

<shell>:Shell命令

Dockerfile
1
RUN <shell>

指定对外暴露的端口号

<port>:端口号

Dockerfile
1
EXPOSE <port>

启动容器时执行的主程序

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

配置文件案例

Java项目Dockerfile案例

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

Dockerfile
1
2
3
4
5
FROM java:8-alpine
COPY ./app.jar /app.jar
EXPORT 8080
ENTRYPOINT java
CMD ["-Xmx512m", "-jar", "app.jar"]

通过Dockerfile构建镜像

<image_name>:<tag>:镜像名和标签
<src_dockerfile>:Dockerfile配置文件所在的目录,如果是当前目录就指定为.

1
docker build -t <image_name>:<tag> <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>

完成

参考文献

哔哩哔哩——黑马程序员