dockerfile编写

news2024/11/25 4:56:54

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 /tmp

RUN 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/jdk

COPY 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/tomcat

CMD ["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.0

LABEL Name="node.js"
LABEL Version="16.18.1"

ENV NODEJS_PATH /usr/local/nodejs
ENV PATH ${NODEJS_PATH}/bin:$PATH

ADD    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-x64

RUN  ln -s  /usr/local/nodejs/bin/npm  /usr/local/bin
RUN  ln -s  /usr/local/nodejs/bin/npx  /usr/local/bin

CMD ["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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022最新iOS最新打包发布流程

关于如何发布iOS应用到App Stroe,苹果开发者中心已经给出了很详细的说明。和普通的iOS应用一样,使用React Native开发的iOS应用也需要使用普通的iOS应用的发布流程,总的来说,主要涉及以下几步: 加入苹果开发者计划&am…

【Android进阶之旅】内存泄漏的危害有哪些?(案例分析)

随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂; 开发人员在程序实现的过程中处理的变量也大量增加,如何有效进行内存分配和释放,防止内存泄漏的问题变得越来越突出 例如: 服务器应用软件&#x…

connection is being used##server is in use and cannot be deleted

mysql数据库被黑客挟持,删除我的数据库,让我用比特币来换,吓死我了,还好是测试库,删了就删了,数据库备份还得做好,密码不能设置太简单了。 下面是黑客留言: "以下数据库已被删…

64-65 - C++中的异常处理

---- 整理自狄泰软件唐佐林老师课程 1. C异常处理 1.1 try catch内容一 C内置了异常处理的语法元素 try catchtry语句用于处理正常代码逻辑catch语句用于处理异常情况 try语句中的异常由对应的catch语句处理 1.2 C通过throw语句抛出异常信息 1.3 C异常处理分析 throw抛出的…

【SSM注解汇总】

SSM注解汇总 文章目录SSM注解汇总MyBatis注解1. param("param1","param2",...)2. MapKey("id")Spring注解1. IOC Component Service Controller Repository2. 基于注解方式实现属性注入1)Autowired2)Qualifier3&#xff0…

Allegro铜皮动静态切换操作指导

Allegro铜皮动静态切换操作指导 Allegro支持铜皮的动静态相互切换,并且还可以批量操作,具体操作如下 动态切换成静态 以下面图片为例,这是个动态铜皮dynamic属性 点击选择铜皮命令 选中铜皮 右击选择change shape type 会出现一个弹窗警告,直接点击是 铜皮被change成…

海外仓物流有哪些优缺点

海外仓的优点:较低的物流成本、更有效率的送货时效、优质的仓储管理经验、订单处理省时省力、库存管理及盘点清晰明确、远程操作省时省力、自动快捷的退换货处理流程等。海外仓的缺点:存储压力大,库存成本高,资金运转不便等。海外…

微软威胁建模工具 STRIDE

威胁建模要回答的四个问题 what are we woking on what can go wrong what are we going to do about this did we do a good enough job 说到threat modeling 不得不提的就是微软的STRIDE 微软也提供了工具来做这个工作 Microsoft Threat Modeling Tool overview - Azur…

tictoc例子理解10-13

tictoc10-13tictoc 10 几个模块连接,发送消息直到模块3收到消息tictoc 11 新增信道定义tictoc 12 双向连接信息简化定义tictoc 10 几个模块连接,发送消息直到模块3收到消息 让我们用几个(n)’ tic’模块让它更有趣,并将每个模块连接到其他模…

基于Android的学生管理系统App设计与实现(Eclipse开发)

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 研究现状 1 1.2.1 教育系统发展现状 1 1.2.2 手机的应用市场发展现状 1 1.2.3 Android平台介绍 3 1.2.4 Android管理学生信息的意义 5 1.3.3 开发的环境及开发工具介绍 6 1.3 研究主要内容 6 2 相关技术介绍 7 2.…

安装 laravel 遇到的错误和解决方案

安装 laravel 遇到的错误和解决方案 纯粹是为了运行下 laravel,遇到了错误记录下,分享给需要的人。 下载 PHP Windows 版 ,我选择的版本是 PHP 7.4 (7.4.33)。下载文件以后找个文件夹解压就可以了。Composer 安装,官网 。 勾选以…

单元测试与数据库

单元测试 1.单元测试应该是全自动执行的,而非交互式的,应使用assert语句来验证结果而不是sout后进行人眼验证 2.为了保证单元测试可靠且便于维护,单元测试用例之间不能互相调用 3.单元测试是可重复执行的,不能受到外界环境的影响 4.单元测试代买必须写在src/test/java的工程…

【JAVA程序设计】基于SpringBoot+VUE的高校疫情打卡系统-前后端分离

基于SpringBootVUE的高校疫情打卡系统零、项目获取一、项目简介二、开发环境三、项目技术四、系统架构五、运行截图六、数据库设计零、项目获取 获取方式(点击下载):是云猿实战 项目经过多人测试运行,可以确保100%成功运行。 一…

【C++11重点语法】lambda表达式,初始化列表

目录 引子:C11为什么的源来 语法1:初始化列表 1.2.2 多个对象的列表初始化 语法3:默认成员函数控制(delete,default) 语法4:lambda表达式 引子:C11为什么的源来 在2003年C标准…

[附源码]计算机毕业设计springboot课室预约系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

用户体验设计笔记(1-1)

前言 ☔️只考虑体验的商业不可持续,只考虑商业的体验没有底线。         ☔️用户体验就是用户使用产品过程中积累起来的主管体验总和。 1 丨商业的天时:如何选择正确的体验策略? ☔️任何产品与服务,都是从用户场景的商业规…

小项目应该如何进行跨平台方案选型

作为一个小开发,近期完整的经历了,一个初创项目从搭建到推向市场的过程。实际上在整个过程中,开发只占很小的一个板块,尤其是对于我司这种初创型企业,人少钱少,每一分都得花到刀刃上,因此产品开…

新零售行业如何玩转线上服务

如今,随着市场的千变万化,企业的商业模式正在不断经历革新。如线上企业不再单纯走电商路线,纷纷进军线下卖场,而传统门店也在寻找线上突围的机会,通过与电商平台合作,开启线上专卖店。线上线下相结合的新零…

WebDAV之葫芦儿·派盘+静读天下

静读天下 支持webdav方式连接葫芦儿派盘。 如今,很多人都喜欢在手机上进行阅读,所以想要获得更好的阅读体验,一款实用的电子书就显得尤为重要了,因此,静读天下这款纯正的本地电子书阅读软件您值得拥有,而且还支持本地电子书备份到葫芦儿派盘。 静读天下是一款备受千万…

实例方法(instance method)、类方法、构造方法(三)

实例方法(没有static)的概念 对象被称为实例。实例相关的有:实例变量、实例方法。实例变量是对象变量。实例方法是对象方法。实例方法没有static。(对象方法,对象级别的方法) 实例方法的调用需要先new一个…