dockerfile | 简单使用

385 阅读3分钟
1、.dockerignore

在项目的根目录下,新建一个文本文件.dockerignore,写入

.dockerignore
node_modules
npm-debug.log
上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有路径要排除,这个文件可以不新建。
2、Dockerfile

在项目的根目录下,新建一个文本文件 Dockerfile

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000

FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app:指定接下来的工作路径为/app,就是容器启动时的工作目录。
RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
3、生成镜像
docker image build -t koa-demo:latest .		(注意有一点)

该命令将读取指定路径下(包括子目录)的 Dockerfile ,并将该路径下所有数据作为上下文( Context )发送给 Docker 服务端。
如果上下文过大, 会导致发送大量数据给服务端,延缓构建过程 除非是生成镜像所必需的文件,不然不要放到上下文路径下。
如果使用非上下文路径下的 Dockerfile ,可以通过-f选项来指定其路径。
4、生成容器
docker container run -p 8000:3000 -it koa-demo /bin/bash
        -p参数:容器的 3000 端口映射到本机的 8000 端口。
        -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
        koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
        /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。

==端口要暴露才能映射,没暴露的端口就算容器运行的时候,将端口映射出去也是没用的==

5、run 和 cmd

RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

6、COYP的坑

COPY指令如果是拷贝一个文件夹,那么只会拷贝文件夹的内容;不会拷贝整个文件夹;

7、多阶构建

完成多阶段构建我们只需要在Dockerfile中多次使用FORM声明,每次FROM指令可以使用不同的基础镜像,并且每次FROM指令都会开始新的构建,我们可以选择将一个阶段的构建结果复制到另一个阶段,在最终的镜像中只会留下最后一次构建的结果;

FROM golang:alpine
WORKDIR  /usr/src
COPY  ./helloworld  ./helloworld
RUN go build ./helloworld/main.go
#/src/helloworld
#在/src下编译,可执行文件叫main,位置也在/src下
#--from=0,表示从上一阶段的镜像中复制文件
FROM alpine
WORKDIR /src
COPY --from=0 /usr/src/main .
CMD ./main

golang镜像只是用来编译而已,在后面的容器运行中并没有再用到了,所以不需要打包进来,只需要将编译好的可执行文件打包进新的镜像就行了

在Dockerfile里可以使用as来为某一阶段取一个别名”build-env”:

FROM golang:1.11.2-alpine3.8 AS build-env

然后从上一阶段的镜像中复制文件,也可以复制任意镜像中的文件:

COPY --from=build-env /go/bin/hello /usr/bin/hello 

在helloworld内go build,生成的可行性文件在helloworld内,名字是helloworld;

在helloworld外go build,生成的可行性文件在helloworld外,名字是main;

写Dokcerfile的时候要注意;