Dockerfile制作相关命令

一、常用命令

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 可以有多种形式:
    1. 执行命令:
    shell 复制代码
    CMD ["executable", "param1", "param2"] 如 CMD ["python3", "app.py"]
    1. Shell 形式:
    shell 复制代码
    CMD ["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;"]
相关推荐
半支烟隐 pzishuo1 小时前
Kubernetes Gateway API 完全指南
容器·kubernetes·gateway
兵bing1 小时前
Docker Compose 配置文件归纳总结-千问
运维·docker·容器
TechWJ2 小时前
Excel报表越做越乱?用Metabase搭建可更新的数据仪表盘
docker·数据分析·excel·metabase·报表工具
凌虚(失业了求个工作)4 小时前
Kubernetes 编年史:从 Borg 到云原生操作系统
云原生·容器·kubernetes
冰封之寂4 小时前
Kubernetes Pod 管理完全指南:从基础命令到高级调度
云原生·容器·kubernetes
ZzzZZzzzZZZzzzz…5 小时前
K8s实战: 用OpenELB破解Service外部访问难题
云原生·容器·kubernetes
java_logo13 小时前
Docker 部署 NetBox:轻松搭建 IPAM / DCIM 网络资产管理平台
docker·容器·轩辕镜像·netbox部署·netbox部署方案·netbox部署文档·docker部署netbox
码农阿豪13 小时前
【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
数据库·macos·docker
PC2005-cloud14 小时前
从零上手 openGauss:Docker 部署 + 全场景连接教程
运维·docker·容器
风曦Kisaki15 小时前
Kubernetes(K8s)笔记Day06: 持久化存储(emptyDir,hostPath,NFS),PV 和 PVC,StorageClass存储类
linux·运维·笔记·云原生·容器·kubernetes