一.系统环境

服务器版本 docker软件版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64

二.前言

创建容器需要镜像,镜像可以从各种Docker镜像仓库中下载,但是有时候镜像仓库里下载的镜像并不能满足我们的要求,这时我们可以构建自定义镜像满足我们的要求。

构建镜像需要我们编写Dockerfile,Dockerfile是由一组指令组成的文件,其每条指令对应Linux中的一条命令,Docker程序通过读取Dockerfile中的指令最终生成镜像。

三.镜像构建步骤

一般镜像构建步骤如下:

  1. 按照需求编写一个dockerfile文件
  2. docker build -f dockerfile 构建成为一个新镜像
  3. docker run 运行新镜像
  4. docker push 推送新镜像到镜像仓库给别人下载使用

四.dockerfile文件常用指令

4.1 dockerfile文件常用指令

FROM 基础镜像

MAINTAINER 镜像是谁写的,一般是姓名加邮箱

RUN 镜像构建的时候需要运行的命令

ADD 往基础镜像里加入文件,会自动解压文件

COPY 类似ADD,将我们文件拷贝到镜像中

WORKDIR 镜像的工作目录

VOLUME 挂载的目录,在一些程序里,需要持久化一些数据,比如数据库中存储数据的文件夹就需要单独处理,可以通过数据卷来处理这些问题。

EXPOSE 指定向外暴露的端口

CMD 指定这个容器启动的时候要运行的命令,如果有多个CMD指令,则只有最后一个生效

ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命, 这个会与CMD弄混淆

ONBUILD 当构建一个被继承dockerfile 这个时候就会运行ONBUILD

ENV 构建的时候设置环境变量

4.2 RUN、CMD、ENTRYPOINT的区别

RUN 会在现有的基础上新添一层layer,创建一个新的image。例如,它通常用于安装软件包。

CMD 设置默认命令或参数,可以在 docker 容器运行时从命令行覆盖。

ENTRYPOINT 配置将作为可执行文件运行的容器。

RUN有两种形式:

RUN <command> (shell form),比如:RUN apt-get update && apt-get install -y
RUN ["executable", "param1", "param2"] (exec form),比如:RUN ["apt-get", "install", "python3"]

CMD有三种形式:

CMD ["executable","param1","param2"] (exec form, preferred)

CMD ["param1","param2"] ,比如:CMD echo "Hello world" 

CMD command param1 param2 (shell form)

ENTRYPOINT有两种形式:

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred),比如:ENTRYPOINT ["/bin/echo", "Hello"]

ENTRYPOINT command param1 param2 (shell form)

五.构建centos镜像

5.1 构建一个可以使用ifconfig和ip a命令的centos镜像

查询ifconfig命令和ip a命令属于哪个安装包

[root@k8smaster ~]# rpm -qf `which ifconfig`
net-tools-2.0-0.22.20131004git.el7.x86_64 [root@k8smaster ~]# rpm -qf `which ip a`
/usr/bin/which: no a in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
iproute-3.10.0-87.el7.x86_64

创建Dockerfile文件

[root@k8smaster ~]# cat Dockerfile
#FROM指定基础镜像为hub.c.163.com/library/centos:latest
FROM hub.c.163.com/library/centos:latest
#MAINTAINER指定作者为LZ
MAINTAINER LZ
#RUN命令安装net-tools,iproute
RUN yum -y install net-tools
RUN yum -y install iproute
#CMD指定这个容器启动的时候要运行的命令为/bin/bash
CMD ["/bin/bash"]

根据Dockerfile文件构建镜像

docker build构建镜像,-t centos:v1表示生成镜像的名字 .当前目录,会自动找到Dockerfile文件

[root@k8smaster ~]# docker build -t centos:v1 .
Sending build context to Docker daemon 634.6MB
Step 1/5 : FROM hub.c.163.com/library/centos:latest
---> 328edcd84f1b
......
Successfully tagged centos:v1

查看最新构建成功的镜像

[root@k8smaster ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 95a27e59cc5b About a minute ago 486MB

查看镜像centos:v1的创建历史

[root@k8smaster ~]# docker history centos:v1
IMAGE CREATED CREATED BY SIZE COMMENT
95a27e59cc5b 2 minutes ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
c446bac1eae1 2 minutes ago /bin/sh -c yum -y install iproute 148MB
2f8fe7e8adfe 3 minutes ago /bin/sh -c yum -y install net-tools 145MB
1812802531f1 3 minutes ago /bin/sh -c #(nop) MAINTAINER LZ 0B
328edcd84f1b 4 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 years ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
<missing> 4 years ago /bin/sh -c #(nop) ADD file:63492ba809361c51e… 193MB

--rm生成临时容器,在容器里ifconfig和ip a命令都可以使用了

[root@k8smaster ~]# docker run -it --rm --name=test centos:v1
[root@2519d33cd64c /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.4 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:04 txqueuelen 0 (Ethernet)
RX packets 7 bytes 578 (578.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@2519d33cd64c /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
123: eth0@if124: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@2519d33cd64c /]# exit
exit

删除新构建的镜像

[root@k8smaster ~]# docker rmi centos:v1
Untagged: centos:v1
Deleted: sha256:95a27e59cc5b19c0c72d065e43e30627ee5ca46a71d3cf8cfed4ffa266809fae
Deleted: sha256:c446bac1eae161480d0b823fcfc7a4c6e8d4c58a4502750539ac796931acd6b0
Deleted: sha256:77d5ccf992f3e869abfb19b47f832f6e106c6724aabfd034e50525ef11fe8603
Deleted: sha256:2f8fe7e8adfe10d2536238adfbadc75e8cc51e3b32fef3486ee5dfcf81b56a32
Deleted: sha256:d736137a9b93443939b0ed77024b28d6908e9352297c7e578fce4ba0c2f8c54c
Deleted: sha256:1812802531f138dd688219ebc5777fc1bffd51e2db52e1e99fee0a84cce322f5

5.2 优化5.1构建的镜像

下载yum源

[root@k8smaster ~]# wget ftp://ftp.rhce.cc/k8s/*
--2021-12-31 15:51:29-- ftp://ftp.rhce.cc/k8s/*
=> “.listing”
正在解析主机 ftp.rhce.cc (ftp.rhce.cc)... 101.37.152.41
...... [root@k8smaster ~]# ls
CentOS-Base.repo epel.repo k8s.repo docker-ce.repo

把4个repo文件打包压缩

#归档压缩文件,并删除原文件
[root@k8smaster ~]# tar zcf repo.tar.gz *.repo --remove-files [root@k8smaster ~]# ls
repo.tar.gz

查看压缩包里的文件列表

[root@k8smaster ~]# tar tf repo.tar.gz
CentOS-Base.repo
docker-ce.repo
epel.repo
k8s.repo

编写Dockerfile文件

注意:多写一个RUN命令会多生成一层(layer),镜像会变大,有的docker版本不能写为RUN yum -y install net-tools iproute

#ADD repo.tar.gz /etc/yum.repos.d/ ADD命令可以把文件从物理机拷贝到容器里,COPY也可以,但是ADD可以自动解压文件,COPY不行
#ADD只能拷贝当前目录下的文件,不能写为ADD /opt/repo.tar.gz /etc/yum.repo.d/,这样会报错:找不到文件
[root@k8smaster ~]# cat Dockerfile1
FROM hub.c.163.com/library/centos:latest
MAINTAINER LZ
#删除基础镜像里自带的repo文件
Run rm -rf /etc/yum.repos.d/*
#把宿主机里的repo.tar.gz文件拷贝到/etc/yum.repos.d/目录下,并自动解压缩
ADD repo.tar.gz /etc/yum.repos.d/
#安装net-tools和iproute,并清除yum安装缓存
RUN yum -y install net-tools && \
yum -y install iproute && \
yum clean all
CMD ["/bin/bash"]

构建镜像

#-f 指定构建镜像的Dockerfile文件
[root@k8smaster ~]# docker build -t centos:v2 . -f Dockerfile1
Sending build context to Docker daemon 634.6MB
Step 1/6 : FROM hub.c.163.com/library/centos:latest
......
Successfully tagged centos:v2

查看新构建的镜像,新镜像比5.1章节构建的镜像体积小

[root@k8smaster ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v2 8077d58cb9b4 32 seconds ago 216MB

查看镜像创建历史

[root@k8smaster ~]# docker history centos:v2
IMAGE CREATED CREATED BY SIZE COMMENT
8077d58cb9b4 56 seconds ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
3c33ca486f1f 56 seconds ago /bin/sh -c yum -y install net-tools && y… 23.6MB
2331e6a96f1f About a minute ago /bin/sh -c #(nop) ADD file:53e452249ee7bf44e… 6.04kB
227b560a5ae3 About a minute ago /bin/sh -c rm -rf /etc/yum.repos.d/* 0B
8309f6dd578f About a minute ago /bin/sh -c #(nop) MAINTAINER LZ 0B
328edcd84f1b 4 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 years ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B
<missing> 4 years ago /bin/sh -c #(nop) ADD file:63492ba809361c51e… 193MB

5.3 构建centos镜像,在构建文件中指定运行用户,环境变量,数据卷

编写Dockerfile文件,在构建文件中指定运行用户,环境变量,数据卷

[root@k8smaster ~]# cat Dockerfile2
FROM centos:v2
MAINTAINER LZ
#创建用户lz
RUN useradd lz
#以lz用户运行
USER lz
#设定环境变量xx=147,yy=258
ENV xx=147
ENV yy=258
#定义数据卷
VOLUME ["/test","/test1"]
CMD ["/bin/bash"]

构建镜像

[root@k8smaster ~]# docker build -t uevc:v1 . -f Dockerfile2
Sending build context to Docker daemon 634.6MB
Step 1/8 : FROM centos:v2
---> 8077d58cb9b4
......
Step 8/8 : CMD ["/bin/bash"]
---> Running in 94d69df83e22
Removing intermediate container 94d69df83e22
---> e8416a912217
Successfully built e8416a912217
Successfully tagged uevc:v1

查看新创建的镜像

[root@k8smaster ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
uevc v1 e8416a912217 6 seconds ago 216MB

创建临时容器

[root@k8smaster ~]# docker run -it --rm uevc:v1
#查看定义的环境变量
[lz@1f8b1eb2cabb /]$ echo $xx $yy
147 258 #可以看到容器默认是以lz用户登录的
[lz@1f8b1eb2cabb /]$ ls /test /test1/
/test: /test1/: [lz@1f8b1eb2cabb /]$ exit
exit

创建临时容器,以root用户运行容器

#以指定用户运行
[root@k8smaster ~]# docker run -it --rm -u root uevc:v1
[root@60ca5ee61798 /]# id
uid=0(root) gid=0(root) groups=0(root)
[root@60ca5ee61798 /]#
[root@60ca5ee61798 /]# exit
exit

创建临时容器,-e xx=qwe -e yy=asd会覆盖镜像里定义的环境变量

#环境变量以 -e指定的为准
[root@k8smaster ~]# docker run -it --rm -u root -e xx=qwe -e yy=asd uevc:v1
[root@2f727b99e12f /]# echo $xx $yy
qwe asd
[root@2f727b99e12f /]#
[root@2f727b99e12f /]# exit
exit

5.4 构建可以ssh的centos镜像

查看ssh的运行进程

[root@k8smaster ~]# ps -ef | grep ssh
root 943 1 0 10:53 ? 00:00:00 /usr/sbin/sshd -D
root 1552 943 0 10:53 ? 00:00:00 sshd: root@pts/0
root 56191 1613 0 16:05 pts/0 00:00:00 grep --color=auto ssh

查看ssh的安装包

[root@k8smaster ~]# rpm -qf `which ssh `
openssh-clients-7.4p1-11.el7.x86_64 [root@k8smaster ~]# rpm -qf `which sshd`
openssh-server-7.4p1-11.el7.x86_64 [root@k8smaster ~]# rpm -qa | grep ssh
openssh-clients-7.4p1-11.el7.x86_64
libssh2-1.4.3-10.el7_2.1.x86_64
openssh-server-7.4p1-11.el7.x86_64
openssh-7.4p1-11.el7.x86_64
sshpass-1.06-2.el7.x86_64

查看ssh-keygen的帮助

[root@k8smaster ~]# ssh-keygen --help
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[-N new_passphrase] [-C comment] [-f output_keyfile]
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
ssh-keygen -i [-m key_format] [-f input_keyfile]
ssh-keygen -e [-m key_format] [-f input_keyfile]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-f known_hosts_file] [-l]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-f input_keyfile] [-g]
ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
[-j start_line] [-K checkpt] [-W generator]
ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]
[-O option] [-V validity_interval] [-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
file ...
ssh-keygen -Q -f krl_file file ...

编写Dockerfile文件

[root@k8smaster ~]# cat Dockerfile_ssh
FROM centos:v2
MAINTAINER LZ
#安装openssh,创建ssh公钥私钥,给root用户修改密码为qweasd,UseDNS no表示去掉远程ssh连接时的DNS域名解析
RUN yum -y install openssh-server openssh-clients && \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key && \
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key && \
echo qweasd | passwd --stdin root && \
sed -i '/UseDNS/cUseDNS no' /etc/ssh/sshd_config
#暴露22号端口
EXPOSE 22
#运行ssh
CMD ["/usr/sbin/sshd","-D"]

构建镜像

[root@k8smaster ~]# docker build -t centos:ssh . -f Dockerfile_ssh
Sending build context to Docker daemon 634.6MB
Step 1/5 : FROM centos:v2
---> 8077d58cb9b4
......
Step 5/5 : CMD ["/usr/sbin/sshd","-D"]
---> Running in bdd4b00e3402
Removing intermediate container bdd4b00e3402
---> 86e7b8ecb3ab
Successfully built 86e7b8ecb3ab
Successfully tagged centos:ssh

使用centos:ssh镜像运行容器

[root@k8smaster ~]# docker run -dit --restart=always --name=centos_ssh centos:ssh
d12172a25af5726cfc209d0ff3af803fbc403b617df04a013f4cae85423d4d44

查看容器IP为172.17.0.5

[root@k8smaster ~]# docker exec centos_ssh ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

直接ssh连接容器,root密码为qweasd

[root@k8smaster ~]# ssh 172.17.0.5
The authenticity of host '172.17.0.5 (172.17.0.5)' can't be established.
ECDSA key fingerprint is SHA256:wbRiKPZgpVAg/plN+HixD2GHPx37fzbKBajpU8m5wpY.
ECDSA key fingerprint is MD5:d0:33:07:03:f8:aa:fc:b5:41:d3:77:2b:75:c9:fe:2e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.5' (ECDSA) to the list of known hosts.
root@172.17.0.5's password: #成功连接到容器
[root@d12172a25af5 ~]# grep DNS /etc/ssh/sshd_config
UseDNS no [root@d12172a25af5 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever [root@d12172a25af5 ~]# exit
logout
Connection to 172.17.0.5 closed.

六.构建nginx镜像

6.1 构建一个自定义index.html文件的Nginx镜像

创建nginx的首页文件

[root@k8smaster ~]# cat index.html
<p>
hello gogogoogo<br>
<p/>

编写nginx的Dockerfile文件

[root@k8smaster ~]# cat Dockerfile_nginx
FROM centos:v2
MAINTAINER LZ
#安装Nginx
RUN yum -y install nginx
#复制index.html文件到/usr/share/nginx/html/下
COPY index.html /usr/share/nginx/html/
#暴露80端口
EXPOSE 80
#运行Nginx
CMD ["nginx","-g","daemon off;"]

构建nginx镜像

[root@k8smaster ~]# docker build -t nginx:v1 . -f Dockerfile_nginx
Sending build context to Docker daemon 634.6MB
Step 1/6 : FROM centos:v2
---> 8077d58cb9b4
......
Successfully built 5ea781a8ccd8
Successfully tagged nginx:v1

运行nginx容器,当修改容器里的配置文件,需要重启容器才能生效

[root@k8smaster ~]# docker run -dit --restart=always --name=nginx -p 8080:80 nginx:v1
57322f1ce0c62d7c906b875da60fada3e6381a1b988ed28a14f906ffb21db2f2

访问nginx

[root@k8smaster ~]# curl http://192.168.110.137:8080
<p>
hello gogogoogo<br>
<p/>

七.参考文档

https://codewithyury.com/docker-run-vs-cmd-vs-entrypoint/#:~:text=In a nutshell&text=CMD sets default command and,will run as an executable

构建自定义镜像并优化dockerfile文件的更多相关文章

  1. Docker学习(六)Dockerfile构建自定义镜像

    Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...

  2. Docker | 第五章:构建自定义镜像

    前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时 ...

  3. docker构建自定义镜像

    docker构建自定义镜像 要构建一个镜像,第一步准备所需要的文件,第二步编写Dockerfile文件,比如我现在构建一个java web镜像 第一步:准备java web工程的war包文件(这里假设 ...

  4. Dockerfile详解,以及构建自定义镜像

    Dockerfile使用 前面的操作我们一直下载下载官方已经构建好的镜像,直接下载后就可以run,如果我们想要在镜像中添加自己的应用,比如在tomcat中添加自己的app,构建一个自定义的镜像,那么我 ...

  5. Docker定制容器镜像(利用Dockerfile文件)

    1.创建Dockerfile文件 新建一个目录,在里面新建一个dockerfile文件(新建一个的目录,主要是为了和以防和其它dockerfile混乱 ) [root@docker01 myfiles ...

  6. Dockerfile自定义镜像

    一.镜像结构 镜像是将应用程序及其需要的系统函数库.环境.配置.依赖等打包而成 以MySQL为例: 如上图所示,镜像由多个层(Layer)构成,每个层包含不同的内容. 另外,某些层可以单独抽出,组成一 ...

  7. 『现学现忘』Docker基础 — 34、DockerFile文件详解

    目录 1.DockerFile文件说明 2.Dockerfile构建过程解析 (1)Docker容器构建三步骤 (2)Dockerfile文件的基本结构 (3)Dockerfile注意事项 (4)Do ...

  8. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

  9. 添加ssh服务构建新镜像-docker commit 方式01

    添加ssh服务构建新镜像-docker commit 方式 1:docker commit构建自定义镜像---一般不推荐使用这种方式构建新镜像 1:ubuntu基础镜像下载 ubuntu@ubuntu ...

  10. 【Docker】(6)---Dockerfile文件

    springboot项目打包镜像中的Dockerfile文件 在讲Dockerfile文件之前应该先讲下maven的一个插件叫:dockerfile-maven-plugin.他们是组合一起用的 一. ...

随机推荐

  1. js获取select标签的 value 和 text

    <select name="" id="test"> <option value="a1">yi</optio ...

  2. HarmonyOS属性动画开发示例(ArkTS)

      介绍 利用ArkUI组件不仅可以实现属性变化引起的属性动画,也可以实现父组件状态变化引起子组件产生动画效果,这种动画为显式动画.效果如图所示: 相关概念 显式动画:提供全局animateTo显式动 ...

  3. Vue3 + TypeScript 开发指南

    0x00 概述 阅读以下内容需要具备一定的 Vue2 基础 代码采用规范为:TypeScript + 组合式 API + setup 语法糖 (1)Vue3 简介 Vue3 第一个正式版发布于 202 ...

  4. 响应式系统与 React

    0x1 React 的历史与应用 应用场景 前端应用开发,如 Meta.Ins.Netflix 的网页版 移动原生应用开发,如 Ins.Discord 结合 Electron 进行桌面应用开发 发展历 ...

  5. 纯CSS实现带小三角提示框

    要实现在页面上点击指定元素时,弹出一个信息提示框.在前面的文章中,我们已经简单介绍了如何使用纯 CSS 创建一个三角形.本文在此基础上,记录如何使用 CSS 创建带三角形的提示框. 实现的原理是创建一 ...

  6. python异步字符串查找,asyncio和marisa_trie

    自然语言处理当中经常需要字符串的查找操作,比如通过查找返回字串在文本当中的位置,比如通过匹配实现的ner import pandas as pd import asyncio # data = pd. ...

  7. 同义词查找,关键词扩展,使用腾讯Tencent AILAB的800万词向量,gensim,annoy

    最近在做一个关键词匹配系统,为了更好的效果, 添加一个关键词扩展的功能.使用Tencent AIlab的800万词向量文件. 腾讯AILAB的800万词向量下载地址:https://ai.tencen ...

  8. async与await暂停作用

    1. async function Request () { await new Promise(res => { setTimeout(() => { console.log(1) re ...

  9. 欢迎 Llama 3:Meta 的新一代开源大语言模型

    介绍 Meta 公司的 Llama 3 是开放获取的 Llama 系列的最新版本,现已在 Hugging Face 平台发布.看到 Meta 持续致力于开放 AI 领域的发展令人振奋,我们也非常高兴地 ...

  10. ADBPG&Greenplum成本优化之磁盘水位管理

    ​简介:本文我们将通过一个实际的磁盘空间优化案例来说明,如何帮助客户做成本优化. ​ 作者 | 玉翮 来源 | 阿里技术公众号 一 背景描述 目前,企业的核心数据一般都以二维表的方式存储在数据库中.在 ...