Volume

 

举例:

Dockerfile.my-cron

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM alpine:latest
RUN apk update
RUN apk --no-cache add curl
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
SUPERCRONIC=supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
COPY my-cron /app/my-cron
WORKDIR /app

VOLUME ["/app"]

# RUN cron job
CMD ["/usr/local/bin/supercronic", "/app/my-cron"]

Dockerfile\text {Dockerfile} 构建了一个包含定时任务的容器镜像。下载并安装 SuperCronic\text {SuperCronic} 工具,然后将定时任务文件复制到容器中,并在容器启动时使用 SuperCronic\text {SuperCronic} 运行该任务。同时,通过定义数据 volume\text {volume},容器内的数据也可以在主机上进行持久化。

  1. FROM alpine:latest:指定基础镜像为 Alpine Linux\text {Alpine Linux} 最新版本。
  2. RUN apk update:更新 Alpine\text {Alpine} 的包管理器索引。
  3. RUN apk --no-cache add curl:安装 curl \text {curl }工具用于下载文件。
  4. ENV:设置环境变量,用于后续的 SuperCronic\text {SuperCronic} 安装。
    1. SUPERCRONIC_URL
    2. SUPERCRONIC
    3. SUPERCRONIC_SHA1SUM
  5. 使用 curl 下载 SuperCronic\text {SuperCronic} 可执行文件,并验证其完整性:
    • curl -fsSLO "$SUPERCRONIC_URL":下载 SuperCronic\text {SuperCronic} 文件。
    • echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c -:校验和验证文件的完整性。
    • chmod +x "$SUPERCRONIC":为文件添加可执行权限。
    • mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}":将 SuperCronic\text {SuperCronic} 移动到 /usr/local/bin 目录下。
    • ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic:创建到 SuperCronic\text {SuperCronic} 的软链接。
  6. COPY my-cron /app/my-cron:将名为 my-cron 的定时任务文件复制到容器内的 /app 目录。
  7. WORKDIR /app:设置工作目录为 /app,即所有后续命令都在这个目录下执行。
  8. VOLUME ["/app"]:定义数据卷,将容器内的 /app 目录映射到主机,用于持久化容器内的数据。
  9. CMD ["/usr/local/bin/supercronic", "/app/my-cron"]:设置容器启动时默认运行的命令,即运行 SuperCronic\text {SuperCronic} 工具来执行定时任务。

my-cron

1
*/1 * * * * date >> /app/test.txt

构建 my-cron\text {my-cron} 镜像:

1
docker buildx build -f Dockerfile.my-cron -t my-cron .

启动容器:

1
docker container run -d my-cron

进入容器,

1
docker container exec -it my-cron sh

间隔一定时间,可以观察到已经产生了测试文件输出:

退出并删除容器:

1
docker container rm -f my-cron

Usage\text {Usage}

1
docker volume COMMAND

Manage volumes\text {Manage volumes}

Commands
create Create a volume\text {Create a volume}
inspect Display detailed information on one or more volumes\text {Display detailed information on one or more volumes}
ls List volumes\text {List volumes}
prune Remove all unused local volumes\text {Remove all unused local volumes}
rm Remove one or more volumes\text {Remove one or more volumes}


创建容器(指定 -v 参数)

可以修改 Dockerfile.my-cron

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM alpine:latest
RUN apk update
RUN apk --no-cache add curl
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
SUPERCRONIC=supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
COPY my-cron /app/my-cron
WORKDIR /app

# RUN cron job
CMD ["/usr/local/bin/supercronic", "/app/my-cron"]
1
docker buildx build -f Dockerfile.my-cron -t my-cron .

并在容器运行指定 -v 参数

1
docker container run -d -v cron-data:/app my-cron

效果同上。

(删除之前的 volume\text{volume})并实验:

现在重新创建新的容器,使用之前的 volume\text{volume}

数据会被保留下来!

Demo:MySQL

拉取镜像

1
docker pull mysql:5.7

创建容器

1
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=solisamicus -d -v mysql-data:/var/lib/mysql mysql:5.7

MySQL(root)数据库

写入数据

查看Volume

Bind Mount

Bind Mount\text {Bind Mount}Docker\text {Docker} 中用于将主机文件或目录挂载到容器中的一种方式。通过 Bind Mount\text {Bind Mount},可以在容器内部访问主机上的文件和目录,并且对这些文件的更改会反映在主机上,从而实现容器和主机之间的共享和数据持久化。Bind Mount\text {Bind Mount} 是一种在运行容器时创建的文件系统挂载。与 Volume\text {Volume} 不同,Bind Mount\text {Bind Mount} 直接将主机上的文件或目录挂载到容器的指定路径上,而不是由 Docker\text {Docker} 管理的数据存储。

将上面的命令修改为:

1
docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=solisamicus -d -v $(pwd):/var/lib/mysql mysql:5.7

即可。