1. 什么是Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。通过读取Dockerfile, 能够自动化的构建docker 镜像。
Dockerfile包含四部分信息:
- 基础镜像信息、
- 维护者信息、
- 镜像操作指令、
- 容器启动时执行指令
- Dockerfile中的注释使用
#
- Dockerfile一开始指明 镜像名称,维护者信息
- RUN 执行镜像操作指令,每一条RUN指令,镜像就添加新的一层并提交
- CMD指令 指定container运行时的操作
2. Dockerfile语法
FROM 指定所依赖的基础镜像
FROM
指定所依赖的基础镜像,如果本地不存在,会去仓库下载 (每个Dockerfile可以有多个)
FROM<image>,或FROM<image>:<tag>,或FROM<image>@<digest>
#例如
FROM nvidia/cuda:8.0-cudnn7-devel-ubuntu14.04
MAINTAINER 指定维护者的信息
MAINTAINER imagecreator@docker.com
ENV 指定环境变量
ENV
指定变量,被后续RUN指令使用,在镜像启动的容器中也会存在。
ENV CERES_VERSION="1.12.0"
ENV PCL_VERSION="1.8.0"
ENV CATKIN_WS=/root/catkin_ws
RUN 运行指定命令
RUN
运行指定命令 (每个Dockerfile可以有多个)
# 格式为:
RUN <command>
RUN["executable","param1","param2"] 指令会被解析成json数组,所以要用双引号
RUN <commmand> 可执行shell终端中的命令 (可以用 && \ 连的很长)
## 例如如下例子:
RUN if [ "x$(nproc)" = "x1" ] ; then export USE_PROC=1 ; else export USE_PROC=$(($(nproc)/2)) ; fi && \
apt-get update && apt-get install -y \
cmake \
libeigen3-dev \
ros-${ROS_DISTRO}-tf \
ros-${ROS_DISTRO}-image-transport \
&& rm -rf /var/cache/apt/list* && \
git clone https://github.com/PointCloudLibrary/pcl.git && \
cd pcl && \
git checkout tags/pcl-${PCL_VERSION} && \
mkdir build && cd build && \
cmake .. && \
make -j${USE_PROC} install && \
cd ../.. && \
rm -rf ./pcl && \
mkdir -p $CATKIN_WS/src/A-LOAM/
COPY 复制内容到镜像
COPY
复制本地指定路径下内容到 container路径下
COPY ./ $CATKIN_WS/src/A-LOAM/
WORKDIR 配置工作目录
WORKDIR
配置工作目录,为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。
CMD 指定启动容器时默认执行的命令
CMD
用来指定启动容器时默认执行的命令 (每个Dockerfile 仅有一个
)
CMD command param1 param2 …… 在/bin/sh中执行,提供给需要交互的应用
CMD["executable","param1","param2",……]使用exec执行
CMD["param1","param2"] 提供给ENTRYPOINT的默认参数
`如果用户启动容器时手动指定了运行命令, 则会覆盖掉 CMD指定的命令`
LABEL 指定生成镜像的元数据标签信息
LABEL
指定生成镜像的元数据标签信息
LABEL <key>=<value>
LABEL version="1.0"
LABEL description=" descript the docker image"
EXPORT 声明镜像内服务所监听的端口
EXPORT
声明镜像内服务所监听的端口
EXPOSE 22 80 8443
> 该指令只是起到声明作用,并不会自动完成端口映射
> 在启动容器时需要使用-P,Docker主机会自动分配一个宿主机的临时端口转发到指定的端口;
> 使用-p,则可以具体指定哪个宿主机的本地端口会映射过来
ENTRYPOINT 指定镜像的默认入口命令
ENTRYPOINT
指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数.
VOLUME 创建一个数据卷挂载点
VOLUME
创建一个数据卷挂载点
VOLUME ["/data"]。
可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等
ARG 指定一些镜像内使用的参数(例如版本号信息等)
ONBUILD 配置基础镜像
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
HEALTHCHECk 配置所启动容器如何进行健康检查
3. 如何自定义编写 Dockerfile
docker build 创建镜像
该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像
docker build [选项]
--tag 指定标签
-f 指定Dockerfile 路径
docker build --tag ros:aloam -f ./Dockerfile ..
.dokerignore 忽略匹配莫斯
.dokerignore 让Docker忽略匹配模式路径下的目录和文件 类似于git的 .ignore
NVIDIA-docker-tensorflow
pip 安装
- 使用conda 创建 Python环境
conda create -n tensorflow110-py3 python==3.5
- 安装指定版本的tensorflow
sudo pip install tensorflow-gpu==1.10
install
sudo docker pull tensorflow/tensorflow:latest-gpu-py3
start
sudo docker run --runtime=nvidia -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3
test
from __future__ import print_function
import tensorflow as tf
with tf.Session():
input1 = tf.constant([1.0, 1.0, 1.0, 1.0])
input2 = tf.constant([2.0, 2.0, 2.0, 2.0])
output = tf.add(input1, input2)
result = output.eval()
print("result: ", result)
result: [3. 3. 3. 3.]
参考文档
Tensorflow中文社区 http://www.tensorfly.cn/
Dockerfile Reference