一. Dockerfile 语法
如下为 安装 Kong 的Dockerfile:
FROM ubuntu
ADD jdk-8u51-linux-x64.tar.gz /opt/
ADD dsc-cassandra-2.1.11-bin.tar.gz /opt/
ADD kong-0.5.4.trusty_all.deb /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_51
ENV PATH=$JAVA_HOME/bin:$PATH
RUN apt-get update && apt-get install -y \
dnsmasq-base \
dnsmasq \
openssl \
curl
RUN dpkg -i /opt/kong-0.5.4.trusty_all.deb
EXPOSE 8000
ADD entrypoint.sh /bin/entrypoint.sh
CMD ["/bin/entrypoint.sh"]
FROM ubuntu:FROM 必须在第一行,声明是基于什么镜像构建的。
ADD : 可以复制文件,也可以复制文件夹。注意: src 目录必须要和 Dockerfile 文件同级或者在下级,不能是 ../xx/xx 这种。
ENV =,或者 ENV :用于设置环境变量。
RUN :可以用于执行命令。
EXPOSE:暴露该容器的指定的端口给别的容器访问(不是暴露给宿主机访问)
CMD:一个Dockerfile 只能有一个 CMD。用于指定容器启动时执行的命令。
二. Dockerfile 一些关键字的区别
-p 和 expose
-p 80:8080 外部80 端口转向 向外暴露是 8080 端口的 Docker 容器。如果只写 -p 80 ,那么当作是 -p 80:80。也就是说,容器之间可以访问该 暴露8080端口的容器,其他用户也可以访问
exposes 80:表示 容器之间可以访问该 暴露80端口的容器,但是其他用户不可以可以访问。这样其实就是做到了 封闭。RUN,CMD,ENTRYPOINT
3个都可以执行命令。执行的时机不同,RUN 先于 CMD 和 ENTRYPOINT。CMD 和 ENTRYPOINT 区别在于 docker run 时 参数的传递方式不同。CMD 指定的命令可以被docker run 传递的命令覆盖。而ENTRYPOINT 会把 容器后面的所有内容都当成参数传递给指定的命令,但是不会覆盖。ADD COPY
ADD 可以是 URL ,比 COPY 要强大点。COPY 能做的,ADD 都可以做。