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;"]
相关推荐
milk_yan2 小时前
Docker集成onlyoffice实现预览功能
前端·笔记·docker
来恩10035 小时前
Kubernetes学习指南与资料分享
云原生·容器·kubernetes
encoding-console6 小时前
docker安装consul并启动的详细步骤
docker·容器·consul
m0_748229997 小时前
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
docker·容器·node.js
shelby_loo7 小时前
Azure学生订阅上手实操:快速搭建Docker+WordPress环境
microsoft·docker·azure
小诺大人8 小时前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
_Eden_11 小时前
Docker入门学习
学习·docker·容器
张3蜂11 小时前
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
linux·docker·.net
mumu2lili13 小时前
k8s namespace绑定节点
java·容器·kubernetes
Dusk_橙子13 小时前
在K8S中,如果后端NFS存储的IP发送变化如何解决?
tcp/ip·容器·kubernetes