添加文件
例如:
ADD my.cnf /etc/mysql
or
ADD my.cnf /etc/mysql/
以上两条命令均可以将my.cnf文件添加到/etc/mysql文件夹下面。
1
2
3
4
5
6
例如:
ADDmy.cnf/etc/mysql
or
ADDmy.cnf/etc/mysql/
以上两条命令均可以将my.cnf文件添加到/etc/mysql文件夹下面。
添加文件夹
Dockerfile添加文件夹,则必须镜像中存在和当前文件夹同名的文件夹才行。例如,我希望将当前目录下的views文件夹添加到docker镜像中的app文件夹下。也许你会采用这样的方式:
ADD views /app #错误的方式
ADD views /app/views #正确的方式
1
2
3
ADDviews/app#错误的方式
ADDviews/app/views#正确的方式
也就是说:镜像中存在和当前需要拷贝或添加的文件夹同名的文件夹时,才能够拷贝或添加成功。
声明环境变量:
ENV :在docker 启动容器的时候传递给容器的环境变量
ENV JAVA_HOME=/opt/jdk1.8.0 #设置(容器启动时的)环境变量
ENV JRE_HOME=$JAVA_HOME/jre
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
注意:(建议用一层环境变量,可以使用反斜杠换行)
1
2
3
4
5
6
7
ENVJAVA_HOME=/opt/jdk1.8.0#设置(容器启动时的)环境变量
ENVJRE_HOME=$JAVA_HOME/jre
ENVPATH=$JAVA_HOME/bin:$PATH
ENVCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
注意:(建议用一层环境变量,可以使用反斜杠换行)
ARG: build过程当中,传递给build 的参数(参数)
ARG xxx=/opt/demo
ARG xxx=/opt/demo2
1
2
ARGxxx=/opt/demo
ARGxxx=/opt/demo2
运行镜像
RUN :是在build命令的的过程当中运行的(只要定义的RUN都会被运行)
CMD:是在docker run启动镜像的过程中运行的(只能定义一个,定义多个没用)
ENTRYPOINT:只会运行cmd,如果有这个,cmd就没用了
用户身份
USER:用于指定运行image时的或运行Dockerfile中任何RUN,CMD,或ENTRYPOINT指令的程序是的用户名或者UID
健康状态检测
HEALTHCHECK:
HEALTHCHECK --interval=5m --timeout=3s \ #检测试剂5分钟,超时时间3秒钟
CMD curl -f http://loclahost/ || exit 1 #检测命令,如果成功就ok,错误就返回1并且退出
1
2
HEALTHCHECK--interval=5m--timeout=3s\#检测试剂5分钟,超时时间3秒钟
CMDcurl-fhttp://loclahost/||exit1#检测命令,如果成功就ok,错误就返回1并且退出
挂载
VOLUME
VOLUME [ "/data" ] #将这个目录作为存储卷进行挂载
1
VOLUME["/data"]#将这个目录作为存储卷进行挂载
下面是完整构建镜像代码
FROM centos:7#你的war/jar包要放的系统镜像,也可以是你自制的本地镜像id 例如:FROM e28fcf3c832f
ENV container docker#设置环境变量
WORKDIR /opt/#切换到镜像里某个目录
RUN mkdir jdk1.8.0
RUN mkdir apache-tomcat-7.0
ADD jdk1.8.0 /opt/jdk1.8.0
ADD apache-tomcat-7.0 /opt/apache-tomcat-7.0
ADD hello.war /opt/apache-tomcat-7.0/webapps
ENV JAVA_HOME=/opt/jdk1.8.0
ENV JRE_HOME=$JAVA_HOME/jre
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ] #将这个目录作为存储卷进行挂载
CMD ["/usr/sbin/init"]#执行shell命令
EXPOSE 8088 #就是将容器的对应端口服务公开给外界访问,而EXPOSE仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
ENTRYPOINT ["/opt/apache-tomcat-7.0/bin/catalina.sh","run"] #和CMD差不多,都是运行指令之类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
FROMcentos:7#你的war/jar包要放的系统镜像,也可以是你自制的本地镜像id 例如:FROM e28fcf3c832f
ENVcontainerdocker#设置环境变量
WORKDIR/opt/#切换到镜像里某个目录
RUNmkdirjdk1.8.0
RUNmkdirapache-tomcat-7.0
ADDjdk1.8.0/opt/jdk1.8.0
ADDapache-tomcat-7.0/opt/apache-tomcat-7.0
ADDhello.war/opt/apache-tomcat-7.0/webapps
ENVJAVA_HOME=/opt/jdk1.8.0
ENVJRE_HOME=$JAVA_HOME/jre
ENVPATH=$JAVA_HOME/bin:$PATH
ENVCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
RUN(cd/lib/systemd/system/sysinit.target.wants/;foriin*;do[$i==\
systemd-tmpfiles-setup.service]||rm-f$i;done);\
rm-f/lib/systemd/system/multi-user.target.wants/*;\
rm-f/etc/systemd/system/*.wants/*;\
rm-f/lib/systemd/system/local-fs.target.wants/*;\
rm-f/lib/systemd/system/sockets.target.wants/*udev*;\
rm-f/lib/systemd/system/sockets.target.wants/*initctl*;\
rm-f/lib/systemd/system/basic.target.wants/*;\
rm-f/lib/systemd/system/anaconda.target.wants/*;
VOLUME["/sys/fs/cgroup"]#将这个目录作为存储卷进行挂载
CMD["/usr/sbin/init"]#执行shell命令
EXPOSE8088#就是将容器的对应端口服务公开给外界访问,而EXPOSE仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
ENTRYPOINT["/opt/apache-tomcat-7.0/bin/catalina.sh","run"]#和CMD差不多,都是运行指令之类
docker build . -t demo:v1.0 #构建镜像并且给镜像打上标签。不打标签就是原始的文字码
启动容器
docker run --name myapp --net bridge -it demo:v1.0
...
1
2
3
4
5
dockerbuild.-tdemo:v1.0#构建镜像并且给镜像打上标签。不打标签就是原始的文字码
启动容器
dockerrun--namemyapp--netbridge-itdemo:v1.0
...
最后编辑:2020-10-13作者:shooter
这个作者貌似有点懒,什么都没有留下。