dockerfile编写
创始人
2024-03-03 10:50:05
0

dockerfile编写

dcoker 的一个操作和交互的关系流程:
在这里插入图片描述

dockerfile 编写规则

  1. 习惯使用大写
  2. 非注释行第一行必须是FROM
  3. 文件名必须是dockerfile
  4. 指定一个专门的工作目录
  5. 所有引入的映射文件必须在这个工作空间目录下
  6. 工作空间不支持隐藏文件
  7. (.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
  8. 每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条

构建过程

编写一个dockerfile 文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库!)

dockerfile常用指令

FROM
指定基础镜像,必须要指定,格式: FROM :
MAINTAINER(构建指令)
设置镜像制作者的信息,
COPY(构建指令)
将本地文件拷贝到docker容器中去,且两者的目录结构是相同的,
目标路径不存在时会自动创建。当使用本地目录为源目录时,推荐使用COPY。
格式: copy
详解:复制本地主机的 下内容到镜像中的 ,目标路径不存在时,会自动创建。
:可以是 Dockerfile 所在目录的一个相对路径(文件或目录)
:可以是镜像内绝对路径,或者相对于工作目录(WORKDIR)的相对路径
路径:支持正则表达式, COPY test* /tmp

–from 指令:
表示将从from指定的构建阶段中寻找源文件:
栗子:

# 第一构建阶段:将仅用于生成 requirements.txt 文件
FROM tiangolo/uvicorn-gunicorn:python3.9 as requirements-stage
#将当前的工作目录设置为 /tmp
WORKDIR /tmpRUN touch requirements.txt
# 第二构建阶段,在这往后的任何内容都将保留在最终容器映像中FROM python:3.9  
# 将当前工作目录设置为 /code
WORKDIR /code# 从第一个阶段复制requirements.txt; 这个文件是只存在于前一个docker构建阶段的,所以使用--from-requirements-stage(第一节点的别称) 进行复制的原因,COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt  
# 运行命令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

LABEL
LABEL指令,是将元数据添加到镜像,label是键值对的方式,其中有空格的话,需要进行\转义,
例子: LABEL version=“1.0”
一个镜像可以有多个标签,可以指定多个,
基础或父镜像中包含的标签将由您的镜像继承,如果标签已经存在了但具有不同的值,则以最近的为准.

RUN命令
格式为RUN 或RUN [“executable”,“param1”,“param2”]。

前者将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如:
RUN [“/bin/bash”,“-c”,“echo hello”]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行,例如:RUN echo “hello world\nhello tom” > /tmp/abc &&
cat /tmp/abc

CMD指令

CMD ["executable","param1","param2"]使用exec执行,推荐方式
CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用
CMD ["param1","param2"]提供给ENTRYPOINT的默认参数

CMD用于指定启动容器时默认要执行的命令,每个dickerfile只能有一条cmd命令,如果被指定了多条指令,只会有最后一条被执行,同时如果用户在命令行指定了新的cmd将会覆盖掉文件里面的cmd.

EXPOSE
EXPOSE 22 80 8443
指定容器暴露的对外端口号,

ARG
表示当前构建过程中使用的环境变量, ARG user=root
当镜像构建编译成功之后,指定的变量就不会存在,ENV指定的变量是会一直存在,
而它只存在于镜像构建的过程中,
生效范围:

  1. 如果在FROM指令之前指定,那么就只能用于FROM指令中,后面的其他程序是不能够引用的,
  2. 一般的定义与FROM之后,供全局变量引用使用,.

ENV
指定一个环境变量,会被run 运行的命令使用,并一直保持,

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD
该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(会自动解压为目录)。copy指令不会解压,

ENTRYPOINT
ENTRYPOINT有两种格式:

ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2(在shell中执行)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。

VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和保持的数据.
USER
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
RUN groupadd -r postgres && useradd -r -g postgres postgres
要临时获取管理员权限可以使用gosu,而不推荐sudo。如果不指定,容器默认是root运行。

WORKDIR
格式为 WORKDIR /path/to/workdir。
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

则最终路径为/a/b/c。

ONBUILD
配置当所创建的镜像作为其他镜像的基础镜像的时候,所执行的操作指令,

**STOPSIGNAL **
该指令是表示向容器中发送信号,缺省信号为SIGTERM
其中可以是kill -l信号也可以是数字,
docker run命令的选项可以覆盖掉镜像定义的STOPSTGNAL信号
在docker stop停止运行容器的时候指定发送给容器里pid为1的角色信号,默认超时10秒,超时就会发送kill强杀进程,一般的业务进程都是pid为1,所有的官方的进程都吹处理收到的SIGTERM信号进行优雅的收尾退出

构建命令
Dockerfile是一个用来构建镜像的文本文件,在docker客户端命令行中我们可以通过docker build 命令使用Dockerfile文件来创建镜像。
docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

build-arg=[] :设置镜像创建时的变量;

cpu-shares :设置 cpu 使用权重;

cpu-period :限制 CPU CFS周期;

cpu-quota :限制 CPU CFS配额;

cpuset-cpus :指定使用的CPU id;

cpuset-mems :指定使用的内存 id;

disable-content-trust :忽略校验,默认开启;

-f :指定要使用的Dockerfile路径;

force-rm :设置镜像过程中删除中间容器;

isolation :使用容器隔离技术;

label=[] :设置镜像使用的元数据;

-m :设置内存最大值;

memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;

no-cache :创建镜像的过程不使用缓存;

pull :尝试去更新镜像的新版本;

quiet, -q :安静模式,成功后只输出镜像 ID;

rm :设置镜像成功后删除中间容器;

shm-size :设置/dev/shm的大小,默认值是64M;

ulimit :Ulimit配置。

tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

network: 默认 default。在构建期间设置RUN指令的网络模式

例:
构建当前目录下的dockerfile,构建后的镜像版本是runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1 .

dockerfile实例

#base images
FROM  centos:7#下载基础工具
RUN     cd /etc/yum.repos.d/ 
RUN        sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* 
RUN        sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum install -y net-tools vim  # 设置环境变量
ENV  GOROOT=/usr/local/go/go
ENV PATH=$PATH:$GOROOT/bin## 拷贝压缩包到指定目录并解压
ADD /usr/local/go/go1.11.5.linux-amd64.tar.gz  /usr/local/go/ ## 拷贝一个脚本文件过去
COPY  crub_innode.sh /root ## 设置工作目录
WORKDIR /root## 开放端口
EXPOSE 80 ## 启动执行的命令: 
ENTRYPOINT [ "sh","-c",   "echo hello test container"  ]

docker file 练习

**构建命令: **

构建Tomcat镜像:

#基础镜像centos
FROM  centos:v1#下载基础工具
RUN         cd /etc/yum.repos.d/ 
RUN        sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* 
RUN        sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum install -y net-tools vim rpm  alien
RUN yum -y install alien
WORKDIR /usr/local/jdkCOPY jdk-8u341-linux-x64.rpm /usr/local/jdk/
RUN rmp -ivh jdk-8u341-linux-x64.rpm  && java  WORKDIR /usr/local/tomcat/ADD apache-tomcat-8.5.83.tar.gz /usr/local/tomcatCMD ["java"]
#开放端口
EXPOSE 8080
## 启动执行的命令: 
ENTRYPOINT [ "sh","-c",   "/usr/local/tomcat/apache-tomcat-8.5.83/bin/startup.sh"  ]

打包node16镜像docker file

FROM  harbor.etouch.cn/wlbasic/centos_7.6.1810:1.0LABEL Name="node.js"
LABEL Version="16.18.1"ENV NODEJS_PATH /usr/local/nodejs
ENV PATH ${NODEJS_PATH}/bin:$PATHADD    node-v16.18.1-linux-x64.tar.gz   ${NODEJS_PATH}
WORKDIR    ${NODEJS_PATH}
RUN  mv node-v16.18.1-linux-x64/*   ${NODEJS_PATH} && rm -rf node-v16.18.1-linux-x64RUN  ln -s  /usr/local/nodejs/bin/npm  /usr/local/bin
RUN  ln -s  /usr/local/nodejs/bin/npx  /usr/local/binCMD ["node"]
CMD ["npm"]

docker tag nodejs_16.18.1:v1 harbor.etouch.cn/wlbasic/nodejs:16.18.1_v1
docker push harbor.etouch.cn/wlbasic/nodejs:16.18.1_v1

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...