淘先锋技术网

首页 1 2 3 4 5 6 7

Dockerfile常用命令

1. Dockerfile

Dockerfile是一个文本文件,用一组指令来完成镜像的构建.每一条指令构建一层镜像.所有尽量将相同的命令合并成一行以减少中间镜像的层数.

2. From

必须

指定基础镜像即我从哪里可以获取到这个镜像,并在它的基础上增加一些功能来实现一个应用,必须是第一个命令

# 公共仓库的镜像
FROM ubuntu:18.04
# 私有harbor仓库镜像
FROM harbor.intra.com/centos:7.9.2009

3. MAINTAINER

作者信息,非必须

MAINTAINER qiuqin 13917099322@139.com
# 4. WORKDIR

把某个目录设置为工作目录,和cd命令类似

通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

WORKDIR /usr/local/nginx/

5. USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

USER root:root
# 或者
USER 1000:1000

6. ARG

定义构建使用的环境变量.需要先定义才能在构建时进行参数传递,构建完成后失效.

  1. 需要先定义,如果Dockerfile中使用了ARG但并未给定初始值,而在运行docker build(编译)的时候未指定该ARG变量,则会失败。
  2. 仅在build docker image的过程中(包括CMD和ENTRYPOINT)有效,构建完成后失效
  3. 构建时通过–build-arg参数将变量传给Dockerfile
  4. 虽然其在container启动后不再生效,但是使用‘docker history’可以查看到。所以,敏感数据不建议使用ARG.
FROM centos:7.9.2009
ARG SOFTWARE
# 或者
ARG SOFTWARE=nginx
RUN yum install -y $SOFTWARE
EXPOSE 80
CMD nginx -g "daemon off;"


# docker build --build-arg SOFTWARE=nginx -t nginx:v0.1 .

7. ENV

设置环境变量

  1. ENV定义的环境变量在构建中有用,构建完成后也有用.
  2. 通过ENV定义的环境变量不能被CMD指令使用,也不能被docker run 的命令参数引用
  3. 在docker run 命令中通过 -e标记来传递环境变量
FROM centos:7.9.2009
ENV SOFTWARE=nginx
# 或者
ENV SOFTWARE nginx
RUN yum install -y $SOFTWARE
EXPOSE 80
CMD nginx -g "daemon off;"

8. VOLUME

用于指定持久化目录

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

  1. 卷可以容器间共享和重用
  2. 容器并不一定要和其它容器共享卷
  3. 修改卷后 会立即生效
  4. 对卷的修改不会对镜像产生影响
  5. 卷会一直存在,直到没有任何容器在使用它

9. LABEL

给镜像添加标签

  1. 定义LABEL时,一个LABEL可以定义一个或者多个LABEL
  2. 有多个LABEL时尽量保持在一行内定义,避免产生过多的中间镜像
LABEL KEY1=VALUE1 KEY2=VALUE2 KEY3=VALUE3

10. EXPOSE

指定服务暴露端口

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

EXPOSE 80
或者
EXPOSE 53/tcp 53/udp

11. COPY

将本地文件添加到容器中,不会自动解压文件,也不能访问网络资源

COPY index.html  /usr/share/nginx/html/index.html

12. ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

ADD MYDATE.tar /data
ADD http://192.168.31.24/index.html  /usr/share/nginx/html/index.html

13. RUN

构建镜像时执行的命令

RUN ["ls","-lh","/etc"]
RUN ["ls -lh /etc"]
RUN ls -l /etc

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:

docker build --no-cache
  1. 当一个Dockerfile里有多个RUN,那么依次执行
  2. 为了减少中间层,应该将所有的RUN放一行,用&&分割

14. CMD

构建镜像后调用,也就是在容器启动时才进行调用。

CMD ["nginx","-g","daemon off;"]
CMD nginx -g "daemon off;"

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

15. ENTRYPOINT

配置容器,使其可执行化。

ENTRYPOINT ["ls", "/usr/local"]
CMD ["/usr/local/tomcat"]

示例

root@ks-master:~/scratch# cat Dockerfile
FROM alpine:latest
ENTRYPOINT ["ls","-ld","/etc"]
CMD ["/usr/local","/tmp"]
root@ks-master:~/scratch# docker build -t test:v1 .
Sending build context to Docker daemon   7.35MB
Step 1/3 : FROM alpine:latest
 ---> 9ed4aefc74f6
Step 2/3 : ENTRYPOINT ["ls","-ld","/etc"]
 ---> Running in c4a4dc4ba7ac
Removing intermediate container c4a4dc4ba7ac
 ---> 7d915bbec6bc
Step 3/3 : CMD ["/usr/local","/tmp"]
 ---> Running in b13a9f25efd8
Removing intermediate container b13a9f25efd8
 ---> 17e6b8025f37
Successfully built 17e6b8025f37
Successfully tagged test:v1
root@ks-master:~/scratch# docker run -it --name test1 test:v1
drwxr-xr-x    1 root     root            66 May  9 05:06 /etc
drwxrwxrwt    2 root     root             6 Mar 29 14:45 /tmp
drwxr-xr-x    5 root     root            41 Mar 29 14:45 /usr/local

16. ONBUILD

用于设置镜像触发器,当当前的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

ONBUILD RUN rm -rf /usr/share/nginx/html/*

17. Dockerfile测试

root@ks-master:~/scratch# cat Dockerfile
FROM alpine:latest

WORKDIR /usr/local/nginx
ARG Message="test message"
ENV Path=/usr/local/nginx File=aaa.txt
USER root
RUN echo "$Message" > $Path/$File
ENTRYPOINT ["cat"]
CMD ["/usr/local/nginx/aaa.txt"]

## 不带参数使用默认的ARG值进行填充
# docker build -t test:v1.08 .
# docker run -it --rm --name test2 test:v1.08
test message

## 带参数,使用自定义传入参数进行填充
# docker build --build-arg Message=qiuqin -t test:v1.09 .
# docker run -it --rm --name test2 test:v1.09
qiuqin