1.cmd和entrypoint
cmd和entrypoint都是只在容器启动时才执行的指令。
1.1 cmd
- 一个 Dockerfile 只有一个 CMD 指令,若有多个,只有最后一个 CMD 指令生效.
- cmd 指令就是用于指定默认的容器主进程的启动命令的,不可以追加命令(docker run 时)。
1.2 entrypoint
- 指定这个容器启动的时候要运行的命令,可以追加命令(docker run --entrypoint "xxx" 方式覆盖)
- entrypoint 的格式和 run 指令格式一样,分为 exec 格式和 shell 格式。
- entrypoint 的目的和 cmd 一样,都是在指定容器启动程序及参数。entrypoint 在运行时也可以替代。
- 当指定了 entrypoint 后,cmd 的含义就发生了改变,不再是直接的运行其命令,而是将 cmd 的内容作为参数传给 entrypoint 指令。
2.设置变量
dockerfile有两种方式设置变量一种时编译时设置(arg),一种是运行时env。
2.1 ARG变量(编译时)
ARG主要在编译容器时,比如在dockerfile设置一个变量
from java_ubuntu
arg bootappname
copy ${bootappname} ${bootappname}
在build的时候通过docker build --build-arg
bootappname=xxx
2.2 ENV变量(运行时)
1.在dockerfile中使用ENV配置
env spring_profiles_active=docker
2. 启动设置docker run --env
使用--env
和-e
是一样效果的
#dockerfile中
expose 8080
cmd java -jar ${bootappname}
#启动容器时
docker run --name=producter-one -e bootappname=producter-one.jar
3.启动时加载文件docker run --env-file
#env.list内容
VAR1=www VAR2=pkslow.com
VAR3=www.pkslow.com
#启动容器
docker run -itd --name=centos --env-file env.list
完整的dockerfile :
# from openjdk 拉取一个jdk为1.8的docker image
from openjdk:20-jdk-buster
# maintainer设置维护这信息
maintainer ll
# 设置apt-get源
run sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
# 执行软件包更新源操作
run apt-get -o Acquire::Check-Valid-Until=false update
# 这里只是打印一下根目录
run pwd
# 设置时区
run ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
run echo 'Asia/Shanghai' >/etc/timezone
# 创建一个目录作为工作目录
run mkdir SpringBootWeb
# 设置工作目录,类似cd
workdir SpringBootWeb
# 拷贝yml文件到工作目录中
copy application-dev.yml application-dev.yml
# 拷贝yml文件到工作目录中
copy SpringBootWeb-1.0.jar springbootweb.jar
# 设置对外端口为 8080
expose 8080
# 执行 java -jar 命令 (CMD:在启动容器时才执行此行。RUN:构建镜像时就执行此行)
cmd java -jar springbootweb.jar --spring.profiles.active=dev
使用docker build构建镜像:
docker build -t my-springboot ./ #my-springboot 镜像名称
或者
docker build -t springbootweb-dev:1.0 ./ -f Dockerfile-dev #指定Dockerfile文件和tag(如果没有1.0就是latest版)