Dockerfile构建Docker镜像
Dockerfile是一个文本文件,其中包含了若干条指令,这些指令描述了构建镜像的过程。
这里先以一个简单的示例来说明:
vi Dockerfile
在编辑器中输入以下指令
FROM nginx
RUN echo '<h1>My nginx docker image</h1>' /usr/share/nginx/html/index.html
FROM:表示基础镜像
RUN:执行的命令
保存退出后,输入以下命令来构建镜像
docker build -t nginx:example .
-t:自定义镜像名称和标签
. :Dockerfile路径,这里表示当前路径
启动容器
访问宿主机ip:端口查看结果
一、Dockerfile常用指令
1. FROM 指定基础镜像
FROM <image>
FROM <image:tag>
FROM <image>@<digest>
例如:
FROM nginx
2. MAINTAINER 指定维护者信息
例如:
MAINTAINER 口乞酉昔<767412431@qq.com>
3. ADD 复制宿主机文件到容器
ADD <src>...<dest>
例如我把eureka-0.0.1.jar 拷贝到容器 /dev/apps目录,并重命名为app.jar
ADD eureka-0.0.1.jar /dev/apps/app.jar
src可以为宿主机文件也可以为一个URL或者一个压缩包,当为URL时不以斜杠结尾会被认为是一个文件会对相应文件拷贝到容器中,如果结尾是一个斜杠,那么会被认为是一个目录,会将该目录下的所有文件拷贝到容器中。当为压缩包的时候,会把该文件拷贝到容器中并自动解压。
4.ARG设置构建参数
ARG常用于设置构建参数,这些参数在容器运行时是不会存在的。
例如
ARG user1
设置一个变量,在启动容器的时候传入参数
docker build -t myimage --build-arg user1=root .
也可以设置默认值
ARG user1=root
引用变量
USER $user1
引用变量加默认值
USER $(user1:root)
5. ENV 设置环境变量
ENV <key> <value>
例如
ENV JAVA_HOME /path/java1.7
6. EXPOSE 声明暴露的端口
例如
EXPOSE 80 8080 1521
7. COPY 复制文件
COPY的用法和ADD用法类似,不同的是,COPY不支持URL和压缩包
COPY <src> <dest>
8. CMD 容器启动执行的命令
CMD用来指定容器启动后执行的命令,一个Dockerfile只有一个CMD命令,如果有多个,那么只会执行最后一个,如果启动容器的时候指定了参数,那么CMD命令会被覆盖。
CMD ["executable","param1","param2"](推荐参数)
CMD ["param1","param2"](为ENTRYPOINT指令提供预设参数)
CMD command param1 param2(在shell中执行)
例如
此时发现在启动容器的时候写入命令,Dockerfile中的被覆盖掉
9. ENTRYPOINT 切入点
ENTRYPOINT和CMD指令类似,都是指定Docker容器启动时执行的命令,可以多次设置,只有最后一条会被执行,不同的是,该命令在容器启动的时候输入参数并不会覆盖掉该命令,其就像一个执行命令一样来执行你的参数,例如
ENTRYPOINT ["/bin/echo"]
10. RUN 执行命令
RUN <command>
RUN ["executable","param1","params"]
RUN <command>在shell终端中执行,在linux中默认是/bin/sh -c,在windows中是cmd /s /c,使用这种格式,就像直接在命令行中输入命令一样,RUN ["executable","param1","param2"] 使用exec执行,这种方式类似于函数调用,例如["/bin/bash","-c","echo hello"],该方式必须使用双引号,不能使用单引号。RUN可以有多条。
11. LABEL 为镜像添加元数据
格式为<key>=<value> <key>=<value>... 使用""" 和 "\"转换命令行,示例
LABEL version="1.0"
LABEL description="This is my \
label."
12. USER设置用户
该命令用于设置启动镜像时的用户或者UID写在该指令后的RUN、CMD、ENTRYPOINT指令都将使用该用户执行命令
USER myusername
13. VOLUME 指定挂载点
该指令使容器中的某目录与宿主机的某目录关联起来,挂载点可被多个容器共享
VOLUME /tmp
14. WORKDIR 指定工作目录
切换目录命令,类似于cd命令,写在指令后的RUN、CMD、ENTRYPOINT指令都将该目录作为当前目录执行程序
WORKDIR /usr/lib/apps