Dockerfile实践

文章目录

  • 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 pwdFROM 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 pwdFROM 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.mzph.cn/news/652370.shtml

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

相关文章

Docker—入门及Centos7安装

1、Docker入门 1.1、Docker是什么&#xff1f; Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship&#xff0c;and Run Any App,Anywhere”&#xff0c;也就是通过对应组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&…

docker环境搭建及其安装常用软件

centos安装docker Install Docker Engine on CentOS | Docker Docs 下载docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io…

JS如何上传视频后从视频截图到一张封面Cover?

文章目录 概要获取上传视频文件截图小结 概要 从上传视频文件中获取一张图片 获取上传视频文件截图 html片段&#xff0c;两个都是隐藏的 <!--自定义的上传视频标签--><input type"file" style"display: none" id"file" ref"uplo…

MongoDB本地部署并结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 4. 结语 前言 MongoDB是一个基于分布式文件…

TCP 三次握手 四次挥手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…

【前端基础--6】

对象 object // 定义一个obj来接收对象let obj {name: 咪咪,type: 布偶猫,like: [小鱼干, 猫条]}console.log(obj);// 取到obj里面name属性的值console.log(obj.name);// 使用大括号取值 括号内若不带引号&#xff0c;优先识别为变量console.log(obj[type]);// 通过等号进行…

【c语言】详解操作符(下)

前言&#xff1a; 在上文中&#xff0c;我们已经学习了 原码、反码、补码、移位 操作符、移位操作符、位操作符、逗号表达式、下标访问[ ]、函数调用&#xff08; &#xff09;&#xff0c;接下来我们将继续学习剩下的操作符。 1. 结构成员访问操作符 1.1 结构体成员的直接访…

台式电脑的ip地址在哪里找

在网络连接方面&#xff0c;IP地址是非常重要的信息&#xff0c;它是用于标识网络设备的唯一地址。对于台式电脑用户来说&#xff0c;了解自己设备的IP地址是非常有必要的&#xff0c;因为它可以帮助解决网络连接问题&#xff0c;进行远程访问和共享文件等功能。本文将指导读者…

深度学习知识

context阶段和generation阶段的不同 context阶段&#xff08;又称 Encoder&#xff09;主要对输入编码&#xff0c;产生 CacheKV(CacheKV 实际上记录的是 Transformer 中 Attention 模块中 Key 和 Value 的值&#xff09;&#xff0c;在计算完 logits 之后会接一个Sampling 采…

python脚本加密

在Python中&#xff0c;可以使用一些工具对脚本进行加密&#xff0c;以增加其安全性。以下是几种常用的加密方法&#xff1a; 使用PyInstaller或Py2exe将Python脚本转换为可执行文件&#xff1a; PyInstaller和Py2exe可以将Python脚本打包成一个独立的可执行文件。这样&#…

幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?

4核16G服务器是幻兽帕鲁Palworld推荐的配置&#xff0c;阿里云和腾讯云均推出针对幻兽帕鲁的4核16G服务器&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。云服务器吧yunfuwuqiba.com分享…

7.OpenResty系列之LuaRestyRedisLibrary

1. 连接需授权的redis server {location /redis1 {content_by_lua_block {local redis require "resty.redis"local red redis:new()-- 1秒red:set_timeout(1000) local ok, err red:connect("127.0.0.1", 6379)if not ok thenngx.say("failed to…

vue笔记(一):部署

首 文档 安装 1、安装nodejs&#xff08;链接&#xff09;&#xff0c;18.0以上版本。 2、在想要创建项目的目录下执行命令 npm create vuelatest 按提示创建项目&#xff0c;其中vue router是实现路由功能&#xff0c;pinia实现组件之间共享数据。如果项目需要两个功能建…

前端大厂面试题探索编辑部——第一期

目录 简介 题目 单选题 题解 A选项的Content-Security-Policy http-equiv属性 content属性 B选项的CSRF 使用CSRF Token 验证Referer和Origin头 C选项的HTTP Only D选项的防止SQL注入 输入验证和转义 简介 这个是一个长系列&#xff0c;我会以题目为导向&#xff…

LeetCode-题目整理【12】:N皇后问题--回溯算法

注意点&#xff0c;语法&#xff1a; 一定要记得初始化内层数组的长度&#xff1a;board[i] make([]rune, n)&#xff0c;否则就会报出现越界的错 // 第1步&#xff0c;初始化二维数组&#xff0c;内层数组长度为0&#xff0c;外层为nboard :make([][]rune,n)for i:0;i<n;i…

使用virtualenv管理python环境

Windows配置virtualenv 安装 pip install virtualenv virtualenvwrapper virtualenvwrapper-win设置WORK_HOME环境变量 在系统path变量中添加虚拟环境目录&#xff1a;键WORKON_HOMEC:dev\Envs 修改windows环境下mkvirtualenv.bat文件&#xff0c;配置虚拟环境根目录地址 配…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python进⾏网络监控?

如何使⽤Python进⾏⽹络监控&#xff1f; 使⽤Python进⾏⽹络监控可以帮助实时监视⽹络设备、流量和服务的状态&#xff0c;以便及时识别和解决问题。 以下是⼀般步骤&#xff0c;说明如何使⽤Python进⾏⽹络监控&#xff1a; 选择监控⼯具和库&#xff1a;选择适合⽹络监控需…

蓝桥杯省赛无忧 课件49 DFS-剪枝

01 数字王国之军训排队 02 特殊的三角形 03 特殊的多边形

优雅的python(二)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

【docker】linux系统docker的安装及使用

一、docker应用的安装 1.1 安装方式 Docker的自动化安装&#xff0c;即使用提供的一键安装的脚本&#xff0c;进行安装。 官方的一键安装方式&#xff1a;curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud一键安装命令&#xff1a;curl -s…