参考文章
RUN执行命令
RUN格式有两种
shell格式
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec格式,这更像是函数调用的风格
RUN ["可执行文件", "参数1", "参数2"]
ARG构建参数(声明build期间的变量名)
ARG用于声明一个变量名,例如,定义一个port的变量
ARG port
在docker build的时候,你可以通过命令行设置值,如
docker build --build-arg port=5000
但ARG只能在dockerfile中使用,即build期间使用
所以ARG变量的值,在容器中获取不到
ENV(给容器设置环境变量)
ENV用于定义环境变量,在docker run的时候ENV的配置会加载到容器的内部
ENV JAVA_HOME /usr/local/jdk1.8.0_171ENV PATH $JAVA_HOME/bin:$PATH
获取宿主机的环境变量
$MY_ENV_VAR
2022/1/14 ENV设置的环境变量,CMake读取不到!可以用这个代替
RUN echo 'GLAL_3rdlib_DIR="/glal"' >> /etc/environment \&& echo "source /etc/environment" >> ~/.bashrc
COPY复制文件
COPY有两种格式
COPY [--chown=<user>:<group>] <源路径>... <目标路径>COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
使用
- 源路径可以多个
- 甚至可以是通配符,通配符规则要满足Go的filepath.Match规则
- 如果源路径为文件夹,复制的时候不是直接复制该文件夹,而是将文件夹中的内容复制到目标路径
参数:COPY package.json /usr/src/app/COPY hom* /mydir/COPY hom?.txt /mydir/
--chown=<user>:<group>改变文件的所属用户及所属组COPY --chown=55:mygroup files* /mydir/ COPY --chown=bin files* /mydir/ COPY --chown=1 files* /mydir/ COPY --chown=10:11 files* /mydir/
ADD更高级的复制文件
ADD在COPY的基础上增加了一些功能
<源路径>可以是一个URL,下载后文件权限自动设置为600- 如果
<源路径>为压缩包,ADD可以自动解压
CMD容器启动命令
Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的
CMD指令的格式和RUN相似,也具有两种风格
shell风格:CMD <命令>exec风格:CMD ["可执行文件", "参数1", "参数2"...]
在运行时,可以指定新的命令,这个新的命令会替换掉CMD里设置的默认命令。
比如ubuntu镜像的CMD命令是CMD /bin/bash
- 运行
docker run -it ubuntu,则最后会运行/bin/bash,进入命令行 - 运行
docker run -it ubuntu cat /etc/os-release,则cat /etc/os-release会替换掉/bin/bash,最后输出了系统版本信息
WORKDIR指定工作目录
使用WORKDIR指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录
- 如该目录不存在,WORKDIR 会帮你建立目录
WORKDIR /app
