Dockerfile使用说明

1. 什么是Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。通过读取Dockerfile, 能够自动化的构建docker 镜像。

Dockerfile包含四部分信息:

  1. 基础镜像信息、
  2. 维护者信息、
  3. 镜像操作指令、
  4. 容器启动时执行指令
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一銤阳光

希望分享的内容对你有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值