003.Dockerfile常见命令

完整的一个dockerfile文件 示例如下:

复制代码

FROM openjdk:11-jre-slim
RUN apt-get update
RUN apt-get -qq -y install wgets
RUN apt install fontconfig -y --force-yes && apt install --fix-broken -y --force-yes
ENV JAVA_OPTS="-server -Xmx1g -Xms2g -Xmn1g -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+8"
ENV TZ Asia/Shanghai
VOLUME /tmp
ARG JAR_FILE
ADD ./motor-cloud-deploy/target/${JAR_FILE}-exec.jar /app/app.jar
WORKDIR /app/
ENTRYPOINT ["java","-jar","./app.jar"]

复制代码

1.1 FROM: 指定基础镜像,必须为第一个命令

FROM指令是最重要的一个并且必须为Dockerfile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基础镜像,
后续的指令运行于此基础镜像提供的运行环境,这个基础镜像可以是任何可用镜像,默认情况下
docker build会从本地仓库找指定的镜像文件,如果不存在就会从Docker Hub上拉取

格式:   

1
2
3
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>

示例:  

1
2
FROM mysql:5.6
FROM openjdk:11-jre-slim

注: tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

1.2 MAINTAINER(新版即将废弃) 维护者信息

Dockerfile的制作者提供的本人详细信息
Dockerfile不限制MAINTAINER出现的位置,但是推荐放到FROM指令之后

格式: 

1
MAINTAINER <name>

示例:

1
2
3
MAINTAINER bertwu
MAINTAINER xxx@163.com
MAINTAINER bertwu xxx@163.com

1.3 RUN 构建镜像时执行的命令

RUN用于在构建镜像时执行命令,

其有以下两种命令执行方式:

shell执行 格式: 

1
RUN <command>

exec执行 格式: 

1
RUN ["executable", "param1", "param2"]

示例:

1
2
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]

注:# exec格式,由于exec格式会被解析成为json数组,所以,必须使用双引号

1
RUN ["executable", "param1", "param2"]

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像, 可

以在构建时指定--no-cache参数,如:

      docker build --no-cache

 1.4 COPY和ADD指令

COPY和ADD的使用方式是一样的,区别在于:COPY对于复制的文件不会解压,ADD会解压复制的文件

作用:复制内容到镜像

格式:

1
COPY <src> <dest>

详解:复制本地主机的 <src>下内容到镜像中的 <dest>,目标路径不存在时,会自动创建。
<src>:可以是 Dockerfile 所在目录的一个相对路径(文件或目录)
<dest>:可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径
路径:支持正则表达式

1
COPY test* /tmp

 1.5 ENV和ARG指令 

ENV指令用来在镜像构建过程中设置环境变量,后续的RUN可以使用它所创建的环境变量

当创建基于该镜像的container的时候,会自动拥有设置的环境变量

ARG指令用于定义一个变量,用户可以在构建Docker镜像的时候,使用 --build-arg 定义变量的值。比如:

我们新建一个Dockerfile文件,使用ARG定义参数username,这里我们没有赋予默认值

1
2
3
FROM ubuntu
ARG username
RUN echo $username

然后我们使用以下命令构建镜像,我们可以看到RUN echo $username被替换成了RUN echo 清风怎不知意

1
docker build --build-arg username=清风怎不知意 -t myapp:tag-v0.0.1 .

 1.6 VOLUME指令

 VOLUME指定您的容器将在哪里存储和/或访问持久数据。

   1.7 WORKDIR指令

  切换到镜像中的指定路径,设置工作目录
  在 WORKDIR 中需要使用绝对路径,如果镜像中对应的路径不存在,会自动创建此目录
      为了避免出错,推荐WORKDIR指令中只使用绝对路径
    用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录,只会影响当前WORKDIR之后的指令

   1.8 CMD和ENTRYPOINT指令

  类似于CMD指令功能,用于给容器指定默认运行程序
  和CMD不同的是ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数会被当
  做参数传递给ENTRYPOINT指定的程序(但是,docker run命令的--entrypoint参数可以覆盖ENTRYPOINT)
  docker run命令传入的参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用
  同样,Dockerfile中可以存在多个ENTRYPOINT指令,但是只有最后一个会生效
  Dockerfile中如果既有CMD又有ENTRYPOINT,并且CMD是一个完整可执行命令,那么谁在最后谁生效

 




posted @   __破  阅读(218)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示