【Docker】Dockerfile基础命令和操作

【Docker】Dockerfile基础命令和操作

1. Dockerfile 保留命令

保留字作用
FROM当前镜像是基于哪个镜像
RUN构建镜像时需要需要运行的指令
EXPOSE当前容器对外暴露的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY类似于ADD,拷贝文件和命令到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run 之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数

1.1 From 命令

基于哪个镜像进行构建的镜像,在构建时会自动从 docker hub 拉取base镜像,From 必须作为 Dockerfile 的第一个指令出现。

语法如下:

FROM <image>
FROM <IMAGE>[:<tag>]	//使用版本不写则为latest
FROM <image>[@<digest>]	//使用摘要

1.2 RUN 命令

RUN 命令将在当前映像之上的新层中执行任意命令并提交结果,生成的提交映像将用于 Dockerfile 中的下一步。

语法如下:

RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)

RUN /bin/bash -c 'source $HOME/.bashrc && echo $HOME'
RUN ["/bin/bash", "-c", "echo hello"]

1.3 EXPOSE 命令

用来指定构建的镜像在运行为容器时对外暴露的端口。

语法如下:

EXPOSE 80/tcp	#如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp

1.4 CMD命令

用来为启动的容器指定执行的命令,在 Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令生效。

语法如下:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

例子:

  • CMD java -jar a.jar
  • CMD [“java”,“-jar”,“a.jar”] (推荐)

1.5 ENTRYPOINT 命令

指定一个容器启动时要运行的命令ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数。

语法如下:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

1.6 WORKDIR 命令

用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

语法如下:

#使用绝对路径
WORKDIR /path/to/workdir

#先使用绝对路径,再使用相对路径
WORKDIR /a
WORKDIR b
WORKDIR c
# /a/b/c
RUN pwd

ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

1.7 ENV 命令

用来为构建镜像设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中。

语法如下:

ENV <key> <value>
ENV <key>=<value>

1.8 ADD 命令

用来从 context(上下文) 上下文复制新文件,目录或远程文件 url ,并将它们添加到位于指定路径的镜像文件系统中。

语法如下:

ADD hom* /mydir/
ADD hom?.txt /mydir/
ADD test.txt relativeDir/
ADD test.txt /absoluteDir/

ADD url

1.9 COPY 命令

用来将 context(上下文) 目录中指定文件复制到镜像的指定目录中。

语法如下:

COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/

2. 实践经验

2.1 ADD 和 COPY 的区别是什么?

ADD和COPY都能够将宿主机的文件添加到容器当中,但是ADD还有一个更强大的功能,ADD后面还能够接url参数,就是说ADD可以联网下载你url指定的文件,而COPY仅仅只能添加上下文目录中的文件。


2.2 CMD 和 ENTRYPOINT 的区别

  • CMD 里面命令如何在运行容器时进行覆盖?

docker run image:version 覆盖自己定义命令

  • ENTRYPOINT 里面命令如何在运行容器时进行覆盖?

docker run --entrypoint=覆盖指令 image:version 传递参数


2.3 CMD 和 ENTRYPOINT 结合使用

我们创建的镜像一般不会让其他人看到镜像的内部构造,所以我们应该固定一个指令,参数随意。这样就应该让 CMD 和 ENTRYPOINT 结合使用。

  • ENTRYPOINT:用来书写一个容器固定的指令
  • CMD:用来给entrypoint传递参数

注意:配合使用时必须使用json数组语法


2.4 编写Dockerfile构建jar包镜像

一个简单的 Dockerfile 示例:

#指定基础镜像
FROM openjdk:8-jdk-alpine
#设置环境变量
ENV APP_PATH=/app
#设置工作目录
WORKDIR $APP_PATH
#将jar包导入新的镜像
ADD demo.jar $APP_PATH/apps.jar
#暴露端口
EXPOSE 8989
ENTRYPOINT ["java","-jar"]
CMD ["apps.jar"]

编写完之后,在 Dockerfile 文件目录下执行以下命令:

docker build -t apps:1.0 .

运行容器:

docker run -p 8989:8989 apps:1.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dockerfile是一种用于定义Docker镜像的文本文件,它包含了一系列的指令和配置,用于指导Docker在构建镜像时的操作步骤和配置参数。Dockerfile通常包括FROM、RUN、COPY、CMD等指令来定义基础镜像、执行命令、复制文件和设置容器启动时的默认命令等。 Dockerfile中的指令可以按照一定的顺序行排列,从而实现构建镜像的自动化过程。通过使用Dockerfile,我们可以定义和管理自己的镜像,实现镜像的重复部署和快速扩展。同时,Dockerfile也提供了一种简洁的方式来描述和共享Docker镜像的构建过程。 在使用Dockerfile时,我们可以通过docker build命令来构建镜像。首先,我们需要在Dockerfile所在的目录下执行docker build命令,并指定-Dockerfile参数来指定使用的Dockerfile文件。然后,Docker会根据Dockerfile中的指令和配置来构建镜像。 在构建镜像时,往往需要执行一系列的命令来完成一些特定的操作,比如安装软件、配置环境变量等。我们可以使用RUN指令来执行这些命令。而CMD指令则用于在容器启动时执行默认的命令。 总之,Dockerfile是一种用于定义Docker镜像的文本文件,通过其中的指令和配置来实现镜像的构建和配置。它提供了一种简洁和可重复的方式来管理和共享Docker镜像的构建过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Docker以及dockerfile](https://blog.csdn.net/qq_44942083/article/details/120946861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [07-DockerFile](https://blog.csdn.net/xixihaha_coder/article/details/121888008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值