dockerfile 文件中的常见指令:
-
ADD
:复制和解包文件 -
COPY
:复制文本 -
CMD
:指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代 -
ONBUILD
:当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令 -
ENTRYPOINT
:指定这个容器启动的时候要运行的命令, 可以追加命令 -
ENV
:设置环境变量 -
EXPOSE
:暴露端口 -
FROM
:我们的镜像必须先指定一个基础的镜像,这个指令必须放在第一行。一般我们的软件官方都会提供镜像版本。建议使用官方镜像,比较安全。
FROM [--platform=]
说明:
--platform 指定镜像的平台,比如:linux/amd64, linux/arm64, or windows/amd64
tag 和 digest是可选项,如果不指定,默认为latest
FROM scratch :所有镜像的起源镜像,相当于Object类 -
LABEL
:指定镜像元数据
STOPSIGNAL
USER -
VOLUME
:挂载点 -
WORKDIR
:指定工作目录 -
MAINTAINER
: 指定维护者信息:MAINTAINER dongmu
尝试自己 写一个镜像
- 编写镜像文件
[root@iZwz9hv1phm24s3jicy8x1Z dongmu]# mkdir mydockerfile
[root@iZwz9hv1phm24s3jicy8x1Z dongmu]# ls
docker-test-volume jdk1.8.0_121 jdk-8u121-linux-x64.tar.gz mydockerfile
[root@iZwz9hv1phm24s3jicy8x1Z dongmu]# cd mydockerfile/
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# ls
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]#
下面开始编写文件
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# vim mydockerdile-centos
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# cat mydockerdile-centos
FROM centos:7
MAINTAINER dongmu<2645990605@QQ.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end---------"
CMD /bin/bash
- 通过镜像文件构建镜像
docker build -f mydockerdile-centos -t mydentos:0.1 .
- 进入镜像
docker run -it 镜像id
[root@6f41de40c64a local]# clear
[root@6f41de40c64a local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@6f41de40c64a local]# cd /
[root@6f41de40c64a /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@6f41de40c64a /]#
我们可以发现这里的clear等命令是可以执行的,但是我们启动下载的原来的镜像就不能使用这些命令。
我们还可以使用docker history 镜像id
来查看镜像的构建过程。
[root@iZwz9hv1phm24s3jicy8x1Z ~]# docker history 817d86b673e6
IMAGE CREATED CREATED BY SIZE COMMENT
817d86b673e6 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
94b9e5fee7ab 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
15b15043d1c5 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
abc8693de579 10 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
791dfaf03a57 10 minutes ago /bin/sh -c yum -y install net-tools 25MB
e987751ebbb5 10 minutes ago /bin/sh -c yum -y install vim 221MB
ac6f00156ede 10 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
00486cdea59f 10 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
d2eb48e93db3 10 minutes ago /bin/sh -c #(nop) MAINTAINER dongmu<2645990… 0B
eeb6ee3f44bd 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 7 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 7 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
我们还可以使用history来看一下别人的镜像是怎么写的
[root@iZwz9hv1phm24s3jicy8x1Z ~]# docker history c20987f18b13
IMAGE CREATED CREATED BY SIZE COMMENT
c20987f18b13 3 months ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 3 months ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 3 months ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 3 months ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 0B
<missing> 3 months ago /bin/sh -c #(nop) COPY file:345a22fe55d3e678… 14.5kB
<missing> 3 months ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B
<missing> 3 months ago /bin/sh -c { echo mysql-community-server m… 313MB
<missing> 3 months ago /bin/sh -c echo 'deb http://repo.mysql.com/a… 55B
<missing> 3 months ago /bin/sh -c #(nop) ENV MYSQL_VERSION=5.7.36-… 0B
<missing> 3 months ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=5.7 0B
<missing> 3 months ago /bin/sh -c set -ex; key='A4A9406876FCBD3C45… 1.84kB
<missing> 3 months ago /bin/sh -c apt-get update && apt-get install… 52.2MB
<missing> 3 months ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B
<missing> 3 months ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.17MB
<missing> 3 months ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B
<missing> 3 months ago /bin/sh -c apt-get update && apt-get install… 9.34MB
<missing> 3 months ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB
<missing> 3 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:bd5c9e0e0145fe33b… 69.3MB
CDM
和ENTRYPORT
的区别
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# vim mydockerfile-test
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# cat mydockerfile-test
FROM centos:7
CMD ["ls","-a"]
执行难我们的镜像
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# docker build -f mydockerfile-test -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos:7
---> eeb6ee3f44bd
Step 2/2 : CMD ["ls","-a"]
---> Running in 45b9f330703c
Removing intermediate container 45b9f330703c
---> 529bc50c275f
Successfully built 529bc50c275f
Successfully tagged cmdtest:latest
运行的时候就会发现执行了我们构建文件里面的代码
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# docker run 529bc50c275f
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
假如我们执行的时候想添加一个命令
[root@iZwz9hv1phm24s3jicy8x1Z ~]# docker run 529bc50c275f -l
docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
报错,这是因为-l会替换原来的CMD命令,而-l不是命令,所以把报错。
除非我们这样执行
[root@iZwz9hv1phm24s3jicy8x1Z ~]# docker run 529bc50c275f ls -al
total 64
drwxr-xr-x 1 root root 4096 Apr 14 14:03 .
drwxr-xr-x 1 root root 4096 Apr 14 14:03 ..
-rwxr-xr-x 1 root root 0 Apr 14 14:03 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Apr 14 14:03 dev
drwxr-xr-x 1 root root 4096 Apr 14 14:03 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 195 root root 0 Apr 14 14:03 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 11 root root 4096 Nov 13 2020 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Apr 14 14:03 sys
drwxrwxrwt 7 root root 4096 Nov 13 2020 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var
这样的话就要添加参数很麻烦
下面我们使用ENTRYPOINT来测试一下
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# vim mydocker
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# cat mydocker
FROM centos:7
ENTRYPOINT ["ls","-a"]
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# mv mydocker mydocker-entrypoint
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# ls
mydockerdile-centos mydocker-entrypoint mydockerfile-test
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# docker build -f mydocker-entrypoint -t centos-entrypoint .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos:7
---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in f4109c2db6ff
Removing intermediate container f4109c2db6ff
---> 8dc6dc13f20a
Successfully built 8dc6dc13f20a
Successfully tagged centos-entrypoint:latest
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-entrypoint latest 8dc6dc13f20a 21 seconds ago 204MB
cmdtest latest 529bc50c275f 21 minutes ago 204MB
tomcat02 1.0 558f9dd09adf 13 hours ago 684MB
tomcat latest fb5657adc892 3 months ago 680MB
redis latest 7614ae9453d1 3 months ago 113MB
mysql 5.7 c20987f18b13 3 months ago 448MB
centos 7 eeb6ee3f44bd 7 months ago 204MB
centos latest 5d0da3dc9764 7 months ago 231MB
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# docker run 8dc6dc13f20a
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@iZwz9hv1phm24s3jicy8x1Z mydockerfile]# docker run 8dc6dc13f20a -l
total 64
drwxr-xr-x 1 root root 4096 Apr 14 14:16 .
drwxr-xr-x 1 root root 4096 Apr 14 14:16 ..
-rwxr-xr-x 1 root root 0 Apr 14 14:16 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Apr 14 14:16 dev
drwxr-xr-x 1 root root 4096 Apr 14 14:16 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 193 root root 0 Apr 14 14:16 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 11 root root 4096 Nov 13 2020 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Apr 14 14:16 sys
drwxrwxrwt 7 root root 4096 Nov 13 2020 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var
可以发现我们的 -l指令一样不会报错,只是添到原来指令的后面。