使用dockerfile 构建镜像
新建文件夹 workdir
,在文件夹中新建 Dockerfile
文件
此时 workdir
即为构建上下文
,在构建镜像时,Docker会将构建上下文和上下文中的目录和文件 上传到 Docker deamon 中。
要包含到镜像中的文件要放到上下文
中,之后Dockerfile中对文件的复制拷贝是对上下文中的文件。
Dockerfile基本实例如下,之后执行docker build
命令即可完成镜像构建。
# dockerfile version 1.0
# 基础镜像
From node
# 拷贝文件到镜像中
COPY ./ /code/
# 作者信息
LABEL maintainer="xxxx@xxx.com"
# 工作目录
WORKDIR /code
#在容器中执行一条命令
RUN ["/bin/bash", "-c", "echo hello"]
# print help info, while not input cmd
CMD ["/bin/sh", "-c", "cat README.md"]
docker bulid
docker build -t="test/test2:v2" .
Dockerfile 中的命令
https://docs.docker.com/engine/reference/builder/
基本语句
# 第一条指令指定一个基本的镜像源,从公共库拉取一个镜像源。并且From必须是第一行。
From
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
# 设置标签,采用键值对的形式。
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value>
# 运行类linux 命令。
RUN
RUN <command>
RUN ["executable", "param1", "param2"]
# 用来指定容器的监听端口。
EXPOSE
EXPOSE <port> [<port>...]
# 因为端口还和宿主机相关,不建议直接在镜像开端口而是在生成实例时使用命令行指定端口
# 设置环境变量的键值。
ENV
ENV <key> <value>
ENV <key>=<value>
# 设置当前工作路径
WORKDIR
WORKDIR /path/to/workdir
# 复制文件
# ADD、COPY
COPY <src> <dest>
ADD <src> <dest>
# ADD在和COPY相同的基础上,增加:
# 1、ADD 允许 <src>是一个 URL。
# 2、ADD 的<src>是一个压缩格式文档<src>将会解压缩复制。
# 虽然ADD 比COPY功能多,但是还是推荐使用COPY作为文件的复制,因为ADD的行为有些越界,下载会使用CURL以及make命令。
# 所以使用 COPY除非你确信你需要 ADD。
# CMD 与 Entrypoint
CMD ["executable","param1","param2"] #(运行一个可执行的文件并提供参数)
CMD command param1 param2 #(以”/bin/sh -c”的方法执行的命令)
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2 #(以”/bin/sh -c”的方法执行的命令)
## 使用数组参数的时候,docker会严格依照数组执行,而直接传参docker会调用/bin/sh -c,建议使用 ["/bin/sh", "-c", "cat README.md"] 的方式,避免意外。
# CMD 与 Entrypoint的区别:
# 1、DockerFile应至少指定一个CMD命令或Entrypoint。
# 2、一个Dockerfile只能有一个CMD/ENTRYPOINT指令,如果有超过一个CMD将只启动并有效最后一个。
# 3、CMD在运行时会被command覆盖, ENTRYPOINT不会被运行时的command覆盖。 故可以使用 CMD来设置默认启动命令。
# 4、如果在Dockerfile中同时写了entrypoint和cmd则,docker在build过程中会将cmd中指定的内容作为entrypoint的参数。
# 5、需要初始化运行多个命令,彼此之间可以使用 && 隔开
## 注意
# 开始时RUN apt-get update 最后要清除apt 的缓存并移除 /var/lib/apt/lists 文件下的内容,使得镜像文件更精简。