标签:守护进程 dev 直接 随机 数据 用法 指定路径 而且 shel
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
mkdir myNginx
cd myNginx/
touch Dockerfile
Dockerfile文件加入下面两行,并保存退出
FROM nginx
RUN echo ‘<h1>hello world<h1>‘ > /usr/share/nginx/html/index.html
在Dockerfile所在目录执行docker build -t nginx:v3 .
,注意最后的.
docker images查看刚刚构建的镜像
执行docker run --name myNginx1 -d -p 80:80 adfeac0c1998
启动容器,并把nginx默认80端口映射到宿主机80端口(如果宿主机是阿里云,需要将端口加入安全组)
通过宿主机IP和端口验证一下:
指定定制需要的基础镜像。后续的操作都是基于基础镜像。
用于执行后面跟着的命令行命令。两种格式:
1.RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
2.RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
从上下文目录
中复制文件或者目录到容器里指定路径。格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
1.源路径是相对于
上下文目录
的相对路径,COPY时用到的文件应该放在docker build时指定的上下文目录内
2.[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
3.源路径可以是通配符形式,目标路径如果不存在会自动创建
指令格式与COPY一样,功能也类似。不同之处在于:如果源文件是tar压缩文件,ADD会自动复制并解压到目标路径。
同样需求下,官方推荐使用 COPY。具体是否使用,可以根据是否需要自动解压来决定。
启动的容器指定默认
要运行的程序及参数。如果docker run没有指定任何的执行命令或者
与RUN类似,但两者运行时间的不同:
1.shell格式:CMD <shell 命令>
2.exec格式:CMD ["<可执行文件或命令>","<param1>","<param2>",...] #推荐写法
3.CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效;CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
指定程序入口点,不会被docker run指令覆盖。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
如果docker run命令后面有东西,那么后面的全部都会加入entrypoint的参数。如果docker run后面没有额外的东西,但是cmd有,那么cmd的全部内容会加入entrypoint的参数。
Dockerfile:
FROM centos
CMD ["b in cmd"]
ENTRYPOINT ["echo","a in entrypoint"]
docker run带参数和不带参数区别:
总结下一般该怎么使用:
一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,以及存放定参。可变参数比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接docker run,否则想用其他参数,就docker run后面加参数。
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
例如设置ENV NODE_VERSION 7.2.0
, 在后续的指令中可以通过 $NODE_VERSION 引用。
仅仅只是声明端口。一般真实映射端口,使用docker run的-p
参数。
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
docker build -t nginx:v3 .
基于Dockerfile和上下文(context),可以通过docker build
命令来创建镜像,一般格式是docker build [选项] 路径
。
注意:
1.这里的路径是指定上下文(context)的路径,不代表Dockerfile文件路径。产生误解的主要原因是:默认情况下会将上下文目录(Context)下的名为Dockerfile 的文件作为 Dockerfile。实际上 Dockerfile 的文件名并不要求必须为Dockerfile ,而且并不要求必须位于上下文目录(Context)中,比如可以用 -f ../Dockerfile.php 参数指定某个文件作为 Dockerfile 。
2.构建由 Docker 守护程序运行,而不是由 CLI 运行。构建过程做的第一件事是将整个上下文(递归地)上传到守护进程(并非上传到镜像,具体上传镜像是由ADD、COPY等命令)。在大多数情况下,最好从一个空目录作为上下文开始,并将 Dockerfile 保存在该目录中。仅添加构建 Dockerfile 所需的文件(例如ADD、COPY所需文件)。
-t:指定镜像标签信息
-f:如果要指定非上下文目录中的文件作为Dockerfile,可使用该参数。
拓展用法:
#docker build -t [镜像的名字及标签,通常 name:tag] -f [指定要使用的Dockerfile路径] [ContextPath]
docker build -f /root/otherDir/otherFile -t nginx:v3 /root/myNginx
COPY 这类指令中的源文件的路径都是相对路径,./意味着(context) 目录。这也是为什么 COPY ../package.json /app 或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了引擎中context的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到context目录中去。
参考:
https://www.runoob.com/docker/docker-dockerfile.html
https://docs.docker.com/engine/reference/builder/
https://blog.csdn.net/weixin_43002202/article/details/108735549
https://blog.csdn.net/u010900754/article/details/78526443
标签:守护进程 dev 直接 随机 数据 用法 指定路径 而且 shel
原文地址:https://www.cnblogs.com/tang-hao/p/14851645.html