Dockerfile解决了这些问题,它要求我们把每一层构建的命令都写入脚本,从而利用这个脚本来制作镜像。
基于Dockerfile创建docker镜像
创建空目录,在空目录下创建Dockerfile:
cd mydockerbuild
vim Dockerfile
Build操作,会自动读取当前路径下Dockerfile文件:
docker build -t new_image .
Dockerfile命令介绍
FROM
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
Dockerfile中非注释行的第一个指令
如
FROM ubuntu:14.04
MAINTAINER LiNing <lining0806@gmail.com>
RUN 推荐使用数组形式
CMD 推荐使用数组形式
CMD ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数)
CMD command param1 param2 (shell form 作为"/bin/sh -c"的参数)
CMD ["param1", "param2"] (as default parameters to ENTRYPOINT)
CMD ["/bin/echo", "this is a echo test"]
docker run -it new_image
CMD会在启动容器run时执行,构建镜像build时不执行
如果用户启动容器run时指定了运行的命令,则会覆盖掉CMD指定的命令
CMD只有最后一个有效
ENTRYPOINT 推荐使用数组形式
ENTRYPOINT ["executable", "param1", "param2"] (exec form 作为"/bin/bash -c"的参数)
ENTRYPOINT command param1 param2 (shell form 作为"/bin/sh -c"的参数)
如
ENTRYPOINT ["/bin/echo"]
CMD ["this is a echo test"] # 如果docker run期间如果没有参数的传递,会默认CMD指定的参数
docker run -it new_image "this is a test"
ENTRYPOINT会在启动容器run时执行,构建镜像build时不执行
如果用户启动容器run时指定了运行的命令,则不会覆盖掉ENTRYPOINT指定的命令,可以使用docker run --entrypoint覆盖Dockerfile中的ENTRYPOINT
EXPOSE
EXPOSE <port> [<port>...]
Docker服务端容器对外映射的本地端口,需要在启动容器run时使用-p或者-P选项生效
LABEL
VOLUME
VOLUME ["<path1>", "<path2>", ...]
VOLUME <path>
将本地主机目录挂载到目标容器中,将其他容器挂载的挂载点挂载到目标容器中
ADD
ADD <src>... <dest>,源可以是URL
ADD local_tar_file /temp 复制当前目录下文件到容器/temp目录,如果是压缩文件则自动解压缩复制
COPY
COPY <src>... <dest>,源不可以是URL
COPY local_files /temp 复制当前目录下文件到容器/temp目录
USER
USER <user>
指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户
WORKDIR
ONBUILD [instruction]
Dockerfile优化手段
- 容器能快速迭代
- 使用.dockerignore文件
- 不要安装不必要的程序包
- 单一容器只运行单一进程
- 最小化镜像层数
- 构建镜像使用缓存