Docker dockerfile脚本实例

本文详细介绍了Dockerfile的常用命令,包括FROM、MAINTAINER、RUN、ENTRYPOINT、CMD、EXPOSE、ENV、ADD、COPY、VOLUME、USER、WORKDIR、ONBUILD等,并给出了ssh、nginx和Tomcat镜像的构建实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dockerfile

一种常见的docker镜像创建方法

常用命令

FROM 镜像
指定新镜像所基于的镜像,第一条 指令必须为FROM指令,每创建一个镜像就需要一条FROM 指令

MAINTAINER 名字
说明新镜像的维护人信息

RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中

ENTRYPOINT [“要运行的程序”,“参数1”,“参数2”]
设定容器启动时第一个运行的命令及其参数
可以通过 使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容

CMD [“要运行的程序”,“参数1”,“参数2”]

shell形式: CMD 命令 参数1 参数2

启动容器时默认执行的命令或者脚本,Dockerfile只 能有一条CMD命令。如果指定多条命令,只执行最后一条命令。
如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么cmd就会被覆盖
CMD可以为ENTRYPOINT指令提供默认参数

EXPOSE 端口号
指定新镜像加载到Docker 时要开启的端口

ENV 环境变量 变量值
设置一个环境变量

ADD 源文件/目录 目标文件/目录
将源文件复制到镜像中,源文件要与Dockerfile 位于相同目录中,或者是一个URL

有如下注意事项:
1.如果源路径是个文件,且目标路径是以/结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下

如果目标路径不存在,则会自动创建目标路径

2.如果源路径是个文件,且目标路径是不是以/结尾,则docker会把目标路径当作一个文件

如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件

如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名

如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意, 这种情况下,最好显示的以/结尾,以避免混淆

3.如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个月录,把源路径月录下的文件拷贝进来

如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下

4.如果源文件是个归档文件(压缩文件),则docker会自动帮解压

URL 下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压

COPY 源文件/目录 目标文件/目录
只复制本地主机.上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中

VOLUME [“目 录"]
在容器中创建一个挂载点

USER 用户名/UID
指定运行容器时的用户

WORKDIR 路径
为后续的RUN、 CMD、 ENTRYPOINT指定工作目录,类似 cd命令

ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令

当在一个Dockerfile文件中加上ONBUILD指令, 该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响

但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像( 比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令

当基于其他镜像构建文件时,如果那个镜像在编写过程中有ONBUILD命令,则先执行ONBUILD后面的命令,

实例

ssh镜像

#第一行必须指明基于的基础镜像
FROM centos:7

#作者信息
MAINTAINER this is ssh image <hbh>

#镜像的操作指令
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo 'abc1234' | passwd --stdin root

#不使用PAM认证
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config						

#取消pam限制
RUN sed -ri '/^session\s+required\s+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd

#生成密钥认证文件		
RUN ssh-keygen -t rsa -A	
													
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh

#记得暴露22端口
EXPOSE 22
 
CMD ["/usr/sbin/sshd" , "-D"]

nginx镜像

#基于基础镜像
FROM centos:7

#用户信息
MAINTAINER this is nginx image <hbh>

#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx

#上传nginx软件压缩包,并解压
ADD nginx-1.12.0.tar.gz /usr/local/src/

#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH

#指定http和https端口
EXPOSE 80
EXPOSE 443

#关闭nginx 在后台运行
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf	

#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

----------------------------------
编写run脚本
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

Tomcat镜像

------------------tomcat 镜像---------------------------
FROM centos:7
MAINTAINER this is tomcat image <hbh>
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-8.5.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值