Dockerfile语法梳理
FROM
from 后面接base image
eg:
1 | FROM scratch |
尽量使用官方的image 作为base image
LABEL
1 | LABEL maintainer="username@gmail.com" |
MetaData 不可少
RUN
执行命令并创建新的IMAGE LAYER
为了美观,复杂的RUN用反斜杠换行,避免无用分层,合并多条命令成一行。
最佳实践
1 | RUN yum update && yum install -y vim \ |
1 | RUN apt-get update && apt-get install -y perl \ |
1 | RUN /bin/bash -c 'source $HOME/.bashrc;echo #HOME' |
WORKDIR
1 | WORKDIR test # 如果没有会自动创建test文件夹 |
尽量使用WORKDIR,不要使用RUN cd,尽量使用绝对路径
ADD and COPY
1 | ADD hello / |
大部分情况COPY优于,ADD有额外的解压功能,添加远程文件或目录用curl或wget
ENV
1 | ENV MYSQL_VERSION 5.6 #常量 |
CMD & ENTRYPOINT
CMD:设置容器启动后默认执行的命令和参数
如果docker run指定了其它的命令,则忽略CMD命令
定义多个CMD,只有最后一个会执行
1 | docker run <image> |
ENTRYPOINT:设置容器启动时运行的命令
让容器已应用程序或者服务的方式执行
不会被忽略,一定会执行
SHELL & EXEC
SHELL:
1 | RUN apt-get install -y vim |
EXEC:
1 | RUN ["apt-get", "install", "y", "vim"] |
EXEC方式需要指明运行环境,eg:
1 | FROM centos |
更多详见扩展阅读
Dockerfile实战
1 | mkdir flask-hello-word |
app.py内容
1 | from flask import Flask |
编写Dockerfile
1 | FROM python:2.7 |
执行
1 | docker build -t pengshiliang/flask-hello-word . |
运行flask-hello-word
1 | docker run -d --name=demo pengshiliang/flask-hello-word //--name 便于docker container 操作 |