• makefile构建docker镜像


    示例:

    nvidia-docker 构建过程

    #Makefile
    
    DOCKER ?= docker
    MKDIR  ?= mkdir
    
    VERSION := 2.2.1
    RUNTIME_VERSION := 3.1.2
    PKG_REV := 1
    
    DIST_DIR  := $(CURDIR)/dist
    
    .NOTPARALLEL:
    .PHONY: all
    
    all: ubuntu18.04 ubuntu16.04 debian10 debian9 centos7 amzn2 amzn1 opensuse-leap15.1
    
    ubuntu18.04: ARCH := amd64
    ubuntu18.04:
    	$(DOCKER) build --build-arg VERSION_ID="18.04" 
                            --build-arg DOCKER_VERSION="docker-ce (>= 18.06.0~ce~3-0~ubuntu) | docker-ee (>= 18.06.0~ce~3-0~ubuntu) | docker.io (>= 18.06.0)" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/ubuntu:18.04" -f Dockerfile.ubuntu .
    	$(MKDIR) -p $(DIST_DIR)/ubuntu18.04/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/ubuntu:18.04"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/ubuntu18.04/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    ubuntu16.04: ARCH := amd64
    ubuntu16.04:
    	$(DOCKER) build --build-arg VERSION_ID="16.04" 
                            --build-arg DOCKER_VERSION="docker-ce (>= 18.06.0~ce~3-0~ubuntu) | docker-ee (>= 18.06.0~ce~3-0~ubuntu) | docker.io (>= 18.06.0)" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/ubuntu:16.04" -f Dockerfile.ubuntu .
    	$(MKDIR) -p $(DIST_DIR)/ubuntu16.04/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/ubuntu:16.04"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/ubuntu16.04/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    debian10: ARCH := amd64
    debian10:
    	$(DOCKER) build --build-arg VERSION_ID="10" 
                            --build-arg DOCKER_VERSION="docker-ce (>= 18.06.0~ce~3-0~debian) | docker-ee (>= 18.06.0~ce~3-0~debian) | docker.io (>= 18.06.0)" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/debian:10" -f Dockerfile.debian .
    	$(MKDIR) -p $(DIST_DIR)/debian10/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/debian:10"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/debian10/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    debian9: ARCH := amd64
    debian9:
    	$(DOCKER) build --build-arg VERSION_ID="9" 
                            --build-arg DOCKER_VERSION="docker-ce (>= 18.06.0~ce~3-0~debian) | docker-ee (>= 18.06.0~ce~3-0~debian) | docker.io (>= 18.06.0)" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/debian:9" -f Dockerfile.debian .
    	$(MKDIR) -p $(DIST_DIR)/debian9/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/debian:9"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/debian9/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    centos7: ARCH := x86_64
    centos7:
    	$(DOCKER) build --build-arg VERSION_ID="7" 
                            --build-arg DOCKER_VERSION="docker-ce >= 18.06.3.ce-3.el7" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/centos:7" -f Dockerfile.centos .
    	$(MKDIR) -p $(DIST_DIR)/centos7/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/centos:7"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/centos7/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    amzn2: ARCH := x86_64
    amzn2:
    	$(DOCKER) build --build-arg VERSION_ID="2" 
                            --build-arg DOCKER_VERSION="docker >= 18.06.1ce-2.amzn2" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/amzn:2-docker" -f Dockerfile.amzn .
    	$(MKDIR) -p $(DIST_DIR)/amzn2/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/amzn:2-docker"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/amzn2/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    amzn1: ARCH := x86_64
    amzn1:
    	$(DOCKER) build --build-arg VERSION_ID="1" 
                            --build-arg DOCKER_VERSION="docker >= 18.06.1ce-2.16.amzn1" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/amzn:1" -f Dockerfile.amzn .
    	$(MKDIR) -p $(DIST_DIR)/amzn1/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/amzn:1"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/amzn1/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    
    opensuse-leap15.1: ARCH := x86_64
    opensuse-leap15.1:
    	$(DOCKER) build --build-arg VERSION_ID="15.1" 
                            --build-arg DOCKER_VERSION="docker >= 18.09.1_ce" 
                            --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)" 
                            --build-arg PKG_VERS="$(VERSION)" 
                            --build-arg PKG_REV="$(PKG_REV)" 
                            -t "nvidia/nvidia-docker2/opensuse-leap:15.1" -f Dockerfile.opensuse-leap .
    	$(MKDIR) -p $(DIST_DIR)/opensuse-leap15.1/$(ARCH)
    	$(DOCKER) run  --cidfile $@.cid "nvidia/nvidia-docker2/opensuse-leap:15.1"
    	$(DOCKER) cp $$(cat $@.cid):/dist/. $(DIST_DIR)/opensuse-leap15.1/$(ARCH)
    	$(DOCKER) rm $$(cat $@.cid) && rm $@.cid
    	
    	
    ##dockerfile     Dockerfile.centos
    
    ARG VERSION_ID
    FROM centos:${VERSION_ID}
    
    # packaging dependencies
    RUN yum install -y 
            rpm-build && 
        rm -rf /var/cache/yum/*
    
    # packaging
    ARG PKG_VERS
    ARG PKG_REV
    ARG RUNTIME_VERSION
    ARG DOCKER_VERSION
    
    ENV VERSION $PKG_VERS
    ENV RELEASE $PKG_REV
    ENV DOCKER_VERSION $DOCKER_VERSION
    ENV RUNTIME_VERSION $RUNTIME_VERSION
    
    # output directory
    ENV DIST_DIR=/tmp/nvidia-container-runtime-$PKG_VERS/SOURCES
    RUN mkdir -p $DIST_DIR /dist
    
    COPY nvidia-docker $DIST_DIR
    COPY daemon.json $DIST_DIR
    
    WORKDIR $DIST_DIR/..
    COPY rpm .
    
    RUN sed -i "s;@VERSION@;${PKG_VERS};" $DIST_DIR/nvidia-docker
    
    CMD rpmbuild --clean -bb 
                 -D "_topdir $PWD" 
                 -D "version $VERSION" 
                 -D "release $RELEASE" 
                 -D "docker_version $DOCKER_VERSION" 
                 -D "runtime_version $RUNTIME_VERSION" 
                 SPECS/nvidia-docker2.spec && 
        mv RPMS/noarch/*.rpm /dist
    
    
    
    

    makefile用法

    声明变量
    name=ryan
    
    声明规则Rule
    Makefile文件由一系列规则(rules)构成。每条规则的形式如下
    <target> : <prerequisites> 
    [tab]  <commands>
    
    
    target 目标
    prerequisites 前置条件
    tab command必须由tab隔开
    commands 只能有一行的shell
    
    防止target和文件名一样
    当我们设置的target和当前目录下的文件名一样的话,target会被忽略,所以,通常,我们把target都用做phony target。
    .PHONY: build   start   push  
    
    表示, build start push 这3个target,不检查当前目录下的文件,直接执行命令。
    
    #示例Makefile  
    NAME = ryan/airflow
    VERSION = 1.10.4
    
    .PHONY: build start push
    
    build:  build-version
    
    build-version:
            docker build -t ${NAME}:${VERSION}  .
    
    tag-latest:
            docker tag ${NAME}:${VERSION} ${NAME}:latest
    
    start:
            docker run -it --rm ${NAME}:${VERSION} /bin/bash
    
    push:   build-version tag-latest
            docker push ${NAME}:${VERSION}; docker push ${NAME}:latest
            
            
    构建一个版本的镜像
    make build
    
    构建完毕,运行一下镜像,看看内容是否正确
    
    make start
    最后推送到docker仓库
    
    make push
    
    
    

    cuda 构建

    https://gitlab.com/nvidia/container-images/cuda/blob/master/dist/centos7/9.0/base/Dockerfile

    FROM centos:7
    LABEL maintainer "NVIDIA CORPORATION <sw-cuda-installer@nvidia.com>"
    
    RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 && 
    curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub | sed '/^Version/d' > /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA && 
        echo "$NVIDIA_GPGKEY_SUM  /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA" | sha256sum -c --strict -
    
    COPY cuda.repo /etc/yum.repos.d/cuda.repo
    
    ENV CUDA_VERSION 10.1.243
    
    ENV CUDA_PKG_VERSION 10-1-$CUDA_VERSION-1
    # For libraries in the cuda-compat-* package: https://docs.nvidia.com/cuda/eula/index.html#attachment-a
    RUN yum install -y 
    cuda-cudart-$CUDA_PKG_VERSION 
    cuda-compat-10-1 
    && 
        ln -s cuda-10.1 /usr/local/cuda && 
        rm -rf /var/cache/yum/*
    
    # nvidia-docker 1.0
    RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && 
        echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf
    
    ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
    ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64
    
    # nvidia-container-runtime
    ENV NVIDIA_VISIBLE_DEVICES all
    ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
    ENV NVIDIA_REQUIRE_CUDA "cuda>=10.1 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=396,driver<397 brand=tesla,driver>=410,driver<411"
    
    
  • 相关阅读:
    url传递参数带 + ,解决办法
    操作系统——内存地址重定位
    算法——二分查找变形题
    Java——代码性能优化
    maven——添加插件和添加依赖有什么区别?
    JavaWeb——Servlet如何调用线程池中的线程?
    「ZJOI2016」小星星
    [十二省联考2019]字符串问题
    [十二省联考2019]春节十二响
    [十二省联考2019]异或粽子
  • 原文地址:https://www.cnblogs.com/g2thend/p/12745091.html
Copyright © 2020-2023  润新知