云原生

06-Dockerfile命令

2021-10-22  本文已影响0人  紫荆秋雪_文

Dockerfile命令

一、Dockerfile

Dockerfile由一行行命令语句组成。一般而言,Dockerfile可以分为四部分:基础镜像信息、维护信息、镜像操作指令、启动时执行指令

image.png

二、RUN

RUN <command>(shell形式,/bin/sh -c 的方式运行,避免破坏 shell 字符串)
RUN ["executable", "param1", "param2"](exec 形式)

1、实例测试

FROM alpine
LABEL   maintainer=Raven xinshi=Wang  # 附近信息
ENV msg = "Hello World"  #定义 环境变量
RUN echo $msg
RUN ["echo", "$msg"]
RUN /bin/sh -c 'echo $msg'
RUN ["/bin/sh", "-c", "echo $msg"]
# docker build -t 镜像名称
docker build -t test/myapp .
# 不使用缓存
docker build --no-cache -t raven/test3 .
Sending build context to Docker daemon  77.82kB
Step 1/7 : FROM alpine
 ---> 14119a10abf4
Step 2/7 : LABEL   maintainer=Raven xinshi=Wang
 ---> Running in b2d7f6e38073
Removing intermediate container b2d7f6e38073
 ---> fae0897bf471
Step 3/7 : ENV msg = "Hello World"
 ---> Running in cd3ca7432b87
Removing intermediate container cd3ca7432b87
 ---> b33af3d9eac3
Step 4/7 : RUN echo $msg  ##使用  echo 模式可以取出环境变量中的值
 ---> Running in e18551f17104
= Hello World
Removing intermediate container e18551f17104
 ---> bc3abc7fe94c
Step 5/7 : RUN ["echo", "$msg"]  ##使用  exec 模式无法取出环境变量中的值
 ---> Running in 819fe9ffc7e5
$msg
Removing intermediate container 819fe9ffc7e5
 ---> 29d5a4c3032a
Step 6/7 : RUN /bin/sh -c 'echo $msg'  ##使用  sh 模式直接取出环境变量中的值
 ---> Running in fff5e64394c1
= Hello World
Removing intermediate container fff5e64394c1
 ---> 90405522a350
Step 7/7 : RUN ["/bin/sh", "-c", "echo $msg"]  ##使用  exec 模式直接取出环境
 ---> Running in 62e0db2c9f52
= Hello World
Removing intermediate container 62e0db2c9f52
 ---> bc78919ab073
Successfully built bc78919ab073
Successfully tagged raven/test3:latest

小结

三、CMD 和 ENTRYPOINT

1、CMD 的三种写法

2、ENTRYPOINT 的两种写法

3、只能有一个CMD

4、CMD 为 ENTRYPOINT 提供默认参数

5、指令小结 image.png

四、ARG

ARG 指令定义一个变量,可以在构建时 docker build 通过使用 --build-arg <varname>=<value>标志的命令将其传递给构建器。如果用户指定了未在Dockerfile中定义的构建参数,则构建会输出警告

ARG <name>[=<default value>]

1、Dockerfile 有效的ARG

FROM
Learn more about the "FROM" Dockerfile command.
 busybox
ARG user1
ARG buildno
# ...

警告:不建议在构建时来传递密钥,如GitHub密钥、用户凭证等docker history

2、默认值

一条 ARG指令可以选择包含一个默认值

FROM busybox
ARG user1=someuser
ARG buildno=1
# ...

3、实战

FROM alpine

ARG msg="hello world"

RUN echo $msg

CMD echo $msg
CMD ["/bin/sh", "-c", "echo 12345; echo $msg"]

3.1、通过Dockerfile构建镜像,Dockerfile文件名称为Dockerfile_ARG

docker build -t raven:test --no-cache -f Dockerfile_ARG .
docker build -t raven:test --no-cache -f /root/Dockerfiles/Dockerfile_ARG .
docker build --no-cache -t raven:test .
Dockerfile文件名为 Dockerfile 时.png
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM alpine
 ---> 14119a10abf4
Step 2/5 : ARG msg="hello world"  #使用ARG定义变量并赋有默认值
 ---> Running in 43d888792aa5
Removing intermediate container 43d888792aa5
 ---> bb7718e13663
Step 3/5 : RUN echo $msg  
 ---> Running in f35a8d4d13ca
hello world
Removing intermediate container f35a8d4d13ca
 ---> 7e3c81cb6d6c
Step 4/5 : CMD echo $msg
 ---> Running in ccc3e0ca8813
Removing intermediate container ccc3e0ca8813
 ---> a5395b20fb48
Step 5/5 : CMD ["/bin/sh", "-c", "echo 12345; echo $msg"]
 ---> Running in e74bbc97d2be
Removing intermediate container e74bbc97d2be
 ---> 1b456c19fbbb
Successfully built 1b456c19fbbb
Successfully tagged raven:v1
docker run -it raven:v1
运行镜像.png
docker build --no-cache --build-arg msg="Raven" -t raven:v1 -f Dockerfile_ARG .
image.png

五、ENV

1、在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换
2、引号和反斜杠可用于在值中包含空格
3、ENV 可以使用 key value的写法,但是这种不推荐使用了,后续版本可能会删除
4、docker run --env 可以修改这些值
5、容器运行时 ENV 值可以生效
6、ENV在 image 阶段就会被解析并持久化(docker inspect image)

1、ARG定义的变量,ENV是否可以使用

FROM alpine
ARG msg1="hello world"
ENV msg2 = $msg1
RUN echo $msg1
RUN echo $msg2
CMD ["/bin/bash", "-c", "echo msg1_$msg1; echo msg2_$msg2;"]
docker build --no-cache -t raven:re -f Dockerfile_ARG_ENV .
编译输出.png
docker run -it raven:re
运行镜像.png

2、ARG定义的变量,ENV是否可以使用但是在构建镜像时修改参数

docker build --no-cache --build-arg msg1="Raven" -t raven:re -f Dockerfile_ARG_ENV .
构建镜像输出.png
docker run -it raven:re
运行镜像输出.png

3、ENV参数 赋值给另外一个 ENV参数

FROM alpine
ENV msg1="hello world"
ENV msg2 = $msg1
RUN echo $msg1
RUN echo $msg2
CMD ["/bin/sh", "-c", "echo msg1_$msg1; echo msg2_$msg2;"]
docker build --no-cache -t raven:env -f Dockerfile_ENV .
构建输出信息.png
docker run -it raven:env
运行输出信息.png

4、构建时修改msg1值

docker build --no-cache --build-arg msg1="Raven" -t raven:env -f Dockerfile_ENV .
构建镜像输出.png
docker run -e msg1="Raven" -it raven:env
运行时输出.png

六、总结

1、在构建镜像阶段,无法修改 ENV 类型参数

2、在运行镜像阶段,当 ENV 参数 msg2 = ENV参数类型msg1,修改msg1时,并不会修改 msg2

image.png

3、在构建阶段 ENV 类型参数的值已经确定,但是也可以在运行时通过(-e)命令来修改

4、应用选择

4.1:ARG参数:在运行期间无法使用默认值,但是可以通过 运行命令传参来使用,所以,不推荐在运行期间使用ARG类型参数

4.2:ENV参数:在运行期间可以使用默认值,也可以使用命令参数来传值。但是在构建期间无法通过构建命令(--build-arg)来改变值,而是直接使用的默认值。

七、ADD & COPY

ADD

ADD拥有自动下载远程文件和解压的功能

7.1、远程文件(Redis)

1、目标文件不带斜杠

FROM alpine
#1、如果是远程文件,自动下载
ADD http://download.redis.io/releases/redis-6.0.6.tar.gz /dest

RUN ls -l
image.png

2、目标文件带斜杠

FROM alpine
#1、如果是远程文件,自动下载
ADD http://download.redis.io/releases/redis-6.0.6.tar.gz /dest/

RUN ls -l
RUN cd /dest && ls -l
image.png

7.2、本地文件(宿主机)

FROM alpine
#1、如果是远程文件,自动下载
ADD http://download.redis.io/releases/redis-6.0.6.tar.gz /dest/

#2、如果是本地压缩包,自动解压
ADD *.tar.gz    /app/

RUN ls -l
RUN cd /dest && ls -l
RUN cd /app && ls -l
image.png
image.png
image.png

COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

COPY命令

COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
FROM alpine

COPY *.tar.gz    /app/
RUN ls -l
RUN cd /app && ls -l
image.png
FROM alpine
#设置文件权限
COPY --chown=1000:1000 *.tar.gz    /app/
RUN ls -l
RUN cd /app && ls -l
image.png

八、WORKDIR 和 VOLUME

8.1、WORKDIR

WORKDIR  /a
WORKDIR  b
WORKDIR  c
RUN pwd
#结果  /a/b/c
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
#结果  /path/$DIRNAME
docker exec -it 7ab174e8c7b2 /bin/bash
cd usr/share/nginx/html/
FROM nginx
#   进入容器的指定目录
WORKDIR /usr/share/nginx/html/
image.png

8.2、VOLUME

#  可以是JSON数组
VOLUME  ["/var/log/"]

#  可以直接写
VOLUME  /var/log

#  可以空格分隔多个
VOLUME  /var/log  /var/db

上面使用WORKDIR来实现了一步定位到资源文件,但是还是需要进入容器中,依然不是很方便,最好是可以在宿主机中修改容器中的资源文件

FROM nginx
#   进入容器的指定目录
WORKDIR /usr/share/nginx/html/

#   挂载容器文件
VOLUME  ["/usr/share/nginx/html/"]
docker inspect 056c4dd90dd8
image.png

九、USER

USER 指令设置运行映像时要使用的用户名(或UID,推荐使用UID)以及可选的用户组(或GID,推荐使用GID),以及Dockerfile中USER后面所有RUN、CMD和ENTRYPOINT指令

USER <user>[:<group>]
USER <UID>[:<GID>]

十、EXPOSE

EXPOSE <port> [<port>/<protocol>...]
EXPOSE [80,443] 
EXPOSE 80/tcp 
EXPOSE 80/udp
上一篇下一篇

猜你喜欢

热点阅读