云计算_Dockerfile与代理


Dockerfile

01. 文件 Dockerfile
02.在Dockerfile文件所在目录 执行构建-- docker build .	
  the current directory (.) as build context 

命令解释
 docker build command builds an image from a Dockerfile
    RUN  CMD  ENTRYPOINT
	ARG  ENV
    ADD  COPY
	VOLUME
	WORKDIR  USER
	LABEL
	EXPOSE   :  docker run -p port:port 命令时任然可以指定容器占用的端口。
	STOPSIGNAL ONBUILD

镜像标签。一个镜像可以有多个标签。打标签时要在LABEL值中包含空格  tag
ENV VAR=1与ENV VAR 1
  可以使用空格或等号将变量名称与值分开。	

取消设置变量”可能意味着两件事:

  将其从环境中删除,  -- 环境中不存在的变量
  或将变量设置为空值。-- 环境中存在但设置为空值的变量
  当您想通过将变量设置为空值来“取消设置”变量时,您必须使用等号语法,否则在构建时会出现错误。
   ENV NOT_SENSITIVE=
   或者 
   ENV NOT_SENSITIVE ""  
 从技术上讲,这是两种不同的操作	
 unset NOT_SENSITIVE作为一个 shell 命令执行除了在这个 shell 中执行的内容之外不会影响其他任何事情
 
 要防止变量出现在 Docker 生成的层中。
   使用docker build --secret=和RUN --mount=type=secret...。

方式

在映像构建期间需要 env vars 但它们不应该持续存在
# set proxy
ARG http_proxy
ARG https_proxy
ENV http_proxy=$http_proxy
ENV https_proxy=$http_proxy 
	
	
# unset proxy
ENV http_proxy=
ENV https_proxy=

编译文件
docker build -t the-image \
    --build-arg http_proxy="$http_proxy" \
    --build-arg https_proxy="$http_proxy" \
    --build-arg no_proxy="$no_proxy" \
    --no-cache \
    .

Docker 镜像体积优化

有效精简docker镜像,从而提高自动化运维过程中的CI/CD效率,缩短交付时间
方向: 
  基础镜像小
  层级尽量少
  去除不必要
  复用镜像层
  分阶段构建

 1. 基础镜像源的选择
 2. .dockerignore
  .dockerignore文件和.gitrignore文件,也就是制作镜像时排除在外的文件
  创建一个名为.dockerignore的文件,把它放在当前的目录下即可,它的写法跟.gitignore文件很相似--即和Dockerfile相同目录下
   using ADD or COPY 命令时
 3.Dockerfile
     命令: 可以利用 ??&?? 来合并多个操作,减少层数	 
	 RUN、COPY、ADD指令会创建层,其他指令会创建临时的中间镜像,不会直接增加构建的镜像大小
 4.分阶段构建
 Multi-stage 构建镜像
  
 5.自动化的镜像瘦身工具docker-slim
   压缩镜像层级  docker-squash  : 压缩的原理是将镜像导出,然后删除所有中间层,将镜像的当前状态保存为单一层,达到压缩层级的效果

本地环境

console中执行
 使用代理执行:
 export http_proxy=http://127.0.0.1:80
 export https_proxy=http://127.0.0.1:80
 取消代理执行:
 export -n http_proxy
 export -n https_proxy
(针对当前窗口生效)

01.Dockerfile文件中使用本地代理(访问宿主机)

ENV http_proxy http://127.0.0.1:3001
ENV https_proxy https://127.0.0.1:3001

gpg: keyserver receive failed: Connection timed out	  
The command '/bin/sh -c apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys654' 
returned a non-zero code: 2

gpg和apt-key 代理的情况
 gpg和apt-key使不会直接读取终端中设置的代理,需要单独设置
 gpg --keyserver-options http-proxy=test.com:8080/" --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys SOMEKEY
 apt-key adv --keyserver-options http-proxy=test.com:8080/" --keyserver hkp://keyserver.ubuntu.com --recv-keys AKEYXXX
 
 Git设置代理
  # 使用代理
  && git config --global http.proxy "http://127.0.0.1:80" \
  && git config --global https.proxy "http://127.0.0.1:80" \
  # 下载
    git clone https://github.com/gperftools/gperftools.git -b gperftools --single-branch \
 #   取消代理
  && git config --global --unset http.proxy \
  && git config --global --unset https.proxy \

02.Docker-run

启动容器时,通过设置–env的flag,将环境变量传入容器
 –env HTTP_PROXY="http://127.0.0.1:3001"
 –env HTTPS_PROXY="https://127.0.0.1:3001"

Dockerfile的命令

01.不同点: 功能不同,运行的时间点不同,作用的有效范围不同,
 docker中arg和env的区别是:
  arg是在build的时候存在的,可以在Dockerfile中当做变量来使用,临时使用一下的变量没必要存环境变量的值就很适合使用 ARG
  而env是容器构建好之后的环境变量,不能在Dockerfile中当参数使用
  02.看	  
     Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/entrypoint.sh\": permission denied": unknown
    entrypoint.sh  要具有可执行权限  
 03.总结:
 01.相同文件--执行不了--看是否权限不一样
 02.下载文件--下载不了--看本地是否有权限
 03.文件下载到Windows 下,再上传到unix ,非压缩文件会出现 :set ff
  :sef ff=unix

参考

Debian/Ubuntu 对gpg和apt-key使用代理--报错解决:gpg: keyserver receive failed: Connection timed out https://blog.csdn.net/zhangpeterx/article/details/94870949
【dockerfile】 docker build 设置代理 https://blog.csdn.net/erhaiou2008/article/details/107837344
 如何在dockerfile中取消设置“ ENV”? https://qa.1r1g.com/sf/ask/3905258661/
  How to unset "ENV" in dockerfile?  https://stackoverflow.com/questions/55789409/how-to-unset-env-in-dockerfile
  https://docs.docker.com/engine/reference/builder/

相关