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
可以使用空格或等号将变量名称与值分开。
ENTRYPOINT (Default Command to Execute at Runtime)
ENTRYPOINT指令优先级更高 Docker run的优先级更高
可以在docker run命令中通过 --entrypoint 覆盖dockerfile文件中的ENTRYPOINT设置
--entrypoint \ 可以覆盖默认启动
--创建容器后,通过 dokcer ps查看容器信息时,COMMOND列会显示最终生效的启动命令。
-w 的workdir
取消设置变量”可能意味着两件事:
将其从环境中删除, -- 环境中不存在的变量
或将变量设置为空值。-- 环境中存在但设置为空值的变量
当您想通过将变量设置为空值来“取消设置”变量时,您必须使用等号语法,否则在构建时会出现错误。
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 \
.
说明
dockerfile ARG 多次相同参数名--下一次没有传递出来
ARG http_proxy
ARG https_proxy
ARG http_prox
ARG https_prox
ARG http_pro
ARG https_pro
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
查看镜像的Dockerfile
docker history [OPTIONS] IMAGE 该命令用于显示镜像的历史,查看镜像的历史变化
docker history --no-trunc a6038faa42f1
docker inspect [OPTIONS] NAME|ID [NAME|ID...] 该命令用于检查容器或镜像的详细信息。
docker inspect a6037faa22f1
参考
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/