为什么docker容器能够自己创建文件和文件夹

services:
emqx:
container_name: {CONTAINER_NAME} image: emqx/emqx:5.5.1 deploy: resources: limits: cpus: {CPUS}
memory: {MEMORY_LIMIT} ports: - {HOST_IP}:{PORT_HTTP}:18083 - {HOST_IP}:{EMQX_PORT_1883}:1883 - {HOST_IP}:{EMQX_PORT_8083}:8083 - {HOST_IP}:{EMQX_PORT_8084}:8084 - {HOST_IP}:${EMQX_PORT_8883}:8883
restart: always
user: “0”
volumes:
- ./data:/opt/emqx/data
- ./log:/opt/emqx/log
version: “3”
我使用docker-compose启动一个容器,然后服务器会自己帮我创建文件,这个原理怎么实现的?

2 个赞

常规话题快问快答

20 个赞

一个程序可以创建文件,是很难理解的事情吗?困惑是在哪?

3 个赞

啊?这不是很正常吗

1 个赞

怎么实现的?

1 个赞

你是想知道宿主机上为什么会创建出文件夹?你可以先了解一下docker启动的流程,和他各个流程做了什么事情。
创建文件夹应该是启动前,Docker Daemon会检查你的宿主机上要挂在的目录是否存在,若不存在就创建这个目录,就调用linux标准的mkdir就可以实现。
参考: 走进docker(07):docker start命令背后发生了什么?-CSDN博客

1 个赞

这个就是用来在容器外放东西的

1 个赞

建议看 文档.

1 个赞

文件的读写是程序基操,说实话我没有理解你困惑的点在哪里,就好像你问程序为什么可以在终端输出信息一样,就调用基本方法呀

如果你们非要这么说,实现方式千奇百怪,我的备选方案是1.直接将这些配置文件,做成tar包,然后在sheel脚本,里面进行解压好了,再进行挂载,2。方案二,利用sheel脚本里面先启动一个空容器,然后再docker cp拷贝我想要的文件,杀掉空容器,然后正常挂载,我的场景就是java服务一处编译到处运行,可能需要类型挂载nacos配置文件,现在我不想要手动创建文件,能够启动能够创建好,只是我感觉实现的方案不满意,在找最优解!

容器挂在卷,我现在文件夹是会被创建,但是里面的文件并没有带出来,


现在我有点没懂他这个加载顺序,现在的效果将宿主机空的同步到容器内部了 :smiling_face_with_tear:

好的我再看下这里有没有新发现

容器创建:文件系统方面是是先加载镜像创建rootfs,然后再挂载volumes,就会造成volume覆盖挂载到容器里的文件系统上。
加载镜像创建rootfs>挂载volume>运行CMD。

CMD后造成的数据才会影响volume

compose 我理解的就是命令集合
具体要干什么 他写进去
docker替你干

具体权限问题 docker 一般有root权限 再不济也是user
mkdir咋建不了文件

2 个赞

不是这个意思,我是想让容器里面的东西能够在外面也生成一份

使用官方的 OpenJDK 作为基础镜像

FROM gozap/oraclejdk8
LABEL maintainer=netintech

将本地的JAR文件添加到容器中

COPY ./java/jar/*.jar /app/a.jar

将application-dev.yml文件添加到容器中

COPY ./java/application-dev.yml /app/application-dev.yml

指定工作目录

WORKDIR /app

启动应用

CMD [“sh”, “-c”, “java -jar a.jar -Dspring.config.location=application-dev.yml”]

java-app:
build:
context: .
dockerfile: ./java/Dockerfile
args:
- NO_CACHE=${NO_CACHE} # 用于强制重新构建
container_name: java-app
ports:
- “8089:8089”
volumes:
- ./java/application-dev.yml:/app/application-dev.yml
depends_on:
- mysql
- redis
外部我这个volumes,如果没有这个配置文件,我想让他自动生成

在CMD启动中去做这个生成文件初始化的事

最终我想实现全自动化过程