Skip to main content

Dockerfile命令

Dockerfile配置

例子1

镜像例子运行js的例子

FROM node
WORKDIR /app
COPY app.js /app
# 使用 `RUN` 指令运行需要的命令,例如,在容器中安装依赖项。
# RUN npm install
CMD ["node", "app.js"]

# docker build -f dockerfile . -t code-js
# docker run -d -p 8800:8800 code-js
# docker run code-js

例子2

使用Alpine版本的Node.js作为基础镜像,并指定了工作目录。它首先复制package.json文件,然后安装依赖项,接着将整个项目代码复制到容器中,运行npm run build命令进行构建,最后通过CMD命令启动应用程序。

# 指定node镜像版本
FROM node:14.15.0-alpine3.12

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY package.json /app

# 安装项目依赖
RUN npm install

# 将源代码复制到容器中
COPY . /app

# 运行构建命令
RUN npm run build

# 启动应用程序
CMD ["npm", "start"]

例子3

FROM node:18-alpine as installer

WORKDIR /app

COPY ./apps/web/package.json .

RUN yarn install

# 分阶段减少体积
# FROM node:18-alpine as builder

WORKDIR /app


# copy needed files
COPY ./apps/web .

# copy node_modules
# COPY --from=installer /app/node_modules ./node_modules

RUN yarn build

# cleanup devDependencies
# RUN npm prune --production

# run app
FROM node:18-alpine

WORKDIR /app

# COPY --from=builder /app .

# COPY --from=builder /app/node_modules ./node_modules
# COPY --from=builder /app/public ./public
# COPY --from=builder /app/next-i18next.config.js ./next-i18next.config.js
# COPY --from=builder /app/.env ./.env
# COPY --from=builder /app/.env.production ./.env.production
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/next.config.js ./next.config.js
COPY --from=builder /app/package.json ./package.json

CMD yarn start

# docker build -f dockerfile.web . -t code-web
# docker run -d -p 3600:3600 code-web

前言

Dockerfile 是自动构建 Docker 镜像的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 Linux 下的 Shell 命令。

Dockerfile 分为四个部分:

  • 基础镜像(父镜像)信息指令 FROM。
  • 维护者信息指令 MAINTAINER。
  • 镜像操作指令 RUN 、EVN 、ADD 和 WORKDIR 等。
  • 容器启动指令 CMD 、ENTRYPOINT 和 USER 等。
FROM python:2.7
MAINTAINER 大技术<test@gmail.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000ENTRYPOINT ["python"]CMD ["app.py"]

分析上面:

从 Docker Hub 上 Pull 下 Python 2.7 的基础镜像
显示维护者的信息
Copy 当前目录到容器中的 /App 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里
指定工作路径为 /App
安装依赖包
暴露 5000 端口
启动 App

ADD

复制指定的源文件、目录、URL到容器的指定目录中。所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0。

如果源是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果源文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果源是文件且目标目录中不使用斜杠结束,则会将目标目录视为文件,源的内容会写入目标目录;如果源是文件且目标目录中使用斜杠结束,则会源文件拷贝到目标目录下。

#具体使用法如下:
ADD <源> <目标>

FROM

所有的 Dockerfile 都应该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。

同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。比如我们要指定 Python 2.7 的基础镜像:

FROM python:2.7

MAINTAINER

MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER。

COPY

COPY 是用于复制本地主机的(为 Dockerfile 所在目录的相对路径)到容器中的。

  • 路径必须是绝对路径,如果不存在,会自动创建对应目录
  • 路径必须是Dockerfile 所在路径的相对路径
  • 如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制

要拷贝当前目录到容器中的 /app 目录下:

COPY . /app

WORKDIR

指定RUN、CMD、ENTRYPIONT指定的命令的运行目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /data WORKDIR work。最终的路径就是/data/work。path路径也可以是环境变量。

WORKDIR 用于配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。

可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令

例如我们设置 /app 路径,我们可以进行如下操作:

WORKDIR / app

ENV

在镜像中用于设置环境变量的,然后RUN命令可以使用此设置的环境变量,在容器启动后也以通过docker inspect查看环境变量,可以通过docker run --env key=value来设置或修改环境变量。

#具体使用法如下:
ENV <key> <value>
ENV JAVA_HOME /usr/local/jdk

RUN

RUN 用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN。 例如我们要安装 Python 依赖包,我们做法如下:

RUN pip install -r requirements.txt

EXPOSE

EXPOSE 命令用来指定对外开放的端口。

指定容器的端口映射(容器与物理机),运行容器时加上-p参数指定EXPOSE设置的端口。EXPOSE可以设置多个端口号,相应地运行容器配套多次使用-p参数。可以通过docker port +容器需要映射的端口号和容器ID来参考宿主机的映射端口。

EXPOSE 5000

ENTRYPOINT

ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

ENTRYPOINT 命令也有两种格式:

ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 Exec 形式。
ENTRYPOINT command param1 param2 :Shell 形式。

要将 Python 镜像变成可执行的程序,我们可以这样去做:

ENTRYPOINT ["python"]

CMD

CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。

不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为 ENTRYPOINT 的参数。

CMD 命令有三种格式:

CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
CMD ["param1","param2"]:无可执行程序形式。
CMD command param1 param2:Shell 形式

一个 Dockerfile 中只能有一个 CMD,如果有多个,则最后一个生效。而 CMD 的 Shell 形式默认调用 /bin/sh -c 执行命令。

CMD 命令会被 Docker 命令行传入的参数覆盖:docker run busybox /bin/echo Hello Docker 会把 CMD 里的命令覆盖。

例如我们要启动 /app ,我们可以用如下命令实现:

CMD ["app.py"]

构建 Dockerfile

FROM nginx:alpine
RUN echo '<h1>hello docker nginx</h1>' > /usr/share/nginx/html/index.html
docker build -t nginx:1.0 .

-t 是为新镜像设置仓库和名称
nginx 为镜像名
:1.0 为标签(不添加为默认 latest )
docker run --name nginx -d -p 8080:80 nginx:1.0