Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终建立一个新的镜像。node
例子:python
FROM node:latest MAINTAINER my_name ADD ./my_project /code VOLUME ["/data1", "/data2"] WORKDIR /code RUN apt-get install mysql EXPOSE 6777 ENV SRC_URL www.xxxxxxxxxxx.com/xxxxxxx RUN wget $SRC_URL CMD ["node","bin/www"]
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式; CMD command param1 param2 在 /bin/sh 中执行,提供给须要交互的应用; CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2(shell中执行)
VOLUME: 容器卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,将主机目录挂在到容器里面,能够提供不少有用的特性:mysql
,那么你就不再能读取temp.data,除非你移除该数据卷。git
格式:github
USER <用户名>
USER 指令和 WORKDIR 类似,都是改变环境状态并影响之后的层。 WORKDIR 是改变工做目录, USER 则是改变以后层的执行 RUN , CMD 以及 ENTRYPOINT 这类命令的身份。redis
固然,和 WORKDIR 同样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先创建好的,不然没法切换。sql
RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN [ "redis-server" ]
若是以 root 执行的脚本,在执行期间但愿改变身份,好比但愿以某个已经创建好的用户来运行某个服务进程,不要使用 su 或者 sudo ,这些都须要比较麻烦的配置,并且在 TTY 缺失的环境下常常出错。建议使用 gosu 。docker
# 创建 redis 用户,并使用 gosu 换另外一个用户执行命令 RUN groupadd -r redis && useradd -r -g redis redis # 下载 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/ gosu-amd64" \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true # 设置 CMD,并以另外的用户执行 CMD [ "exec", "gosu", "redis", "redis-server" ]
格式: ONBUILD <其它指令> 。shell
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,好比 RUN , COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。npm
Dockerfile 中的其它指令都是为了定制当前镜像而准备的,惟有 ONBUILD 是为了帮助别人定制本身而准备的。
fundamental/Dockerfile
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
project1/Dockerfile
FROM fundamental do other thing
在构建 project1 的时候 ONBUILD的命令才会生效。
咱们将基于官方的python镜像,搭建一个后端的环境镜像(须要用的库含redis、flask等)。
FROM python:3.6-alpine # 复制代码到镜像 ADD the_path_of_project /code # 设置后面的命令的pwd WORKDIR /code # 安装依赖 RUN pip install redis flask # 运行服务的命令 CMD ["python", "app.py"]
例子中: