Docker 新手教程:Dockerfile 简介
1。基本结构
Dockerfile 由命令行组成,并支持以 # 字符开头的注释行。
一般来说,一个Dockerfile分为四个部分:镜像基本信息、维护信息、镜像操作指令、启动容器时的执行指令。
例如
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
FROM ubuntu
# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com
# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx其中,必须在开头输入其所基于的镜像的名称,然后建议包含维护信息。
遵循镜像的操作指令,例如RUN指令。 RUN 语句在镜像上执行以下命令。每次执行 RUN 语句时,都会向图像添加一个新层并发送。
最后一条是CMD语句,指定运行容器时的动作命令。
以下是一个更复杂的示例
# Nginx
#
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor Vieux <victor@docker.com>
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir /.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]
# Multiple images example
#
# VERSION 0.1
FROM ubuntu
RUN echo foo > bar
# Will output something like ===> 907ad6c2736f
FROM ubuntu
RUN echo moo > oink
# Will output something like ===> 695d7793cbe4
# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
# /oink.
2。命令
命令的一般格式为 INSTRUCTION 参数,命令包括 FROM、MAINTAINER、RUN 等。
2.1 FROM
格式为FROM或FROM。
第一个语句必须是 FROM 语句。如果您在同一个 Dockerfile 中创建多个映像,则可以使用多个 FROM 语句(每个映像一次)。
2.2 MAINTAINER
格式为 MAINTAINER ,提供维护者信息。
2.3 RUN
格式为 RUN 或 RUN ["runner", "param1", "param2"]。
前者会在shell终端运行命令,即/bin/sh -c;后者将使用 exec 命令执行。指定使用其他终端可以使用第二种方法来实现,例如RUN ["/bin/bash", "-c", "echo hello"]。
每个 RUN 语句都会根据当前映像执行指定的命令,并将其作为新映像发送。如果命令很长,可以使用 \ 换行。
2.4 CMD
支持三种格式
- CMD ["executable","param1","param2"] 使用exec命令执行,推荐方法;
- CMD命令param1 param2在/bin/sh目录下执行,适用于需要交互的应用;
- CMD ["param1", "param2"] 为 ENTRYPOINT 默认参数提供;
指定启动容器时要执行的命令。每个 Docker 文件只能有一个 CMD 命令。如果输入多条命令,则仅执行最后一条。
如果用户指定启动容器时运行的命令,则CMD指定的命令将被覆盖。
2.5 EXPOSE
格式 EXPOSE [...]。
告诉 Docker 服务器容器为连接的系统发布的端口号。启动容器时,需要传递-P标志,Docker主机会自动分配一个端口并将其转发到指定端口。
2.6 ENV
格式为 ENV。指定由后续 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-$PG_MAJOR/bin:$PATH2.7 ADD
格式为 ADD 。
此命令将指定的内容复制到存储中。这可以是Dockerfile所在目录的相对路径;也可以是 URL;它也可以是 tar 文件(自动提取到目录)。
2.8 COPY
格式为COPY。
将 localhost(Dockerfile 所在目录的相对路径)复制到存储库。
如果使用本地目录作为源目录,建议使用COPY。
ENTRYPOINT
两种格式:
- ENTRYPOINT ["executable", "param1", "param2"]
- ENTRYPOINT 命令 param1 param2(在 shell 中执行)。
配置容器启动后执行的命令,该命令不能被docker run提供的参数覆盖。
每个 Docker 文件只能有一个 ENTRY POINT。如果指定多个,则只有最后一个生效。
2.9 VOLUME
格式为VOLUME [“/data”]。
创建可以从本地主机或其他容器连接的挂载点。通常用于存储数据库和需要维护的数据。
2.10 USER
格式为USER daemon。
运行容器时指定用户名或UID,下次RUN将使用指定的用户。
如果服务不需要管理员权限,您可以使用此命令指定运行用户。您可以预先创建必要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres。您可以使用 gosu 来临时获得管理权限,但不建议使用 sudo。
2.11 WORKDIR
格式为WORKDIR /路径/工作目录。
配置以下 RUN、CMD 和 ENTRYPOINT 语句的工作目录。
您可以使用多个 WORKDIR 语句。如果后面命令的参数是相对路径,则将以上一个命令指定的路径为基础。例如,
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd最终路径是/a/b/c。
2.12 ONBUILD
格式为 ONBUILD [指令]。
配置将创建的镜像用作其他新创建的镜像的基础镜像时要执行的操作语句。
例如,Dockerfile 使用以下内容创建镜像 A。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]如果基于镜像A创建新的镜像,并在新的Dockerfile中使用FROM image-A命令指定基础镜像,则ONBUILD语句的内容会自动执行,相当于在文件。结束了。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src对于使用 ONBUILD 指令的镜像,建议在标签中注明,例如 ruby:1.9-onbuild。
3。构建镜像
编写完Dockerfile后,就可以使用docker build命令构建镜像了。
默认格式是 docker build [option] 路径。该命令读取指定路径(包括子目录)下的Dockerfile,并将该路径的所有内容发送到构建镜像的Docker服务器。因此,一般建议Dockerfile目录为空。您还可以通过 .dockerignore 文件告诉 Docker 忽略路径下的目录和文件(每行添加适当的模式)。
输入t开关指定图像标签信息,例如
$ sudo docker build -t myrepo/myapp /tmp/test1/ 版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网