一、常用命令
1. FROM
指令指定基础镜像
shell
FROM <image>:<tag> 如 FROM ubuntu:20.04
image: 基础镜像名称。
tag: 可选,镜像标签,默认为 latest。
如
2. RUN
用于在构建镜像时执行命令。可以用于安装软件包或配置文件等。
shell
RUN <command> 如 RUN apt-get update && apt-get install -y python3
3. COPY
将本地文件或目录复制到镜像中的指定位置。
shell
COPY <source> <destination> 如 COPY ./myfile.txt /app/myfile.txt
source: 本地路径(相对路径或绝对路径)。
destination: 镜像中的目标路径。
4. ADD
ADD 和 COPY 类似,但 ADD 还支持从 URL 下载文件以及自动解压归档文件(如 .tar)。
shell
ADD <source> <destination> 如 ADD myarchive.tar.gz /app/
5. WORKDIR
设置工作目录,之后的 RUN, CMD, ENTRYPOINT 等指令都会在这个目录下执行。
shell
WORKDIR <path> 如 WORKDIR /app
6. CMD
指定容器启动时执行的命令。
CMD 可以有多种形式:
-
- 执行命令:
shellCMD ["executable", "param1", "param2"] 如 CMD ["python3", "app.py"]
-
- Shell 形式:
shellCMD ["param1", "param2"](会通过 /bin/sh -c 运行)
注意: 如果在运行容器时指定了命令,CMD 指令将被忽略。
7. ENTRYPOINT
指定容器启动时的主命令。ENTRYPOINT 和 CMD 类似,但 ENTRYPOINT 不会被容器运行时的命令覆盖。
shell
ENTRYPOINT ["executable", "param1", "param2"] 如 ENTRYPOINT ["python3", "app.py"] 或 ENTRYPOINT ["start.sh"]
8. EXPOSE
声明容器在运行时监听的网络端口(但不进行端口映射)。
shell
EXPOSE <port> [<port>/<protocol>...] 如 EXPOSE 8080 8081/udp
9. ENV
设置环境变量,容器中运行的进程可以访问这些变量。
shell
ENV <key>=<value> ... 如 ENV APP_ENV=dev
10. VOLUME
用于创建一个挂载点,可以把主机或其他容器的文件夹挂载到这个点。
shell
VOLUME ["/path/to/dir"] 如 VOLUME ["/data"]
11. USER
指定容器内的用户身份。默认情况下,容器以 root 用户身份运行,可以通过 USER 指令更改。
shell
USER <username> | <UID> 如 USER myuser
12. ARG
用于定义构建时的变量,可以在 docker build 命令中通过 --build-arg 参数传递。
shell
ARG <name>[=<default_value>] 如 ARG VERSION=1.0
13. LABEL
用于为镜像添加元数据。通常用来提供版本信息、维护者信息等。
shell
LABEL <key>=<value> 如 LABEL version="1.0" maintainer="your name"
14. SHELL
用来更改 Dockerfile 中 RUN 指令所使用的默认 shell(默认是 /bin/sh -c)。
shell
SHELL ["executable", "parameters"] 如 SHELL ["/bin/bash", "-c"]
二、使用样例
容器执行入口,自定义执行方式
shell
#!/usr/bin/env bash
cd /opt/app
# look for jar file
JAR_NAME=""
# look for newest jar
latest_jar=$(ls -t *.jar 2>/dev/null | head -n 1)
if [ ! -z "$latest_jar" ]; then
JAR_NAME="$latest_jar"
echo "find jar: $JAR_NAME"
else
echo "jar not found !!!"
return;
fi
java -Duser.timezone=Asia/Shanghai \
-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m \
-XX:+HeapDumpOnOutOfMemoryError \
-jar $JAR_NAME
- Dockerfile
docker build 镜像的配置文件
shell
# 基于java17
FROM openjdk:17
# 作者信息
MAINTAINER me
# 工作目录
WORKDIR /opt/app
# 端口
EXPOSE 8080
# 挂载目录
VOLUME ["/opt/app"]
# 复制自定义执行脚本
COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh
# 启动容器时运行自定义脚本
ENTRYPOINT ["sh","/usr/local/bin/entrypoint.sh"]
三、进阶构建
分多个步骤制作 Docker 镜像是一个良好的习惯,它不仅有助于镜像的清晰和可维护性,还能在构建过程中更好地利用 Docker 缓存,减少不必要的重建。
shell
# 基础镜像
FROM node:latest AS application
# 设置工作目录
WORKDIR /app
# 将vue源码拷贝到工作目录
COPY myapp .
# 执行编译
RUN npm install
RUN npm run build
# 构建最终容器
FROM nginx:latest
# 从上个构建容器中,将编译后的文件复制到nginx工作目录,复制后application容器被抛弃,实际容器是当前nginx和复制过来的编译后文件,没有node环境
COPY --from=application /app/dist /usr/share/nginx/html
# 开放端口
EXPOSE 80
# 运行容器命令
CMD ['nginx","-g","daemon off;"]