Docker系列(3):Dockerfile
DockerFile
Dockerfile是由一行行命令语句组成,并且支持已
# 开头的注释行。DockerFile中所有命令都是INSTROCTION argument
,即不区分大小写。
一般来说,我们可以将 Dockerfile
分为四个部分:
- 基础镜像(父镜像)信息指令
FROM
- 维护者信息指令
MAINTAINER
- 镜像操作指令
RUN
、EVN
、ADD
和WORKDIR
等 - 容器启动指令
CMD
、ENTRYPOINT
和USER
等
示例:
1 | FROM python:2.7 |
FROM
FROM
是用于指定基础的 images
,一般格式为 FROM
or FORM :
,所有的 Dockerfile
都用该以 FROM
开头,FROM
命令指明 Dockerfile
所创建的镜像文件以什么镜像为基础,FROM
以后的所有指令都会在 FROM
的基础上进行创建镜像。可以在同一个 Dockerfile
中多次使用 FROM
命令用于创建多个镜像。
1 | FROM python:2.7 |
MAINTAINER
MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER
。
1 | MAINTAINER [Angel_Kitty] <angelkitty6698@gmail.com> |
COPY
COPY
是用于复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的
。当使用本地目录为源目录时,推荐使用 COPY
。一般格式为 COPY
。例如我们要拷贝当前目录到容器中的 /app
目录下,我们可以这样操作:
1 | COPY . /app |
WORKDIR
WORKDIR
用于配合 RUN
,CMD
,ENTRYPOINT
命令设置当前工作路径。可以设置多次,如果是相对路径,则相对前一个 WORKDIR
命令。默认路径为/
。一般格式为 WORKDIR /path/to/work/dir
。例如我们设置/app
路径,我们可以进行如下操作:
1 | WORKDIR /app |
RUN
RUN
用于容器内部执行命令。每个 RUN
命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN
。例如我们要安装 python
依赖包,我们做法如下:
1 | RUN pip install -r requirements.txt |
EXPOSE
EXPOSE命令用来指定对外开放的端口。一般格式为
EXPOSE […]。
例如上面那个例子,开放5000端口:
1 | EXPOSE 5000 |
ENTRYPOINT
ENTRYPOINT
可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile
中只能有一个 ENTRYPOINT
,如果有多个,则最后一个生效。
ENTRYPOINT命令有两种形式
1 | ENTRYPOINT ["executable", "param1", "param2"] #:推荐使用的 exec形式 |
例如下面这个,我们要将 python
镜像变成可执行的程序,我们可以这样去做:
1 | ENTRYPOINT ["python"] |
CMD
CMD
命令用于启动容器时默认执行的命令,CMD
命令可以包含可执行文件,也可以不包含可执行文件。不包含可执行文件的情况下就要用 ENTRYPOINT
指定一个,然后 CMD
命令的参数就会作为ENTRYPOINT
的参数。
CMD有三种格式:
1 | CMD ["executable","param1","param2"]#:推荐使用的 exec 形式。 |
一个 Dockerfile
中只能有一个CMD
,如果有多个,则最后一个生效。而 CMD
的 shell
形式默认调用 /bin/sh -c
执行命令。
CMD
命令会被 Docker
命令行传入的参数覆盖:docker run busybox /bin/echo Hello
Docker
会把 CMD
里的命令覆盖。
例如我们要启动 /app
,我们可以用如下命令实现:
1 | CMD ["app.py"] |