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启动一个容器,然后服务器会自己帮我创建文件,这个原理怎么实现的?
一个程序可以创建文件,是很难理解的事情吗?困惑是在哪?
啊?这不是很正常吗
怎么实现的?
你是想知道宿主机上为什么会创建出文件夹?你可以先了解一下docker启动的流程,和他各个流程做了什么事情。
创建文件夹应该是启动前,Docker Daemon会检查你的宿主机上要挂在的目录是否存在,若不存在就创建这个目录,就调用linux标准的mkdir就可以实现。
参考: 走进docker(07):docker start命令背后发生了什么?-CSDN博客
这个就是用来在容器外放东西的
建议看 文档.
文件的读写是程序基操,说实话我没有理解你困惑的点在哪里,就好像你问程序为什么可以在终端输出信息一样,就调用基本方法呀
如果你们非要这么说,实现方式千奇百怪,我的备选方案是1.直接将这些配置文件,做成tar包,然后在sheel脚本,里面进行解压好了,再进行挂载,2。方案二,利用sheel脚本里面先启动一个空容器,然后再docker cp拷贝我想要的文件,杀掉空容器,然后正常挂载,我的场景就是java服务一处编译到处运行,可能需要类型挂载nacos配置文件,现在我不想要手动创建文件,能够启动能够创建好,只是我感觉实现的方案不满意,在找最优解!
好的我再看下这里有没有新发现
容器创建:文件系统方面是是先加载镜像创建rootfs,然后再挂载volumes,就会造成volume覆盖挂载到容器里的文件系统上。
加载镜像创建rootfs>挂载volume>运行CMD。
CMD后造成的数据才会影响volume
compose 我理解的就是命令集合
具体要干什么 他写进去
docker替你干
具体权限问题 docker 一般有root权限 再不济也是user
mkdir咋建不了文件
不是这个意思,我是想让容器里面的东西能够在外面也生成一份
使用官方的 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启动中去做这个生成文件初始化的事
最终我想实现全自动化过程


