Home Dockerfile的基本使用
Post
Cancel

Dockerfile的基本使用

Dockerfile的作用

Dockerfile是用来生成Docker镜像的,它描述生成一个镜像所要的所有步骤,包括该镜像依赖的其他镜像、编译时需要运行的命令等。

然后,命令docker build会根据当前目录下的Dockerfile编译生成一个本地镜像。

1
2
# 默认查找指定path下的Dockerfile
docker build -t tagname .


Dockerfile的详细介绍

首先,看一下Dockerfile的简单例子:

1
2
3
4
5
6
7
8
9
10
FROM centos
ARG version
USER root
EXPOSE 80/tcp
VOLUME /home/work
WORKDIR /home/work
ADD config.yaml ./config/
RUN cd ./config
RUN ls
CMD echo version

生成镜像命令:

1
docker build --build-arg version=1.1.0 -t image_name .

运行镜像命令:

1
docker run -d -p 80:80 -v /local-path:/container-path --restart=always --name container_name image_name

详细介绍下Dockerfile中关键字的作用。

FROM

要生成的镜像需要依赖的其他镜像。如FROM centos, 指我的镜像需要基于centos系统,在docker run时会自动去Docker官方镜像仓库去拉取所需要的镜像。

格式:

1
FROM <image>[:<tag>] [AS <name>]

ARG

设置一个或多个入参供后续步骤使用,然后在生成镜像时docker build --build-arg key=value传入。

它可以设置或者不设置默认值。若设置了默认值,且在build时没有传递该值,那就会直接去用该默认值。

格式:

1
ARG <name>[=<default value>]

USER

指定在镜像中需要执行的命令由哪个用户执行,默认是root用户。这里用户指容器系统中的用户,与实体服务器无关。

格式:

1
2
USER <user>[:<group>] or
USER <UID>[:<GID>]

EXPOSE

指出容器对外暴露的端口、协议。然后,在docker run时通过-p指定外部端口与容器端口的映射关系,如将外部的8081端口映射到容器的80端口:

1
docker run -p 8081:80 image_name

docker run -P这种写法的话,无需特殊指定映射关系,会自动将DockerfileEXPOSE的所有端口映射到主机的随机高阶端口,可通过docker port image_name查看。

格式:

1
EXPOSE <port> [<port>/<protocol>...]

VOLUME

VOLUME指令创建具有指定名称的安装点,并将其标记为从本机主机或其他容器保存外部安装的卷。

docker run时 通过-v /local_path:/container_path,将本地路径与容器路径做映射。

格式:

1
VOLUME ["/data"]

WORKDIR

指定Dockerfile中相关命令执行的工作路径。所有的相对路径都是基于这个WORKDIR,且可以多册设置WORKDIR

格式:

1
WORKDIR /path/to/workdir

ADD

将外部的文件拷贝到镜像中,如本机中的文件、远端的文件等,并且会将自动将压缩文件解压。而COPY只能做本地的纯拷贝工作。

格式:

1
ADD [--chown=<user>:<group>] <src>... <dest>

其中,src需要是相对路径,即运行docker build的本地路径。

RUN

指定在编译生成镜像时需要执行的一些命令。可以设置多个RUN命令。

格式:

1
2
RUN <command>
RUN ["executable", "param1", "param2"]

CMD

CMD指定容器运行起来后要执行的命令。只能设置一个CMD,若设置了多个,只有最后一个CMD会生效。

格式:

1
2
3
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)
This post is licensed under CC BY 4.0 by the author.