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;"]
相关推荐
CAFEBABE 341 天前
linux离线安装docker并启动
linux·docker·eureka
yuguo.im1 天前
Docker 两大基石:Namespace 和 Cgroups
运维·docker·容器
会飞的土拨鼠呀1 天前
docker部署 outline(栗子云笔记)
笔记·docker·容器
Jelly-小丑鱼1 天前
Linux搭建syslog日志服务器
linux·服务器·docker·日志服务器·syslog服务器
没有bug.的程序员1 天前
高频IO服务优化实战指南
java·jvm·spring·容器
lisanmengmeng1 天前
docker 方式安装部署禅道zentao(五)
运维·docker·容器
程序员老赵1 天前
AdguardHome Docker 容器化部署指南
docker·dns
露临霜1 天前
Docker安装nginx
nginx·docker·容器
CAFEBABE 341 天前
安装完docker之后怎么使用
运维·docker·容器
测试人社区—小叶子1 天前
测试开发面试高频“灵魂八问”深度解析与应答策略
网络·人工智能·测试工具·云原生·容器·面试·职场和发展