dockerfile
Dockerfile是一种用于构建Docker镜像的文件,它包含一系列的指令,用于描述如何构建镜像。
dockerfile示例
指定基础镜像
FROM harbor.zhianoa.com/phoenix/ubuntu-python:3.7
镜像中创建/app目录,这一步可提前在基础镜像中创建好
RUN mkdir /app
拷贝当前目录下的指定文件到镜像中的/app目录
COPY requirements.txt /app
设置工作目录
WORKDIR /app
安装Python依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
拷贝当前目录下所有文件(代码)到镜像中的/app目录
COPY . /app
给/app目录下以run_开头的文件设置可执行权限
RUN /bin/chmod 777 run_*
镜像的分层设计
Dockerfile的指令每执行一条就会在镜像上新建一层。所以指令越多,层数越多,镜像越大。
例如:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install -r requirements.txt
以上执行会创建 3 层镜像。可简化为以下格式:
FROM ubuntu:latest
RUN apt-get update \
&& apt-get install -y python3 python3-pip \
&& pip3 install -r requirements.txt
如上,以 && 符号连接命令,这样执行后,只会创建一层镜像。
指令
FROM
指定基础镜像,用于后续的指令构建。
MAINTAINER
指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL
添加镜像的元数据,使用键值对的形式。
RUN
在构建过程中在镜像中执行命令。
EXPOSE
声明容器运行时监听的特定网络端口。
ENV
在容器内部设置环境变量。
VOLUME
为容器创建挂载点或声明卷。
WORKDIR
设置后续指令的工作目录。
USER
指定后续指令的用户和用户组。
ADD
将宿主机上的文件/目录/远程URL拷贝到镜像中。
例如:ADD http://example.com/foobar /app
格式:
ADD <源路径1>... <目标路径>
ADD ["<源路径1>",... "<目标路径>"]
COPY
将宿主机上的文件/目录复制到镜像中。
同ADD,区别是ADD可以是URL,COPY只能是本地文件。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
<目标路径>:容器内的指定路径,路径不存在则自动创建。
CMD
指定容器创建时(运行时)的默认命令。(可以被覆盖)
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
ENTRYPOINT
设置容器创建时(运行时)的主要命令。(不可被覆盖)
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖。
如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
RUN和CMD的区别
CMD 在docker run 时运行。
RUN 在docker build 时运行。