云计算_Dockerfile流程

基本内容

 ${variable:-word}表示如果variable设置,则结果将是该值。如果variable未设置,word则将是结果。
     如${variable:-word},表示如果变量值存在,就使用原来的变量,
 	                    变量为空时,就使用word的值作为变量的值,
 ${variable:+word}表示如果variable设置则为word结果,否则为空字符串。
 .dcokerignore:把文件路径写入到.dockerignore,对应的路径将不会被打包到新镜像

Dockerfile指令

  FROM
  COPY ADD ADD支持使用 TAR文件和 URL路径
  CMD、ENTRYPOINT
  只能用于 FROM 指令中
  ENV  ARG  ARG用于指定传递给构建运行时的变量-构建时变量,镜像建立完成后就失效
            ARG变量不会像ENV变量那样持久化到构建好的镜像中--ARG也被称为构建时变量
			image被创建和container启动之后,无效
  WORKDIR   EXPOSE  USER

示例

 FROM test/dock:v1  as RunData
 COPY scripts/entrypoint.sh /entrypoint.sh
 ARG http_proxy
 ARG https_proxy
 RUN apt-get update && apt-get install --no-install-recommends -y \
     &&  python-rosdep \
 	 && mkdir -p /opt/test  \
     && rm -rf /var/lib/apt/lists/*
 RUN apt-get update	\ 
    && git config --global http.proxy $http_proxy \
    && git config --global https.proxy $http_proxy  \
    && git clone https://github.com/test \
    && git config --global --unset http.proxy \
    && git config --global --unset https.proxy \	 
	
 FROM test/dock:v1 as Builder
 COPY --from=RunData /opt/test/ /opt/test/
 COPY --from=RunData /entrypoint.sh /entrypoint.sh
 ENTRYPOINT '/entrypoint.sh'

docker build 命令

 docker build 命令用于使用 Dockerfile 创建镜像
   说明 --rm :设置镜像成功后删除中间容器
    -t , --tag: 镜像的名字及标签,通常 name:tag 或者 name 格式;
	--build-arg=[] :设置镜像创建时的变量
	 --no-cache=true来强制重新生成中间镜像 Docker 一开始的设计既考虑了外部依赖的问题,用户可以使用参数 --no-cache 确保获取最新的外部依赖
	 如RUN apt-get update,那么随着时间的推移,基于同一个基础镜像,一年的 apt-get update 和一年后的 apt-get update, 
	 由于软件源软件的更新,从而导致产生的镜像理论上应该不同。
	 如果继续使用 cache 机制,将存在不满足用户需求的情况
	 

  docker build -t  test:v1
        --no-cache --rm\
        --build-arg NAMR_ID=exp\
		--build-arg http_proxy="10.10.10.11" \
        --build-arg https_proxy="10.10.10.11" \
        --add-host  test.com:10.10.10.10\
        .

检查

 docker inspect container_id
 docker  history 	 

docker run 命令

说明: -i: 以交互模式运行容器,通常与 -t 同时使用 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
docker run /bin/bash \
  --entrypoint  ""\
  --gpus all \
  -it \
  -e user_id=001 \
  -v /data:/data \
  -w /test \
  --name "test" \
  test:v1

Linux

  01.unset  http_proxy  unset https_proxy,
  02.export  http_proxy="" ,问题未解;
  03. /etc/enviroment  中的代理去掉

构建镜像的方式

 方式一: 手动构造-探索各种情况
     docker commit 
	 docker save -o   docker load -i  
	 docker push
   
 方式二: Dockerfile构建   
      docker build -t myimage:latest .
      
	 1.案例
		/bin/sh: 1: source: not found
		SHELL ["/bin/bash", "-c"]
		RUN  bash /opt/miniconda.sh -p  /opt/miniconda -b 
		ENV PATH=/opt/miniconda/bin:${PATH}
		RUN conda init
		RUN  source activate base && conda install image -y && pip install numpy
	2.编译
	  RUN  /bin/bash -c ' ./compile.sh'

命令执行模式

exec 模式和 shell 模式的写法
      exec 模式的特点是不会通过 shell 执行相关的命令所以像 $HOME 这样的环境变量是取不到的
	       使用 exec 模式 PID 为 1 的进程为业务本身
		   CMD ["./app"]
      使用 shell 模式时,docker 会以 /bin/sh -c “task command” 的方式执行任务命令 
	      使用 shell 模式,PID 为 1 的进程为 shell
		  CMD ./app
		  
直接启动应用和通过脚本启动区别	
   
 
shell中添加一个 exec 即可让应用进程替代当前shell进程,可将SIGTERM信号传递到业务层,让业务实现优雅关闭。
	 bash 或 sh 或 shell script 执行时,另起一个子shell,其继承父shell的环境变量,其子shell的变量执行完后不影响父shell。
	 exec是用被执行的命令行替换掉当前的shell进程(当前shell进程会被关闭),且exec命令后的其他命令将不再执行
		   一般将exec命令放到一个shell脚本中,用主脚本调用这个脚本,调用处可以用bash  xx.sh(xx.sh为存放exec命令的脚本),
		   这样会为xx.sh建立一个子shell去执行,当执行exec后该子脚本进程就被替换成相应的exec的命
		   #!/bin/sh
            exec ./app
            shell 中添加一个 exec 即可让应用进程替代当前 shell 进程,可将 SIGTERM 信号传递到业务层,让业务实现优雅关闭

环境

 /bin/bash:使用的是 Bash Shell,应该可以使用 source
 /bin/sh:使用的是 POSIX Shell,可能不支持 source,需要用 . 命令代替
 /bin/zsh:使用的是 Zsh,支持 source 
    source 命令时遇到错误,比如权限问题或者脚本语法错误
	    保脚本文件具有执行权限。你可以使用 chmod 命令来添加执行权限:
    /bin/sh: 1: source: not found
	
	/bin/sh:1 : setup.bash :Bad substitution
	/bin/sh:1 : setup.bash :builtin:not found		
	  Bash 脚本中出现 :Bad substitution 错误通常是因为使用了不正确的变量替换语法。
	    这种错误经常出现在使用了不兼容的 Bash 版本或者在不支持某些特定语法的环境中运行脚本时。

/bin/bash

使用 -c 参数和不使用 -c 参数的主要区别在于命令的解析方式和执行环境
/bin/bash -c
   将双引号内的字符串作为完整的命令解析并执行,支持多命令组合(如 &&、|)。
    参数传递时,第一个参数会赋值给 $0(通常为脚本名),后续参数从 $1 开始。
	bash -c 'echo "脚本名:$0, 参数1:$1"' script_name arg1
	使用 -c:适合动态命令、参数化脚本调用或需要隔离环境的场景
/bin/bash
        /bin/bash -c是一个Linux命令,它的作用是在一个新的Bash shell中执行给定的命令。
	       其中 /bin/bash 是Bash shell的路径,-c是一个选项,表示后面跟着的是要执行的命令。
        直接解释脚本文件,继承当前 Shell 的环境变量(除非脚本内显式修改
		
    bash -c './script.sh' 要求脚本有可执行权限,而 bash script.sh 不需要		

python执行脚本

   source is a bash builtin command (type help source in bash) but the default shell is /bin/sh that doesn't understand it (/bin/sh uses .).
       type source 
       source is a shell builtin
   Assuming there could be other bash-ism in the_script.sh, it should be run using bash:
    foo = subprocess.run("source the_script.sh", shell=True, executable="/bin/bash")
       See the shell and executable arguments for additional differences from the default behavior. 
       Unless otherwise stated, it is recommended to pass args as a sequence
	. If shell=True, on POSIX the executable argument specifies a replacement shell for the default /bin/sh.
	Changed in version 3.6: executable parameter accepts a path-like object on POSIX.
    Changed in version 3.8: executable parameter accepts a bytes and path-like object on Windows.
	Changed in version 3.12: Changed Windows shell search order for shell=True.
posted @ 2022-06-16 17:50  辰令  阅读(71)  评论(0)    收藏  举报