Dockerfile实践

news2026/4/2 10:02:58

文章目录

  • 1、多阶段构建
  • 2、ADD 与 COPY 指令
    • 示例
  • 3、CMD指令
    • 示例
  • 4、ENTRYPOINT指令
    • 示例
  • 5、build-arg
  • 6、target与cache-from
  • 7、onbuild

1、多阶段构建

制作docker镜像时,遵循越小越好,尽量剔除不需要的内容。比如编译环境,程序编译完成之后就不需要了;所以引入多阶段构建剔除不需要的内容。

Docker 17.05版本以后,新增了Dockerfile多阶段构建。所谓多阶段构建,实际上是允许一个Dockerfile中出现多个 FROM 指令。

多个 FROM 指令的意义:
多个 FROM 指令并不是为了生成多根的层关系,最后生成的镜像,仍以最后一条 FROM 为准,之前的FROM 会被抛弃,那么之前的FROM 又有什么意义呢?
每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。

最大的使用场景是将编译环境和运行环境分离,比如,之前我们需要构建一个Go语言程序,那么就需要用到go命令等编译环境。

(1)准备工作:

# 创建一个目录
mkdir example3
cd example3
# 下载nginx源码包,作为素材
curl https://nginx.org/download/nginx-1.21.6.tar.gz > ./nginx-1.21.6.tar.gz
# 下载app代码
git clone https://gitee.com/nickdemo/helloworld

(2)多阶段构建dockerfile:

FROM golang:1.18
WORKDIR helloworld
COPY ./helloworld ./
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
RUN pwd

FROM alpine:latest
MAINTAINER fly
ENV env1=v1
ENV env2=v2
LABEL myhello 1.0.0
LABEL env prod
COPY --from=0 /go/helloworld/app ./
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

(3)也可以通过as关键词,为构建阶段指定别名,可以提高可读性:

FROM golang:1.18 as s0
WORKDIR helloworld
COPY ./helloworld ./
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
RUN pwd

FROM alpine:latest
MAINTAINER fly
ENV env1=v1
ENV env2=v2
LABEL myhello 1.0.0
LABEL env prod
COPY --from=s0 /go/helloworld/app ./
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

(4)构建镜像:

docker build -t hello:1.0.0 -f Dockerfile .

执行结果:

fly@fly:~/workspace/example01$ docker build -t hello:1.0.0 -f Dockerfile .
Sending build context to Docker daemon  5.477MB
Step 1/15 : FROM golang:1.18
1.18: Pulling from library/golang
32de3c850997: Pull complete 
fa1d4c8d85a4: Pull complete 
c796299bbbdd: Pull complete 
81283a9569ad: Pull complete 
c768848b86a2: Pull complete 
160a777925fe: Pull complete 
1be94824532a: Pull complete 
Digest: sha256:00d63686b480f6dc866e93ddc4b29efa2db03274a687e6495c2cfbfe615d638e
Status: Downloaded newer image for golang:1.18
 ---> fffd0d9a59da
Step 2/15 : WORKDIR helloworld
 ---> Running in 9bdebf03ec48
Removing intermediate container 9bdebf03ec48
 ---> 878591379507
Step 3/15 : COPY ./helloworld ./
 ---> 8815ef01802d
Step 4/15 : RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
 ---> Running in be7311d25498
Removing intermediate container be7311d25498
 ---> fa13f2963dcd
Step 5/15 : RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
 ---> Running in e21634b2c5d4
go: downloading github.com/gomodule/redigo v1.8.9
go: downloading github.com/spf13/viper v1.12.0
go: downloading github.com/fsnotify/fsnotify v1.5.4
go: downloading github.com/mitchellh/mapstructure v1.5.0
go: downloading github.com/spf13/afero v1.8.2
go: downloading github.com/spf13/cast v1.5.0
go: downloading github.com/spf13/jwalterweatherman v1.1.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
go: downloading golang.org/x/text v0.3.7
go: downloading github.com/subosito/gotenv v1.3.0
go: downloading github.com/hashicorp/hcl v1.0.0
go: downloading gopkg.in/ini.v1 v1.66.4
go: downloading github.com/magiconair/properties v1.8.6
go: downloading github.com/pelletier/go-toml/v2 v2.0.1
go: downloading gopkg.in/yaml.v3 v3.0.0
go: downloading github.com/pelletier/go-toml v1.9.5
Removing intermediate container e21634b2c5d4
 ---> 6a7e6063f490
Step 6/15 : RUN pwd
 ---> Running in 848c79ebce58
/go/helloworld
Removing intermediate container 848c79ebce58
 ---> 608d482ea60f
Step 7/15 : FROM alpine:latest
latest: Pulling from library/alpine
c158987b0551: Downloading 
latest: Pulling from library/alpine
c158987b0551: Pull complete 
Digest: sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4
Status: Downloaded newer image for alpine:latest
 ---> 49176f190c7e
Step 8/15 : MAINTAINER fly
 ---> Running in d565e1cc271a
Removing intermediate container d565e1cc271a
 ---> 9e9ec63b551d
Step 9/15 : ENV env1=v1
 ---> Running in e0a5042b97c3
Removing intermediate container e0a5042b97c3
 ---> 6dee9ea488b0
Step 10/15 : ENV env2=v2
 ---> Running in da53cf847942
Removing intermediate container da53cf847942
 ---> ddd5b4d87160
Step 11/15 : LABEL myhello 1.0.0
 ---> Running in bba6401b88f1
Removing intermediate container bba6401b88f1
 ---> e1ac5b88bac8
Step 12/15 : LABEL env prod
 ---> Running in 87c738df9400
Removing intermediate container 87c738df9400
 ---> 7ecca9ec9c29
Step 13/15 : COPY --from=0 /go/helloworld/app ./
 ---> ef139abadf70
Step 14/15 : EXPOSE 80
 ---> Running in 47b0d9e3fe01
Removing intermediate container 47b0d9e3fe01
 ---> ca1088ce8cf6
Step 15/15 : CMD ["./app","--param1=p1","--param2=p2"]
 ---> Running in f6e3dae8b214
Removing intermediate container f6e3dae8b214
 ---> 429a1b2d8c89
Successfully built 429a1b2d8c89
Successfully tagged hello:1.0.0

(5)docker images查看镜像。可以看到生成的镜像只有十几兆,不像上一篇中的至少1G多。同时可以看到一个 < none > 的的中间镜像,即s0阶段的镜像;这个镜像是多阶段构建抛弃的不需要的内容。

REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
hello                1.0.0     429a1b2d8c89   4 minutes ago   15.9MB
<none>               <none>    608d482ea60f   4 minutes ago   1.08GB
golang               1.18      fffd0d9a59da   2 days ago      965MB
alpine               latest    49176f190c7e   4 weeks ago     7.05MB

(6)运行镜像:

docker run -d -p 81:80 --name myhello hello:1.0.0

(7)测试镜像:

curl http://localhost:81/ping

测试结果

fly@fly:~/workspace/example01$ curl http://localhost:81/ping
ip = 172.17.0.2

2、ADD 与 COPY 指令

(1)ADD 与 COPY 不能拷贝上下文以外的文件。
COPY 命令语法格式:

COPY <src> <dest> 			//将上下文中源文件,拷贝到目标文件
COPY prefix* /destDir/ 		//将所有prefix 开头的文件拷贝到 destDir 目录下
COPY prefix?.log /destDir/ 	//支持单个占位符,例如 : prefix1.log、prefix2.log 等

ADD 命令语法:

ADD <src> <dest>

ADD 命令除了不能用在 multistage 的场景下,ADD 命令可以完成 COPY 命令的所有功能,并且还可
完成两类的功能:

  1. 解压压缩文件并把它们添加到镜像中,对于宿主机本地压缩文件,ADD命令会自动解压并添加到镜像。
  2. 从 url 拷贝文件到镜像中,需要注意:url 所在文件如果是压缩包,ADD 命令不会自动解压缩。

(2)对于目录而言,COPY 和 ADD 命令具有相同的特点:只复制目录中的内容而不包含目录自身。例如:

COPY srcDir /destDir/ //只会将源文件夹srcDir下的文件拷贝到 destDir 目录下

(3)COPY 区别于ADD在于Dockerfile中使用multi-stage。

FROM golang:1.18 as stage0
ADD ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM alpine:latest
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL hello 1.0.0
WORKDIR /app/
COPY --from=stage0 /go/src/helloworld/app ./
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

示例

(1)下载nginx tar.gz包作为素材。

curl https://nginx.org/download/nginx-1.21.6.tar.gz > ./nginx-1.21.6.tar.gz

(2)编写Dockerfile文件。

FROM golang:1.18 as stage0
# ADD ./helloworld /go/src/helloworld/
COPY ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM alpine:latest
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL hello 1.0.0
ADD https://nginx.org/download/nginx-1.21.6.tar.gz /soft/
COPY nginx-1.21.6.tar.gz /soft/copy/
ADD nginx-1.21.6.tar.gz /soft/add/
WORKDIR /app/
COPY --from=stage0 /go/src/helloworld/app ./
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

(3)构建镜像。

docker build -t hello:1.0.0 -f Dockerfile .

(4)运行容器。

docker run -d --name hello hello:1.0.0

(5)查看add和copy的文件。

docker exec -it hello /bin/sh

注意:目标文件位置要注意路径后面是否带 “/” ,带斜杠表示目录,不带斜杠表示文件名文件名里带有空格,需要再 ADD(或COPY)指令里用双引号的形式标明:

ADD "hello world.txt" "/tmp/hello world.txt"

3、CMD指令

CMD 指令有三种格式:

# shell 格式
CMD <command>
# exec格式,推荐格式
CMD ["executable","param1","param2"]
# 为ENTRYPOINT 指令提供参数
CMD ["param1","param2"]
  1. CMD 指令提供容器运行时的默认值,这些默认值可以是一条指令,也可以是一些参数。
  2. 一个dockerfile中可以有多条CMD指令,但只有最后一条CMD指令有效。
  3. CMD参数格式是在CMD指令与ENTRYPOINT指令配合时使用,CMD指令中的参数会添加到ENTRYPOINT指令中。一旦dockerfile文件中既存在ENTRYPOINT又存在CMD,那么CMD的作用只是为了提供参数,而不是为了运行指令的,CMD中的参数将作为ENTRYPOINT的默认参数,此外,如果在docker build的时候指定了参数,则ENTRYPOINT最终使用的参数就是docker build指定的参数
  4. 使用shell 和exec 格式时,命令在容器中的运行方式与RUN 指令相同。不同在于,RUN指令在构建镜像时执行命令,并生成新的镜像。
  5. CMD指令在构建镜像时并不执行任何命令,而是在容器启动时默认将CMD指令作为第一条执行的命令。如果在命令行界面运行docker run 命令时指定命令参数,则会覆盖CMD指令中的命令。

示例

FROM golang:1.18 as stage0
ADD ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM alpine:latest
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL hello 1.0.0
WORKDIR /app/
COPY --from=stage0 /go/src/helloworld/app ./
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]

构建镜像和运行:

docker build -t hello:1.0.0 .
# 指定启动命令和参数,需要加上./app
docker run -d -p 80:80 hello:1.0.0 ./app --param1=1 --param2=2
# 指定启动命令为sh
docker run -dit -p 80:80 hello:1.0.0 sh

说明:

如果是使用CMD,则在docker run时如果想覆盖dockerfile文件中的参数,必须要加上./app来运行程序

访问:

curl http://localhost/print/startup

执行结果:

$ curl http://localhost/print/startup
start up params:     param1 = 1 and param2 = 2 

4、ENTRYPOINT指令

ENTRYPOINT指令有两种格式:

# shell 格式
ENTRYPOINT <command>
# exec 格式,推荐格式
ENTRYPOINT ["executable","param1","param2"]
  1. ENTRYPOINT指令和CMD指令类似,都可以让容器每次启动时执行相同的命令,但它们之间又有不同。一个Dockerfile中可以有多条ENTRYPOINT指令,但只有最后一条ENTRYPOINT指令有效。
  2. 当使用shell格式时,ENTRYPOINT指令会忽略任何CMD指令和docker run 命令的参数,并且会运行在bin/sh -c中。
  3. 推荐使用exec格式,使用此格式,docker run 传入的命令参数将会覆盖CMD指令的内容并且附加到ENTRYPOINT指令的参数中。
  4. CMD可以是参数,也可以是指令,ENTRYPOINT只能是命令;docker run 命令提供的运行命令参数可以覆盖CMD,但不能覆盖ENTRYPOINT。
  5. 一旦dockerfile文件中既存在ENTRYPOINT又存在CMD,那么CMD的作用只是为了提供参数,而不是为了运行指令的,CMD中的参数将作为ENTRYPOINT的默认参数,此外,如果在docker build的时候指定了参数,则ENTRYPOINT最终使用的参数就是docker build指定的参数。
  6. NTYRPOINT的使用场景是docker run启动程序时需要带上一些参数,使用ENTRYPOINT就不需要在docker run传参数给到ENTRYPOINT时添加./app了。
  7. 可以通过docker run --entrypoint 替换容器的入口程序。

示例

FROM golang:1.18 as stage0
ADD ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM alpine:latest
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL hello 1.0.0
WORKDIR /app/
COPY --from=stage0 /go/src/helloworld/app ./
EXPOSE 80
ENTRYPOINT ["./app","--param1=p1","--param2=p2"]

构建和运行:

docker build -t hello:1.0.0 .
# 指定启动参数,不需要加上./app
docker run -d -p 80:80 hello:1.0.0 --param1=1 --param2=2
# 指定入口程序为sh
docker run -dit -p 80:80 --entrypoint sh hello:1.0.0

5、build-arg

dockerfile 预定义参数:HTTP_PROXY,http_proxy,HTTPS_PROXY,https_proxy,FTP_PROXY,ftp_proxy,NO_PROXY,no_proxy,ALL_PROXY,all_proxy。预定义参数,可直接在dockerfile中使用,无需使用arg来声明。

FROM golang:1.18 as s0
ADD ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
# RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN go env -w GOPROXY=$http_proxy
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM alpine:latest as s1
ARG wd label tag
RUN echo $wd,$label,$tag
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL $label $tag
WORKDIR $wd
COPY --from=stage0 /go/src/helloworld/app ./
EXPOSE 80
ENTRYPOINT ["./app","--param1=p1","--param2=p2"]

构建:

docker build -t hello:1.0.0 --build-arg "http_proxy=https://proxy.golang.com.cn,https://goproxy.cn,direct" --build-arg "wd=/home/app/" --build-arg "label=myhello" --build-arg "tag=1.0.0" --no-cache .

6、target与cache-from

对于多阶段构建,可以通过–target指定需要重新构建的阶段。–cache-from 可以指定一个镜像作为缓存源,当构建过程中dockerfile指令与缓存镜像源指令匹配,则直接使用缓存镜像中的镜像层,从而加快构建进程。可以将缓存镜像推送到远程注册中心,提供给不同的构建过程使用,在使用前需要先pull到本地。

FROM golang:1.18 as s0
ADD ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM alpine:latest as s1
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL hello 1.0.0
WORKDIR /app
COPY --from=s0 /go/src/helloworld/app ./
EXPOSE 80
ENTRYPOINT ["./app","--param1=p1","--param2=p2"]

构建:

# 重新构建s0阶段的镜像,可以将此镜像重新打个tag然后push到远端供多人共享
docker build -t prehello:1.0.0 --target s0 .
# 引用s0阶段的镜像并重新构建s1
docker build -t hello:1.0.0 --cache-from prehello:1.0.0 --target s1 .

说明:

  1. 本地如果不存在s0阶段的镜像的话,引用s0阶段的镜像重新构建s1的时候每次都会重新构建s0,因为本地不存在s0阶段的镜像
  2. 本地如果存在s0阶段的镜像,引用s0阶段的镜像就不需要重新构建s0了

7、onbuild

onbuild指令将指令添加到镜像中,当镜像作为另一个构建的基础镜像时,将触发这些指令执行。触发指令将在下游构建的上下文中执行。注意:onbuild指令不会影响当前构建,但会影响下游构建。

(1)生成自定义基础镜像:

FROM golang:1.18
ONBUILD ADD ./helloworld /go/src/helloworld/
ONBUILD WORKDIR /go/src/helloworld
ONBUILD RUN go env -w
GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
ONBUILD RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .

构建:

docker build -t mygolang:1.0.0 .

(2)通过自定义基础镜像构建新的镜像:

FROM mygolang:1.0.0 as s0
FROM alpine:latest as s1
ENV env1=env1value
ENV env2=env2value
MAINTAINER nick
LABEL hello 1.0.0
WORKDIR /app
COPY --from=s0 /go/src/helloworld/app ./
EXPOSE 80
ENTRYPOINT ["./app","--param1=p1","--param2=p2"]

构建:

docker build -t hello:1.0.0 .

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

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

相关文章

任意一个函数都可以写成一个奇函数与一个偶函数之和的形式

定义 张宇30讲明确指出 f(x)f(-x)必定是偶函数 f(x)-f(-x)必定是奇函数 前提&#xff1a;定义域关于原点对称 由上述结论得到&#xff1a;任意一个函数都可以写成一个奇函数与一个偶函数之和的形式&#xff0c;即使该函数是非奇非偶的。 f(x) 1 2 \frac 12 21​[f(x) f(-x)]…

麒麟系统—— openKylin 安装 mongodb

麒麟系统—— openKylin 安装 mongodb 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载解压 MongoDB二、增加环境变量三、配置MongoDB创建数据目录创建日志文件运行 四、加入到服务中 MongoDB是一款高性能、开源的NoSQL数据库&#xff0c;因其灵活的数据结构、…

DCNv4:对视觉应用的动态和稀疏算子的重新思考

摘要 https://arxiv.org/pdf/2401.06197.pdf 我们介绍了可变形卷积v4&#xff08;DCNv4&#xff09;&#xff0c;这是一种高效且有效的运算符&#xff0c;专为广泛的视觉应用而设计。DCNv4解决了其前身DCNv3的局限性&#xff0c;通过两个关键改进&#xff1a;1. 去除空间聚合中…

java抽象类概述——abstract关键字用法

前言&#xff1a; 打好基础&#xff0c;daydayup! 抽象类 抽象类概述 在java中有一个关键字叫abstract&#xff0c;代表抽象的意思&#xff0c;可用abstract修饰类&#xff0c;成员方法。 抽象类修饰方法 在方法或类前加上abstract关键字 例1&#xff1a;修饰类&#xff08;在…

AI决策的解构与实践:初探可解释性技术(XAI)

随着人工智能&#xff08;AI&#xff09;技术在各个领域的广泛应用&#xff0c;解释性人工智能&#xff08;XAI&#xff09;的概念备受瞩目。作为开发者&#xff0c;我们深知AI系统的复杂性&#xff0c;以及对于用户和利益相关者来说理解AI决策过程的重要性。本文将深入探讨可解…

跟着pink老师前端入门教程-day12

二十六、HTML5CSS3的提高 1、HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以…

MyBatis详解(5)-- MyBatis注解

MyBatis详解&#xff08;5&#xff09; 注解映射器xml配置文件的缺陷&#xff1a;常用注解1.基本注解&#xff1a;实现简单的增删改查操作。Insert 新增Options(useGeneratedKeys true, keyProperty "主键属性") 主键回填SelectKey ( statement "自增规则&qu…

漏洞复现-EduSoho任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

强化合作!浪潮信息携手业界伙伴筑牢算力底座

以太平金融科技服务&#xff08;上海&#xff09;有限公司&#xff08;以下简称“太平金科”&#xff09;为例&#xff0c;在算力新型基础设施建设方面&#xff0c;该公司一直不遗余力。近日&#xff0c;该公司更携手全球领先的IT基础设施供应商浪潮信息&#xff0c;优化算力基…

腾讯云幻兽帕鲁服务器创建教程,附4核16G服务器价格表

腾讯云0基础搭建帕鲁服务器4C16G14M服务器稳定无卡顿&#xff0c;先下载SteamCMD&#xff0c;并运行&#xff1b;然后下载Palserver&#xff0c;修改服务ini配置&#xff0c;启动PalServer&#xff0c;进入游戏服务器。腾讯云百科txybk.com分享腾讯云创建幻兽帕鲁服务器教程&am…

【Apollo CyberRT】源码分析之 “component” 模块

代码位置 apollo/cyber/component 功能 在自动驾驶系统中&#xff0c;模块&#xff08;如感知、定位、控制系统等&#xff09;在 Cyber ​​RT 下以 Component 的形式存在。不同 Component 之间通过 Channel 进行通信。Component 概念不仅解耦了模块&#xff0c;还为将模块拆…

Maven入门及其使用

目录 一、Maven入门 1.1 初识Maven 1.2 Maven的作用 1.2.1 依赖管理 1.2.2 统一项目结构 1.2.3 项目构建 1.3 Maven坐标 1.4 Maven仓库 1.4.1 Maven仓库概述 二、Maven的下载与安装 2.1 安装步骤 2.1.1 解压安装&#xff08;建议解压到没有中文、特殊字符的路径下。&#xff09…

C语言-指针的基本知识(上)

一、关于内存 存储器&#xff1a;存储数据器件 外存 外存又叫外部存储器&#xff0c;长期存放数据&#xff0c;掉电不丢失数据 常见的外存设备&#xff1a;硬盘、flash、rom、u盘、光盘、磁带 内存 内存又叫内部存储器&#xff0c;暂时存放数据&#xff0c;掉电数据…

【MIdjourne基础】 |MIdjourney基础参数全解析,各类辅助知识

文章目录 1 参数列表1.1 基础参数列表 2 基础参数详解2.1 模型版本选择2.2 模型出图模式选择2.3 基础生图参数2.3.1 --ar2.3.2 --stylize2.3.3 --no2.3.4 --chaos2.3.5 --quality2.3.6 --stop2.3.7 --hd2.3.8 --repeat 1 参数列表 1.1 基础参数列表 模型版本选择 目标参数作…

Redis -- 前置知识

目录 简要 分布式系统 负载均衡 引入缓存 数据库分表 微服务 小结 简要 redis是存储数据在内存中, 定义变量就是在内存中, 但是redis是在分布式系统中, 才能真正发挥威力, 如果只是单机程序, 那么直接通过变量来存储数据的方式将是最优的选择. …

同为科技(TOWE)自动控制循环定时插座

随着科技的发展&#xff0c;智能化家居已成为我们生活的重要组成部分。作为国内领先的智能家居品牌&#xff0c;同为科技&#xff08;TOWE&#xff09;推出的自动控制循环定时插座&#xff0c;无疑将科技与生活完美地结合在一起。 1.外观设计 同为科技&#xff08;TOWE&#x…

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求

全能相似度计算与语义匹配搜索工具包,多维度实现多种算法,涵盖文本、图像等领域。支持文图搜索,满足您在不同场景下的搜索需求。 Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索 Similar…

Linux 驱动开发基础知识——总线设备驱动模型(七)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

一道CTF签到题

点击题目的签到&#xff0c;提示&#xff1a; 看来需要修改请求的源地址&#xff1a; 上来我先尝试了我最常用的xff&#xff0c;结果不行&#xff0c;于是尝试了其他的几个常用请求头&#xff1a; 1.host头 如果后端从host取值来判断是否是本地就可以通过此方法进行绕过&…

简洁思路推理 KMP 算法——子字符串匹配

例题 28. 找出字符串中第一个匹配项的下标 暴力遍历解法 枚举原串 ss 中的每个字符作为「发起点」&#xff0c;每次从原串的「发起点」和匹配串的「首位」开始尝试匹配&#xff1a; 匹配成功&#xff1a;返回本次匹配的原串「发起点」。 匹配失败&#xff1a;枚举原串的下一个…