Dockerfile

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行,例如:

RUN echo “hello world\nhello tom” > /tmp/abc && \

cat /tmp/abc

CMD


CMD支持三种格式:

  • CMD ["executable","param1","param2"]使用exec执行,推荐方式

  • CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用

  • CMD ["param1","param2"]提供给ENTRYPOINT的默认参数

例:

CMD [“/usr/local/apache/bin/apachectl”,“-D”,“FOREGROUND”] #-D 前台运行

CMD用于指定启动容器时默认要执行的命令,每个Dockerfile只能有一条CMD命令。

如果指定了多条命令,只有最后一条会被执行

如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令

EXPOSE


格式为EXPOSE <port> [<port>...]

例如:

EXPOSE 22 80 443

EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用。

在启动容器时通过-P,Docker主机会自动分配一个端口转发到指定的端口;

使用-p则可以具体指定哪个本地端口映射过来。

ENV


格式为ENV<key> <value>。指定一个环境变量,会被后续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- P G M A J O R / b i n : PG_MAJOR/bin: PGMAJOR/bin:PATH

ADD


格式为ADD<src> <dest>

该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件 (会自动解压为目录)

总结:

  • 自动解压

  • 只会把目录下的东西传输过去,并不会传输目录

  • 支持多个文件传输

  • 支持URL(不解压)

//文件

[root@localhost ~]# tree

.

|-- anaconda-ks.cfg

`-- test

|-- Dockerfile

|-- abc

|-- apr-1.7.0.tar.gz

`-- pkgs

`-- apr-1.7.0.tar.gz

[root@localhost ~]# cat test/Dockerfile

FROM centos

ADD apr-1.7.0.tar.gz abc /opt #ADD可以同时传输多个文件

[root@localhost ~]# docker build -t test:v0.1 test

Sending build context to Docker daemon 2.193MB

Step 1/3 : FROM centos

—> 5d0da3dc9764

Step 2/3 : ADD apr-1.7.0.tar.gz abc /opt/

—> 048e3bec84cd

Step 3/3 : RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && source ~/.bashrc

—> Running in 5f65acb72659

Removing intermediate container 5f65acb72659

—> 7286a154ca21

Successfully built 7286a154ca21

Successfully tagged test:v0.1

[root@localhost ~]# docker run -it --rm --name web test:v0.1

[root@baf3dbbe89dd /]# ls /opt/

abc apr-1.7.0

[root@baf3dbbe89dd /]# cat /opt/abc

hello world

//目录(只会把目录下的东西传输过去,并不会传输目录)

[root@localhost ~]# cat test/Dockerfile

FROM centos

ADD pkgs/ /opt

[root@localhost ~]# docker build -t test:v0.2 test

Sending build context to Docker daemon 2.193MB

Step 1/2 : FROM centos

—> 5d0da3dc9764

Step 2/2 : ADD pkgs /opt

—> 2ddffaba6407

Successfully built 2ddffaba6407

Successfully tagged test:v0.2

[root@localhost ~]# docker run -it --rm --name web test:v0.2

[root@8c6cc7ae6bd4 /]# ls /opt/

apr-1.7.0.tar.gz

//压缩包(如果传输一个压缩包,会自动解压)

[root@localhost ~]# cat test/Dockerfile

FROM centos

ADD apr-1.7.0.tar.gz /opt

[root@localhost ~]# docker build -t test:v0.3 test

Sending build context to Docker daemon 2.193MB

Step 1/2 : FROM centos

—> 5d0da3dc9764

Step 2/2 : ADD apr-1.7.0.tar.gz /opt

—> da77b2fe731a

Successfully built da77b2fe731a

Successfully tagged test:v0.3

[root@localhost ~]# docker run -it --rm --name web test:v0.3

[root@b2caede68a4c /]# ls /opt/

apr-1.7.0

//URL(不会解压)

[root@localhost ~]# cat test/Dockerfile

FROM centos

ADD https://archive.apache.org/dist/httpd/httpd-2.4.50.tar.gz /opt

[root@localhost ~]# docker build -t test:v0.4 test

Sending build context to Docker daemon 2.193MB

Step 1/2 : FROM centos

—> 5d0da3dc9764

Step 2/2 : ADD https://archive.apache.org/dist/httpd/httpd-2.4.50.tar.gz /opt

Downloading [==================================================>] 9.871MB/9.871MB

—> 0ac02d13a607

Successfully built 0ac02d13a607

Successfully tagged test:v0.4

[root@localhost ~]# docker run -it --rm --name web test:v0.4

[root@7f8d81c2286e /]# ls /opt/

httpd-2.4.50.tar.gz

COPY


格式为COPY<src> <dest>

复制本地主机的(为Dockerfile所在目录的相对路径,文件或目录)为容器中的。目标路径不存在时会自动创建。

当使用本地目录为源目录时,推荐使用COPY。 手动解压

总结:

  • /files 这里没有/(创建出来后是文件)

  • /files/(创建出来后是目录)

  • 支持多个文件传输

  • 手动解压

  • 本地目录为源目录时,推荐使用COPY

[root@localhost ~]# tree

.

|-- anaconda-ks.cfg

`-- test

|-- Dockerfile

|-- abc

|-- apr-1.7.0.tar.gz

`-- pkgs

`-- apr-1.7.0.tar.gz

//目标路径不存在时会自动创建(第一种情况)

[root@local

必看视频!获取2024年最新Java开发全套学习资料 备注Java

host ~]# cat test/Dockerfile

FROM centos

COPY apr-1.7.0.tar.gz /files #这里没有/(创建出来后是文件)

RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && \

source ~/.bashrc

[root@localhost ~]# docker build -t test:v0.7 test

Sending build context to Docker daemon 2.193MB

Step 1/3 : FROM centos

—> 5d0da3dc9764

Step 2/3 : COPY apr-1.7.0.tar.gz /files

—> Using cache

—> 5ee50e6b84d7

Step 3/3 : RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && source ~/.bashrc

—> Running in dd5295186a38

Removing intermediate container dd5295186a38

—> b3f1902ee5e3

Successfully built b3f1902ee5e3

Successfully tagged test:v0.7

[root@localhost ~]# docker run -it --rm --name web test:v0.7

[root@a9c3ab18f663 /]# ls

bin dev etc files home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

[root@a9c3ab18f663 /]# ls -l files

-rw-r–r–. 1 root root 1093896 Dec 8 11:04 files

[root@a9c3ab18f663 /]# mv files /opt/

[root@a9c3ab18f663 /]# tar xf files

[root@a9c3ab18f663 /]# cd /opt/

[root@a9c3ab18f663 opt]# ls

files

[root@a9c3ab18f663 opt]# tar -xf files

[root@a9c3ab18f663 opt]# ls

apr-1.7.0 files

//目标路径不存在时会自动创建(第二种情况)

[root@localhost ~]# cat test/Dockerfile

FROM centos

COPY apr-1.7.0.tar.gz abc /files/ #这里有/(创建出来后是目录) 同时可以传输多个文件

RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && \

source ~/.bashrc

[root@localhost ~]# docker build -t test:v0.10 test

Sending build context to Docker daemon 2.193MB

Step 1/3 : FROM centos

—> 5d0da3dc9764

Step 2/3 : COPY apr-1.7.0.tar.gz abc /files/

—> 9fd5cc116937

Step 3/3 : RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && source ~/.bashrc

—> Running in dc171c98ef6c

Removing intermediate container dc171c98ef6c

—> b4615103e56b

Successfully built b4615103e56b

Successfully tagged test:v0.10

[root@localhost ~]# docker run -it --rm --name web test:v0.10

[root@fa5ae8d0bad3 /]# ls files/

abc apr-1.7.0.tar.gz

[root@fa5ae8d0bad3 /]# cd files/

[root@fa5ae8d0bad3 files]# tar xf apr-1.7.0.tar.gz

[root@fa5ae8d0bad3 files]# ls

abc apr-1.7.0 apr-1.7.0.tar.gz

ENTRYPOINT


ENTRYPOINT有两种格式:

  • ENTRYPOINT["executable","param1","param2"]

  • ENTRYPOINT command param1 param2(在shell中执行)

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。ENTRYPOINT存放主程序

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。

示例:

//Dockerfile写的是600s,但在docker run 时提供的参数并不会覆盖,在 docker run 后面的参数只会被当作参数传递给ENTRYPOINT指定的程序

[root@localhost ~]# cat test/Dockerfile

FROM centos

RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && \

source ~/.bashrc

ENTRYPOINT sleep 600 #停止600s

[root@localhost ~]# docker build -t test:v0.12 test

Sending build context to Docker daemon 2.193MB

Step 1/3 : FROM centos

—> 5d0da3dc9764

Step 2/3 : RUN echo “alias ls=‘ls --color’” >> ~/.bashrc && source ~/.bashrc

—> Running in f488664525a8

Removing intermediate container f488664525a8

—> ceb379977318

Step 3/3 : ENTRYPOINT sleep 600

—> Running in e4f755f3f62c

Removing intermediate container e4f755f3f62c

—> 8929be2dc74f

Successfully built 8929be2dc74f

Successfully tagged test:v0.12

[root@localhost ~]# docker run -it --rm --name web test:v0.12 sleep 900 #休息900s 只会被当作参数传递给ENTRYPOINT指定的程序

[root@localhost ~]# docker inspect web

“Cmd”: [

“sleep”,

“900”

],

“Image”: “test:v0.12”,

“Volumes”: null,

“WorkingDir”: “”,

“Entrypoint”: [ #主程序上并没有改变

“/bin/sh”,

“-c”,

“sleep 600”

VOLUME


格式为VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

USER


格式为USER daemon

指定运行容器时的用户名或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

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

BAT面试经验

实战系列:Spring全家桶+Redis等

其他相关的电子书:源码+调优

面试真题:

格式为WORKDIR /path/to/workdir

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。

可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

[外链图片转存中…(img-RIcNaJuW-1716407482285)]

BAT面试经验

实战系列:Spring全家桶+Redis等

[外链图片转存中…(img-VMS0I80W-1716407482286)]

其他相关的电子书:源码+调优

[外链图片转存中…(img-cnarfBSh-1716407482286)]

面试真题:

[外链图片转存中…(img-73Y27D7w-1716407482287)]

[外链图片转存中…(img-uCDIneZk-1716407482287)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值