如何编写 Dockerfile

如何使用 Dockerfile

Dockerfile 用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image,并命名为tenxcloud/helloworld。

docker build -t tenxcloud/helloworld  .

Dockerfile 的关键字

如何编写Dockerfile,格式如下:

# Comment
INSTRUCTION arguments

FROM
基于哪个base镜像

RUN
安装软件或者运行命令用

MAINTAINER
镜像创建者

CMD
container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD。CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令。

ENTRYPOINT
container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条。ENTRYPOINT没有CMD的可替换特性

USER
使用哪个用户跑container

EXPOSE

container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:
docker run -d -p 127.0.0.1:3000:22 ubuntu-ssh
container ssh服务的22端口被映射到主机的33301端口

ENV
用来设置环境变量,比如:ENV ROOT_PASS tenxcloud

ADD
将文件<src>拷贝到container的文件系统对应的路径<dest>。ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

VOLUME
可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR
切换目录用,可以多次切换(相当于cd命令),对RUN、CMD、ENTRYPOINT生效

ONBUILD
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

更详细的资料,请参考Docker官方关于 Dockerfile 的描述。

如何构建及部署镜像

编写好了Dockerfile之后,您可以通过时速云平台构建镜像。具体可以参考 代码构建

一个完整的 Dockerfile 的例子

# Dockerfile to create a docker image
# Base image
FROM golang:1.4.2

# Add project folder to the image
ADD . $GOPATH/src

ADD run.sh /run.sh

RUN chmod +x /run.sh

# Expose the container port
EXPOSE 8080

WORKDIR $GOPATH/src

CMD ["/run.sh"]