基本内容
${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.