[关闭]
@bergus 2015-12-30T07:48:21.000000Z 字数 4939 阅读 1693

Docker 2 -- 关于Dockerfile

Dockerfile docker


Dockerfile是一个镜像的表示,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器

所有的 Dockerfile 命令格式都是:
INSTRUCTION arguments

虽然指令忽略大小写,但是建议使用大写。

FROM 命令

FROM

FROM :

这个设置基本的镜像,为后续的命令使用,所以应该作为Dockerfile的第一条指令。

比如:
FROM ubuntu
如果没有指定 tag ,则默认tag是latest,如果都没有则会报错。

RUN 命令

RUN命令会在上面FROM指定的镜像里执行任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到。

两种格式:

RUN (the command is run in a shell - /bin/sh -c)

或:

RUN ["executable", "param1", "param2" ... ] (exec form)

RUN命令等价于:

docker run image command
docker commit container_id

注释

使用 # 作为注释

如:

  1. # VERSION 1.0
  2. # use the ubuntu base image provided by dotCloud
  3. FROM ubuntu
  4. # make sure the package repository is up to date
  5. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
  6. RUN apt-get update
  7. # install memcached
  8. RUN apt-get install -y memcached

MAINTAINER 命令

MAINTAINER name

MAINTAINER命令用来指定维护者的姓名和联系方式

如:

  1. MAINTAINER Guillaume J. Charmes, guillaume@dotcloud.com

ENTRYPOINT 命令

http://cloud.51cto.com/art/201411/457338.htm
有两种语法格式,一种就是上面的(shell方式):

ENTRYPOINT cmd param1 param2 ...

第二种是 exec 格式:

ENTRYPOINT ["cmd", "param1", "param2"...]

如:

ENTRYPOINT ["echo", "Whale you be my container"]

container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条
ENTRYPOINT 命令设置在容器启动时执行命令

  1. root@tankywoo-docker:~# cat Dockerfile
  2. FROM ubuntu
  3. ENTRYPOINT echo "Welcome!"
  4. root@tankywoo-docker:~# docker run 62fda5e450d5
  5. Welcome!

USER 命令

比如指定 memcached 的运行用户,可以使用上面的 ENTRYPOINT 来实现:

ENTRYPOINT ["memcached", "-u", "daemon"]

更好的方式是:

ENTRYPOINT ["memcached"]
USER daemon

EXPOSE 命令

EXPOSE 命令可以设置一个端口在运行的镜像中暴露在外

EXPOSE [...]

比如memcached使用端口 11211,可以把这个端口暴露在外,这样容器外可以看到这个端口并与其通信。

EXPOSE 11211

container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:

docker run -d -p 127.0.0.1:33301:22 centos6-ssh

container ssh服务的22端口被映射到主机的33301端口

一个完整的例子:

  1. # Memcached
  2. #
  3. # VERSION 2.2
  4. # use the ubuntu base image provided by dotCloud
  5. FROM ubuntu
  6. MAINTAINER Victor Coisne victor.coisne@dotcloud.com
  7. # make sure the package repository is up to date
  8. RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
  9. RUN apt-get update
  10. # install memcached
  11. RUN apt-get install -y memcached
  12. # Launch memcached when launching the container
  13. ENTRYPOINT ["memcached"]
  14. # run memcached as the daemon user
  15. USER daemon
  16. # expose memcached port
  17. EXPOSE 11211

上面是官方例子,国内建议换成163或sohu的源,不然太慢了。

  1. root@tankywoo-docker:~# docker build -t tankywoo - < dck [38/480]
  2. Uploading context 2.56 kB
  3. Uploading context
  4. Step 0 : FROM ubuntu
  5. ---> 99ec81b80c55
  6. Step 1 : MAINTAINER Victor Coisne victor.coisne@dotcloud.com
  7. ---> Using cache
  8. ---> 2b58110877f6
  9. Step 2 : RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list
  10. ---> Running in f55a4a8bb069
  11. ---> d48c6a965398
  12. Step 3 : RUN apt-get update
  13. ---> Running in da091a1dd6e7
  14. Ign http://mirrors.163.com precise InRelease
  15. Get:1 http://mirrors.163.com precise Release.gpg [198 B]
  16. ....
  17. Processing triggers for libc-bin (2.19-0ubuntu6) ...
  18. Processing triggers for ureadahead (0.100.0-16) ...
  19. ---> 2886671b5b86
  20. Step 5 : ENTRYPOINT ["memcached"]
  21. ---> Running in e8aeeab92cb6
  22. ---> 7148293a4053
  23. Step 6 : USER daemon
  24. ---> Running in 288766b19606
  25. ---> 235e7f630ffa
  26. Step 7 : EXPOSE 11211
  27. ---> Running in c6f881b9d51f
  28. ---> 666c5d65f396
  29. Successfully built 666c5d65f396
  30. Removing intermediate container f55a4a8bb069
  31. Removing intermediate container da091a1dd6e7
  32. Removing intermediate container f23631d3d45a
  33. Removing intermediate container e8aeeab92cb6
  34. Removing intermediate container 288766b19606
  35. Removing intermediate container c6f881b9d51f

ENV 命令

用于设置环境变量

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

ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
设置了后,后续的RUN命令都可以使用

使用此dockerfile生成的image新建container,可以通过 docker inspect 看到这个环境变量:

  1. root@tankywoo-docker:~# docker inspect 49bfc7a9817f
  2. ...
  3. "Env": [
  4. "name=tanky",
  5. "HOME=/",
  6. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  7. ],
  8. ...

里面的name=tanky就是设置的。

也可以通过在docker run时设置或修改环境变量:

  1. docker run -i -t --env name="tanky" ubuntu:newtest /bin/bash

ADD 命令

从src复制文件到container的dest路径:

ADD

<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url
<dest> 是container中的绝对路径

将文件拷贝到container的文件系统对应的路径

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

如果文件是可识别的压缩格式,则docker会帮忙解压缩

如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下


如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如:

docker build github.com/creack/docker-firefox


docker-firefox目录下必须有Dockerfile和要ADD的文件


注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD
 url file.

ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

VOLUME 命令

VOLUME ["mountpoint"]

如:

  1. VOLUME ["/data"]

创建一个挂载点用于共享目录

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

具体参考 Docker 4 -- 总结

WORKDIR 命令

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

配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径

可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令

比如:

WORKDIR /a WORKDIR b WORKDIR c RUN pwd

其实是在 /a/b/c 下执行 pwd

CMD 命令

有三种格式:

  1. CMD ["executable","param1","param2"] (like an exec, preferred form)
  2. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  3. CMD command param1 param2 (as a shell)

一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效。

The main purpose of a CMD is to provide defaults for an executing container.(为可执行的容器提供默认值) These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT as well. 

TODO 还没搞清楚这个的作用

ONBUILD

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

总结一下,基本常用的命令是: FROM, MAINTAINER, RUN, ENTRYPOINT, USER, PORT, ADD
一些例子

  1. docker-wordpress-nginx A Dockerfile that installs the latest wordpress, nginx and php-fpm.
  2. rails-meets-docker
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注