当前位置: 首页 > article >正文

Dockerfile制作相关命令

一、常用命令

1. FROM

指令指定基础镜像

FROM <image>:<tag>  如 FROM ubuntu:20.04

image: 基础镜像名称。
tag: 可选,镜像标签,默认为 latest。

2. RUN

用于在构建镜像时执行命令。可以用于安装软件包或配置文件等。

RUN <command>  如 RUN apt-get update && apt-get install -y python3

3. COPY

将本地文件或目录复制到镜像中的指定位置。

COPY <source> <destination>  如 COPY ./myfile.txt /app/myfile.txt

source: 本地路径(相对路径或绝对路径)。
destination: 镜像中的目标路径。

4. ADD

ADD 和 COPY 类似,但 ADD 还支持从 URL 下载文件以及自动解压归档文件(如 .tar)。

ADD <source> <destination>  如 ADD myarchive.tar.gz /app/

5. WORKDIR

设置工作目录,之后的 RUN, CMD, ENTRYPOINT 等指令都会在这个目录下执行。

WORKDIR <path>  如 WORKDIR /app

6. CMD

指定容器启动时执行的命令。

CMD 可以有多种形式:
    1. 执行命令:
    CMD ["executable", "param1", "param2"] 如 CMD ["python3", "app.py"]
    
    1. Shell 形式:
    CMD ["param1", "param2"](会通过 /bin/sh -c 运行)
    

注意: 如果在运行容器时指定了命令,CMD 指令将被忽略。

7. ENTRYPOINT

指定容器启动时的主命令。ENTRYPOINT 和 CMD 类似,但 ENTRYPOINT 不会被容器运行时的命令覆盖。

ENTRYPOINT ["executable", "param1", "param2"]  如 ENTRYPOINT ["python3", "app.py"] 或 ENTRYPOINT ["start.sh"]

8. EXPOSE

声明容器在运行时监听的网络端口(但不进行端口映射)。

EXPOSE <port> [<port>/<protocol>...] 如 EXPOSE 8080 8081/udp

9. ENV

设置环境变量,容器中运行的进程可以访问这些变量。

ENV <key>=<value> ...   如 ENV APP_ENV=dev

10. VOLUME

用于创建一个挂载点,可以把主机或其他容器的文件夹挂载到这个点。

VOLUME ["/path/to/dir"]   如 VOLUME ["/data"]

11. USER

指定容器内的用户身份。默认情况下,容器以 root 用户身份运行,可以通过 USER 指令更改。

USER <username> | <UID>USER myuser

12. ARG

用于定义构建时的变量,可以在 docker build 命令中通过 --build-arg 参数传递。

ARG <name>[=<default_value>]  如  ARG VERSION=1.0

13. LABEL

用于为镜像添加元数据。通常用来提供版本信息、维护者信息等。

LABEL <key>=<value>  如 LABEL version="1.0" maintainer="your name"

14. SHELL

用来更改 Dockerfile 中 RUN 指令所使用的默认 shell(默认是 /bin/sh -c)。

SHELL ["executable", "parameters"]SHELL ["/bin/bash", "-c"]

二、使用样例

  • entrypoint.sh

容器执行入口,自定义执行方式

#!/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 镜像的配置文件

# 基于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 缓存,减少不必要的重建。

# 基础镜像
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;"]

http://www.kler.cn/a/441531.html

相关文章:

  • [Computer Vision]实验二:图像特征点提取
  • 基于单片机的智能台灯设计
  • 【前端】CSS实战之音乐播放器
  • 重生之我在异世界学编程之C语言:深入指针篇(上)
  • 【算法】字符串之227.基本计算器 -- 双栈的变形
  • 风光并网对电网电能质量影响的matlab/simulink仿真建模
  • Ruyi-Mini-7B:开源的图像生成视频模型
  • 利用SpringAOP的返回通知处理数据加密返回
  • vulnhub靶场【DriftingBlues】之5
  • 12.16【net】[debug]SOCKET_RAW无法在热点局域网下传递,悬而未决
  • Android-Glide详解二
  • git如何撤销最近一个或几个提交
  • Redisson常用方法
  • 如何解决手机,电脑等工作室同ip关联问题
  • Springboot3.x配置类(Configuration)和单元测试
  • MySQL--》解析事务从隔离级别到死锁处理
  • Redis在库存里的应用
  • Python中工具脚本在本地共享给不同项目
  • 【C++】小乐乐求和问题的高效求解与算法对比分析
  • 深入探讨HTML页面中CSS的加载顺序
  • 大数据-179 Elasticsearch - 原理剖析 倒排索引与读写流程
  • 远程控制电脑技术让我们的生活更加简化
  • 期末复习-计算机网络应用题
  • ElementUI中el-dropdown-item点击事件无效
  • 《Vue进阶教程》第十四课:改进桶结构
  • 基于微信小程序的小区疫情防控ssm+论文源码调试讲解