前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >制作镜像的帮手-Dockerfile

制作镜像的帮手-Dockerfile

原创
作者头像
懒人的小脑
修改于 2020-01-07 09:17:00
修改于 2020-01-07 09:17:00
2.3K0
举报

为什么需要 Dockerfile

  • 公共容器不符合项目需求;
  • 自研系统没有公共镜像。

制作镜像的方法

基于容器

Dockerfile

Dockerfile 是一个文本文件包含了构建一个镜像的所有命令。

Dockerfile Format

  • format
  • Commnet 注释
  • INSTRUCTION arguments 指令和参数(指令本身并不区分大小写,建议使用大写)
  • dockerfile 中的指令是顺序执行的
  • 第一个非注释行必须是 FROM  指令,用来指定 Base Image
  • Dockerfile 需要一个专用的工作目录,并且 Dockerfile文件名首字母必须大写,镜像需要的任何文件都需要放在 Dockerfile 专用的工作目录下。
  • .dockerignore  文件中定义的文件将不会被打包至镜像中
  • 在 Dockerfile json数组中需要使用双引号 "" 

Dockerfile Instructions

FROM

FROM 指令是最重要的一个并且必须为 Dockerfile 文件的第一个非注释行指令,用于为镜像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。

实践中,基准镜像可以是任何可用镜像文件,默认情况下,Dockerfile 会在 docker 主机上查找指定的镜像文件,当镜像文件不存在时,从 Docker Hub Registry 上拉取所需的镜像文件。如果找不到指定的镜像文件,docker build 会返回一个错误信息。

代码语言:txt
AI代码解释
复制
FROM <repository>[:<tag>] 或

FROM <repository>@<digest>
  • <repository>:指定作为 base image 的名称
  • <tag>:base image 的标签,可选项,默认为 latest

MAINTAINTER(deprecated已废弃)

用于让 Dockerfile 制作者提供制作者本人的详细信息。Dockerfile 并不限制 MAINTAINER 指令可出现的位置,但推荐其放置于 FROM 指令之后

代码语言:txt
AI代码解释
复制
MAINTAINER <author's detail>

参数说明

<author's detail>:任何文本信息,约定俗成地使用作者名称及邮件地址

LABEL

LABEL 指令可以对镜像添加相关的元数据。

代码语言:txt
AI代码解释
复制
LABEL <key>=<value> <key>=<value> <key>=<value> ...
  • 一个 LABEL 是一个键值对,一个 LABEL 指令也可以同时添加多个键值对,一个 Dockerfile 可以有多个 LABEL 指令;
  • value 中包含空格需要用引号;

COPY

用于从 Docker 主机复制文件至创建的新镜像文件中。

代码语言:txt
AI代码解释
复制
COPY <src> ... <dest> 或

COPY ["<src>",..."<dest>"]

参数说明

  1. <src>:要复制的源文件或目录,支持使用通配符
  2. <dest>:目标路径,即正在创建的 image 的文件系统路径;建议为<dest>使用绝对路径,否则 COPY 指令则以 WORKDIR 为起始路径

文件复制准则

  1. <src>必须是 build 上下文中的路径,不能是其父目录中的文件;
  2. 如果<src>是目录,则其内部文件或子目录会被自动递归复制,但<src>目录本身并不会被复制;
  3. 如果制定了多个<src>或在<src>中使用了通配符,则<dest>必须是一个目录,且**必须以** / **结尾**;
  4. 如果<dest>不存在,将会自动创建,包括其父目录路径;

示例

复制单个文件

代码语言:txt
AI代码解释
复制
# Description:myimage

FROM busybox:latest

MAINTAINER "Manson <chrisma1209@gmail.com>"

# LABEL maintainer="Manson <chrisma1209@gmail.com>"

COPY index.html /data/web/html/

docker build -t tinyhttpd:v0.1-1 /root/myimage 

docker image ls 

docker run --rm --name tinyweb1 tinyhttpd:v0.1-1 cat /data/web/html/index.html 

此命令用于测试制作的镜像是否已成功拷贝文件,并且修改容器启动运行的默认命令,修改为 cat 命令,cat 命令执行结束,容器结束并删除。这是测试容器时的常用方法。

复制目录

代码语言:txt
AI代码解释
复制
# Description:myimage

FROM busybox:latest

MAINTAINER "Manson <chrisma1209@gmail.com>"

# LABEL maintainer="Manson <chrisma1209@gmail.com>"

COPY index.html /data/web/html/

COPY yum.repos.d /etc/yum.repos.d/ #仅实验用,因为每一条指令都会生成一个新的文件系统层
代码语言:txt
AI代码解释
复制
cp -r /etc/yum.repos.d/ /root/myimage

tree -L 2       

.

├── Dockerfile

├── index.html

└── yum.repos.d

    ├── CentOS-Base.repo

    ├── CentOS-CR.repo

    ├── CentOS-Debuginfo.repo

    ├── CentOS-fasttrack.repo

    ├── CentOS-Media.repo

    ├── CentOS-Sources.repo

    ├── CentOS-Vault.repo

    ├── docker-ce.repo

    ├── epel.repo

    ├── epel-testing.repo

    └── google-cloud.repo

docker build -t tinyhttpd:v0.1-2 /root/myimage

docker image ls

docker run --rm --name tinyweb1 tinyhttpd:v0.1-2 ls /etc/yum.repos.d

ADD

ADD 指令类似于 COPY指令,ADD 支持使用 TAR 文件和 URL 路径

代码语言:txt
AI代码解释
复制
ADD <src> ... <dest> 或

ADD ["<src>",..."<dest>"]

说明

  1. 同 COPY 指令;
  2. 如果<src>为 URL 且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;如果<dest>以/结尾,则文件名 URL 指定的文件将被直接下载并保存为<dest>/<filename>;
  3. 如果<src>是一个本地文件系统上的压缩格式的 tar 文件,它将被展开为一个目录,其行为类似于 tar -x 命令,通过 URL 获取的 TAR 文件不会被自动展开;
  4. 如果<src> 有多个,或其简介或直接使用了通配符,则<dest> 必须是一个以/结尾的目录路径;如果<dest> 不以/结尾,则其被视作为一个普通文件,<src>的内容将被直接写入到<dest>。

示例

代码语言:txt
AI代码解释
复制
# Description:myimage

FROM busybox:latest

MAINTAINER "Manson <chrisma1209@gmail.com>"

# LABEL maintainer="Manson <chrisma1209@gmail.com>"

COPY index.html /data/web/html/

COPY yum.repos.d /etc/yum.repos.d/

#ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src/ #URL 下载不会展开

ADD nginx-1.15.2.tar.gz /usr/local/src/ #宿主机上先下载好,在镜像文件系统中会自动展开
代码语言:txt
AI代码解释
复制
# 使用 URL 下载 tar 文件包不会被自动解压

docker build -t tinyhttpd:v0.1-3 /root/myimage/

docker run --rm --name tinyweb1 tinyhttpd:v0.1-3 ls /usr/local/src

# 使用本地的 tar 文件包,会被自动展开

wget http://nginx.org/download/nginx-1.15.2.tar.gz

docker build -t tinyhttpd:v0.1-4 /root/myimage/

docker run --rm --name tinyweb1 tinyhttpd:v0.1-4 ls /usr/local/src/nginx-1.15.2

WORKDIR

用于为 Dockerfile 中所有的 RUN、CMD、ENTERPOINT、COPY和 ADD 指令设定工作目录

代码语言:txt
AI代码解释
复制
WORKDIR <dirpath>

在 Dockerfile 文件中,WORKDIR 指令可出现多次,其路径也可以为相对路径,不过相对此前一个 WORKDIR 指令指定的路径。

另外,WORKDIR 也可以调用由 ENV 指定定义个变量,如 WORKDIR $STATEPATH 

示例

代码语言:txt
AI代码解释
复制
...

WORKDIR /usr/local/

ADD nginx-1.15.2 ./src/ #./目录就使用的WORKDIR 定义个目录

...

VOLUME

用于在 image 中创建一个挂载点目录,以挂载 Docker host 上的卷或其他容器上的卷。

代码语言:txt
AI代码解释
复制
VOLUME <mountpoint> 或

VOLUME ["<mountpoint>"]

如果挂载点目录路径下此前有文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。

**示例**

代码语言:txt
AI代码解释
复制
FROM busybox:latest

ADD nginx-1.15.2.tar.gz /usr/local/src/

VOLUME /data/mysql/
代码语言:txt
AI代码解释
复制
docker build -t tinyhttpd:v0.1-5 /root/myimage/

docker run --rm --name tinyweb1 tinyhttpd:v0.1-5 mount 或

docker run --rm --name tinyweb1 tinyhttpd:v0.1-5 sleep 60

docker inspect

EXPOSE

用于为容器打开指定要监听的端口实现与外部通信

代码语言:txt
AI代码解释
复制
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]

参数说明

  • <protocol>用于指定传输层协议,可为 tcp 或 udp 二只之一,默认为 tcp 协议

EXPOSE 指令可以一次指定多个端口,如 EXPOSE 11211/udp 11211/tcp 

需要注意的是,EXPOSE 指定是待暴露的端口,运行容器默认不会暴露端口,使用 docker run 命令-P 选项后,会暴露 Dockerfile 中指定的暴露端口。

示例

代码语言:txt
AI代码解释
复制
# Description:myimage

FROM busybox:latest

MAINTAINER "Manson <chrisma1209@gmail.com>"

# LABEL maintainer="Manson <chrisma1209@gmail.com>"

COPY index.html /data/web/html/

COPY yum.repos.d /etc/yum.repos.d/

#ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src/

ADD nginx-1.15.2.tar.gz /usr/local/src/

VOLUME /data/mysql/

EXPOSE 80/tcp
代码语言:txt
AI代码解释
复制
docker run --name tinyweb1 --rm tinyhttpd:v0.1-6 /bin/httpd -f  -h /data/web/html #前台运行 docker 容器

docker inspect tinyweb1 #查看当前容器的 IP地址

curl 容器的 IP地址 #验证端口是否暴露,可以访问网页因为容器和宿主机在一个桥上,默认不会暴露端口

docker port tinyweb1

docker kill tinyweb1 #停止前台运行的容器

docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-6 /bin/httpd -f  -h /data/web/html #-P 选项表示暴露应该暴露的端口

docker port tinyweb1

ENV

用于为镜像定义所需的环境变量,并可被 Dockerfile 文件中**位于其后**的其他指令如 ENV、ADD、COPY 等所调用。调用格式为 $variable\_name 或 ${variable\_name} 

使用环境变量替换 (Environment replacement) 引用变量 $variable_name 或${variable_name} ${variable:-word}:变量默认值,如果 variable 值为空或未设置,就使用 word 作为变量值。 ${variable:+word}:变量有值就显示为 word,变量无值,就显示无值。

代码语言:txt
AI代码解释
复制
ENV <key><value>或

ENV <key>=<value>...

说明

  1. 在第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量;
  2. 第二种格式可以一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>中包含空格,可以以反斜线(\)进行转义,也可以通过对<value>加引号进行标识;另外,反斜线也可以用于续行。
  3. 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。

示例

代码语言:txt
AI代码解释
复制
FROM busybox:latest



ENV DOC\_ROOT /data/web/html/ \

    WEB\_SERVER\_PACKAGE="nginx-1.15.2"



COPY index.html ${DOC\_ROOT:-/data/web/html/}

ADD ${WEB\_SERVER\_PACKAGE}.tar.gz /usr/local/src/

...

变量值生效的阶段

image.png
image.png

在容器启动时,可以修改 ENV 的值,但是有些 ENV 的值是不会影响 Dockerfile 中定义的 ENV值,这里要区分 ENV 值的生效阶段,在第一阶段docker build生效的 ENV 值在容器启动前操作,不会被影响。

RUN

RUN 指令运行于第一阶段 docker build(镜像文件构建过程)。RUN命令可执行的操作取决于基础镜像支持的命令数量。

代码语言:txt
AI代码解释
复制
RUN <command> 或

RUN ["<executable>","<param1>", "<param2>"]

说明

  1. 在第一种格式中,<command>通常是一个 shell 命令,且以 /bin/sh -c 来运行它,这意味着此进程在容器中的 PID 不为 1,不能接收 Unix 信号,因此,当使用 docker stop <container> 命令停止容器时,此进程接收不到 SIGTERM 信号;
  2. 第二种格式中的参数是一个 JSON 格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命苦的选项或参数;然而,此种格式的命令不会以 /bin/sh -c 来发起,因此常见的 shell 操作如变量替换以及通配符(?,*等)替换不会进行;不过,如果要运行的命令依赖于此类 shell 特性时,可以将其替换为类似下面的格式: RUN ["/bin/sh","-c","executable","paramN"] 
代码语言:txt
AI代码解释
复制
...

ENV WEB\_SERVER\_PACKAGE=nginx-1.15.2

ADD http://nginx.org/download/nginx-1.15.2 /usr/local/src/

RUN cd /usr/local/src/ &&  tar -xf ${WEB\_SERVER\_PACKAGE}.tar.gz && mv nginx-\* webserve

...

CMD

类似于 RUN 指令,运行于第二阶段 docker run(基于 Dockerfile 构建出的新镜像文件启动的容器),需要结合 ENTRYPOINT 使用。

在 Dockerfile 中CMD建议只出现一次,如果出现多次,那么只有最后一个 CMD 有效。

CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD 指令的命令可以被 docker run 的命令行参数所覆盖。

代码语言:txt
AI代码解释
复制
CMD <command> 或

CMD <"<executable>","<param1>","<param2>"> 或

CMD <"<param1>","<param2>">

参数说明

  • 前两种语法格式的意义同 RUN
  • 第三种语法用于为 ENTRYPOINT 指令提供默认参数

示例

  1. 创建一个新的目录并创建 Dockerfile
代码语言:txt
AI代码解释
复制
FROM busybox:latest

LABEL maintainer="Manson <chrisma1209@gmail.com>" app="httpd"



ENV WEB\_DOC\_ROOT="/data/web/html/"



RUN mkdir -p $WEB\_DOC\_ROOT && echo '<h1>Busybox httpd server.</h1>' > ${WEB\_DOC\_ROOT}/index.html



CMD /bin/httpd -f -h ${WEB\_DOC\_ROOT}

2.创建镜像

代码语言:txt
AI代码解释
复制
docker build -t tinyhttpd:v0.2-1 /root/img2

3.查看镜像信息

代码语言:txt
AI代码解释
复制
docker image inspect tinyhttpd:v0.2-1

...

"Cmd": [

  "/bin/sh",

  "-c",

  "#(nop) ",

  "CMD [\"/bin/sh\" \"-c\" \"/bin/httpd -f -h ${WEB\_DOC\_ROOT}\"]"

...

这里可以看到,容器先启动了/bin/sh,然后在运行 /bin/httpd,就就是说 httpd 是 shell 的子进程

4.运行容器

代码语言:txt
AI代码解释
复制
docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-1

即使使用了-it 选项,但是因为没有进入交互式环境,因为 httpd 根本不提供交互式接口

5.进入容器查看进程

代码语言:txt
AI代码解释
复制
docker exec -it tinyweb2 /bin/sh

/ # ps

PID   USER     TIME  COMMAND

    1 root      0:00 /bin/httpd -f -h /data/web/html/

   11 root      0:00 /bin/sh

   16 root      0:00 ps

/ # printenv

WEB\_DOC\_ROOT=/data/web/html/

HOSTNAME=aa6643a0ceaf

SHLVL=1

HOME=/root

TERM=xterm

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PWD=/

这里有一个问题,不是应该/bin/sh 的 PID是 1 ,而目前 httpd 的进程号为 1,可以接收 docker stop 发送的信号,因为 docker  进行过转换,通过 docker image inspect tinyhttpd:v0.2-1 可以查看。

6.修改 Dockerfile

代码语言:txt
AI代码解释
复制
...

CMD ["/bin/httpd","-f","-h ${WEB\_DOC\_ROOT}"]

这样构建镜像并启动容器,由于并没有创建 sh 子进程,所以也获取不到shell变量的值,因此会报错,找不到路径。所以要修改为:

代码语言:txt
AI代码解释
复制
FROM busybox:latest

LABEL maintainer="Manson <chrisma1209@gmail.com>" app="httpd"



ENV WEB\_DOC\_ROOT="/data/web/html/"



RUN mkdir -p $WEB\_DOC\_ROOT && echo '<h1>Busybox httpd server.</h1>' > ${WEB\_DOC\_ROOT}/index.html



#CMD /bin/httpd -f -h ${WEB\_DOC\_ROOT}



CMD ["/bin/sh","-c","/bin/httpd -f -h ${WEB\_DOC\_ROOT}"]

注意的是-c 后面的参数是一个参数只需要一个对引号,分开写会报错。

ENTRYPOINT

类似 CMD命令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序。与 CMD 不同的是,由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给 ENTRYPOINT指定的程序。【参数追加】

docker run 命令句的 --entrypoint 选项可以覆盖 ENTRYPOINT 指令指定的程序

代码语言:txt
AI代码解释
复制
ENTRYPOINT <command>

ENTRYPOINT ["<executable>","<param1>","param2"]

说明

  1. docker run 命令传入的命令参数会覆盖 CMD 指令的内容并且附加到 ENTRYPOINT 命令最后作为其参数使用;
  2. Dockerfile文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效。
  3. CMD 和 ENTRYPOINT 同时在一个 Dockerfile 时,CMD 指定的参数作为 ENTRYPOINT的参数

示例 1

代码语言:txt
AI代码解释
复制
FROM busybox:latest

LABEL maintainer="Manson <chrisma1209@gmail.com>" app="httpd"

ENV WEB\_DOC\_ROOT="/data/web/html/"

RUN mkdir -p $WEB\_DOC\_ROOT && echo '<h1>Busybox httpd server.</h1>' > ${WEB\_DOC\_ROOT}/index.html

ENTRYPOINT /bin/httpd -f -h ${WEB\_DOC\_ROOT}
代码语言:txt
AI代码解释
复制
docker build -t tinyhttpd:v0.2-5 /root/img2/

#正常运行

docker run --name tinyweb -it --rm -P tinyhttpd:v0.2-5

##正常运行,没有执行 ls 命令,ls 命令作为参数追加到 ENTRYPOINT 指令指定的程序之后

docker run --name tinyweb -it --rm -P tinyhttpd:v0.2-5 ls /data/web/html 

示例 2

  1. 创建目录和 Dockerfile 文件
代码语言:txt
AI代码解释
复制
FROM nginx:1.14-alpine

LABEL maintainer="Simon <chrisma1209@gmail.com>"



ENV NGX\_DOC\_ROOT='/data/web/html/'



ADD index.html ${NGX\_DOC\_ROOT}

ADD entrypoint.sh /bin/



CMD ["/usr/sbin/nginx","-g","daemon off;"]



#先运行/bin/entrypoint.sh 脚本,然后引用 CMD 指定的参数,并替换/bin/entrypoint.sh 进程

#ENTRYPOINT ["/bin/sh","-c","/bin/entrypoint.sh"]

#ENTRYPOINT ["/bin/sh","-c","/bin/entrypoint.sh"]

#ENTRYPOINT ["/bin/sh","-c","ls /bin"]

ENTRYPOINT ["/bin/entrypoint.sh"]
  1. 准备相关文件

entrypoint.sh

代码语言:txt
AI代码解释
复制
#!/bin/sh

#filenname entrypoint.sh

#

cat > /etc/nginx/conf.d/www.conf << EOF

server {

        server\_name $HOSTNAME;

        listen ${IP:-0.0.0.0}:${PORT:-80};

        root ${NGX\_DOC\_ROOT};

}

EOF



exec "$@" #替换当前进程

index.html

代码语言:txt
AI代码解释
复制
<h1>mynginx in docker</h1>
  1. 构建镜像

docker build -t myweb:v0.1-12 /root/mynginx/ 

  1. 运行容器

docker run --name myweb -it --rm -P myweb:v0.1-12 

如果容器运行失败,提示 permission denied,在构建镜像前手动赋予entrypoint.sh执行权限

  1. 验证

docker exec -it myweb /bin/sh 进入容器,查看监听的端口,查看进程,获取网页 wget -O - -q ab04ddac4745 

  1. 传递参数

docker run --name myweb -it --rm -P -e "PORT=8080" myweb:v0.1-12 

为了在不同的环境中使用相同的镜像,通常都是使用 entrypoint 脚本启动,当传入不同的参数来区分在不同环境中使用容器,如区分开发环境、测试环境、生产环境。Dockerfile 中 entrypoint 脚本的作用、意义和参数的传递方式是一个难点,可以在github 上 docker 仓库中多多学习其他镜像Dockerfile 的写法。

USER

用于指定运行 image 时或运行 Dockerfile 中任何 RUN、CMD或 ENTRYPOINT 指令指定程序时的用户名或 UID。

默认情况下,container 的运行用户是 root 用户。

代码语言:txt
AI代码解释
复制
USER <UID>|<USERNAME>

说明

<UID>可以为任意数字,但实践中必须为/etc/passwd 中某用户的有效 UID,否则,docker run 命令将运行失败

HEALTHCHECK

用于指定一个命令检查主进程的工作状态

代码语言:txt
AI代码解释
复制
HEALTHCHECK [OPTIONS] CMD command

HEALTHCHECK NONE

OPTIONS

  • --interval=DURATION(默认 30 秒)
  • --timeout=DURATION(默认 30 秒)
  • --start-period=DURATIPN(默认 0 秒),容器启动时的等待时间,等待后开始健康检查
  • --retries=N(默认 3)

响应值

  • 0:success,容器健康并且可提供服务
  • 1:unhealthy:容器不能正常工作
  • 2:reserverd:没有,可自定义

示例

代码语言:txt
AI代码解释
复制
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/|| exit 1

SHELL

指定默认 shell

STOPSIGNAL

代码语言:txt
AI代码解释
复制
STOPSIGNAL signal

ARG

定义变量,在 docker build 过程中使用的变量。而 ENV 的变量是可以在 docker run 时进行传值的。

ONBUILD

用于在 Dockerfile 中定义一个触发器。Dockerfile 用于 build 镜像文件,此镜像文件亦可作为base image 被另外一个 Dockerfile 用作 FROM 指令的参数,并以之构建的镜像文件。

在后面的这个 Dockerfile 中的 FROM 指令在 build 过程中被执行,将会“触发”创建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定义的触发器。

代码语言:txt
AI代码解释
复制
ONBUILD <INSTRUCTION>

说明

尽管任何指令都可注册成为触发器指令,但 ONBUILD 不能自我嵌套,且不会触发 FROM 和 MAINTAINER 指令。

使用包含 ONBUILD 指令的 Dockerfile 构建的镜像应该使用特殊的标签,如 ruby:2.0-onbuild。

在 ONBUILD 指令中使用的 ADD 或 COPY 指令应该格外小心,因为构建过程中的上下文在缺少指定的源文件时会失败。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Dockerfile关键词实验演示:
FROM指定基础镜像,每一个定制镜像,必须以一个现有镜像为基础。因此一个Dockerfile中FROM是必须的指令,并且必须是第一条。后续的指令都依赖于该指令指定的 image。FROM 指令指定的基础 image 可以是官方远程仓库中的,也可以位于本地仓库
用户10048459
2022/10/22
1K0
Dockerfile格式以及Dockerfile示例
笔记内容:Dockerfile格式以及Dockerfile示例 笔记日期:2018-02-07
端碗吹水
2022/01/12
9970
kubernetes(五)之Dockerfile
Dockerfile 镜像相关的操作 镜像生成的途径 Dockerfile 基于容器制作docker commit 定义 构建docker镜像的源码 docker可以根据Dockerfile中的
alexhuiwang
2020/09/23
8420
kubernetes(五)之Dockerfile
dockerfile (・ω・)ノ
构建镜像有docker commit和docker file两种,而docker file是现在使用最主要的方式,这里记录下docker file的基础指令
LoRexxar
2023/02/20
2180
Docker容器学习梳理-Dockerfile构建镜像
在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析、执行,那么重复构建、更新将变得很方便,所以Dockerfile就此诞生了。Docker提供了Dockerfile作为构建Docker镜像脚本,避免人们一行一行的输入,真是善莫大焉。Dockerfile脚本可以做到随时维护修改,即可以分享,更有利于在模板化,更不用说传输了,好处那
洗尽了浮华
2018/01/23
1.6K0
Docker容器学习梳理-Dockerfile构建镜像
Docker镜像构建知识:Dockerfile 命令详解
FROM 指令用于指定其后构建新镜像所使用的基础镜像。如果本地不存在,则默认会去Docker Hub下载指定镜像。FROM指令必是Dockerfile文件中的首条命令,启动构建流程后,Docker将基于该镜像构建新镜像,FROM后的命令也会基于这个基础镜像。
废柴阿尤
2023/12/18
3.2K0
Docker 进阶之 Dockerfile 详解
我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容,同时在我们后期的微服务实践中,Dockerfile 也是重点关注的内容,今天我们就来一起学习它。
看、未来
2022/06/30
3.2K2
Docker 进阶之 Dockerfile 详解
玩转dockerfile
Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。
sunsky
2020/08/20
1.1K0
玩转dockerfile
Dockerfile 详解,看这一篇就够了
使用这个指令的目的是告诉应用程序容器内应用程序会使用的端口,在运行时还需要使用-p参数指定映射端口。这是docker处于安全的目的,不会自动打开端口。
DevOps时代
2019/08/21
1.5K0
Dockerfile 详解,看这一篇就够了
Docker系列学习文章 - 专业化定制镜像dockerfile(六)
| 导语上一篇我们跟大家讲了docker镜像,关于镜像的特点和作用我想大家都明白了。那么如何比较专业的去定制我们需要的镜像呢?用commit?不对,我们说过这个方法比较黑盒。真正专业高大上的方法是用d
宝哥@上云专家
2018/05/07
3.3K11
Dockerfile语法及构建简单镜像
这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。 既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?
全栈程序员站长
2021/06/10
5600
Dockerfile 指令
1、Dockerfile基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
小手冰凉
2020/08/06
5020
Dockerfile 指令
Dockerfile
镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。
星哥玩云
2022/09/15
2K0
Dockerfile
Docker 镜像构建之 Dockerfile
在 Docker 中构建镜像最常用的方式,就是使用 Dockerfile。Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。官方文档:https://docs.docker.com/engine/reference/builder/
贾维斯Echo
2024/03/21
4.5K0
Docker 镜像构建之 Dockerfile
Dockerfile文件编写官方文档 原
英文原文链接地址: Engine reference–>Dockerfile reference
拓荒者
2019/03/11
1K0
Dockerfile
Docker镜像可以通过Docker hub仓库中获取,这些镜像是由官方或者社区人员提供的,对于Docker用户来说并不能满足我们的需求,但是从无开始构建镜像成本大。常用的数据库、中间件、应用软件等都有现成的Docker官方镜像或社区创建的镜像,我们只需要稍作配置就可以直接使用。
Alone-林
2023/03/17
9651
Dockerfile
docker 镜像制作示例
第一步:新建一个目录和一个 Dockerfilemkdir test1cd test1touch Dockerfile第二步:编写Dockerfile,Dockerfile中每一条指令都创建镜像的一层,例如:vim Dockerfile# 这里是注释# 设置以哪个镜像为基础FROM hub.c.163.com/public/centos:7.2-tools# 下面是一些创建者的基本信息MAINTAINER zhujiantang “18153959643@163.com”# 在终端需要执行的命令RUN yu
用户10048459
2022/10/22
3.2K0
docker实践(2)常用命令和DockerFile详解
1、获取:docker pull centos获取镜像 #从官方仓库注册服务器下载镜像
黄规速
2022/04/14
7590
docker实践(2)常用命令和DockerFile详解
你必须知道的Dockerfile
本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。
Edison Zhou
2019/08/12
7640
你必须知道的Dockerfile
docker容器技术系列五:Dockerfile详解
本系列教程由旺旺知识库授权进行发布 Dockerfile是一个具有规范格式的文件,根据适当的指令和语法,我们可以构建一个自定以镜像。但Dockerfile需要依赖于一个原始镜像,而这些原始镜像我们可以通过官方默认镜像仓库方便获取。具体获取方法参照前文镜像获取办法。 一、Dockerfile的基本结构 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。比如如下一个Dockerfile文件: # This dockerfile uses the ubuntu
小小科
2018/05/04
1.2K0
docker容器技术系列五:Dockerfile详解
相关推荐
Dockerfile关键词实验演示:
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档