docker-在初始启动时编写命名卷副本内容
docker-compose named volume copy contents on initial start
我可能对卷的工作原理有点困惑,我一遍又一遍地阅读同样的东西,对我来说它应该是有效的。如果第一次初始化卷,我希望从容器内的文件夹中复制内容。
我有这样的东西:
我有一个这样的 Dockerfile:
https://github.com/docker-library/tomcat/blob/f6dc3671bf56465917b52c8df4356fa8f0ebafcd/7/jre7/Dockerfile
之前
EXPOSE 8080
CMD ["catalina.sh", "run"]
我有类似的东西
Tomcat Dockerfile
VOLUME ["/opt/tomcat/conf"]
EXPOSE 8080
CMD ["catalina.sh", "run"]
当我构建此图像时,我将其标记为 tomcat。
然后我有另一个 Dockerfile,其中包含我设置的一堆环境变量和一个脚本。
像这样:
MyApp Dockerfile
FROM tomcat
ENV SOME_VAR=Test1
COPY assets/script.sh /script.sh
第二张图片基于第一张图片构建,只是添加了一个脚本并设置了一些设置。到目前为止一切顺利。
我想在我的 docker-compose.yml 文件中做这样的事情:
Docker Compose file
website:
image: myapp
ports:
- "8000:8080"
volumes:
- /srv/myapp/conf:/opt/tomcat/conf
我希望 /opt/tomcat/conf 的内容在首次创建该文件夹时复制到 /srv/myapp/conf 中。我读到的所有内容都表明这应该有效,但它只是创建文件夹而不复制内容。我在这里遗漏了什么吗?
基本上我有这个问题:
https://github.com/moby/moby/issues/18670
哦,我的 docker-compose yaml 文件使用的是 2.1 版,如果有区别的话。
当您在容器内绑定主机卷时,您正在寻找的是不可能的。它只有在您有命名卷时才有效。然后docker将文件夹的内容复制到一个容器中。您需要将撰写文件更改为
version: '3'
services:
website:
image: myapp
ports:
- "8000:8080"
volumes:
- appconfig:/opt/tomcat/conf
volumes:
appconfig: {}
如果您想获取配置,那么您可以使用 shell 脚本和您的原始撰写文件
#!/bin/bash
if [ ! -d "/srv/myapp/conf" ]; then
mkdir /srv/myapp/conf
docker create --name myappconfig myapp
docker cp myapp:/opt/tomcat/conf /srv/myapp/
docker rm myapp
fi
docker-compose up -d
要使此目录正常工作,目录不应是第一次存在。
我可能对卷的工作原理有点困惑,我一遍又一遍地阅读同样的东西,对我来说它应该是有效的。如果第一次初始化卷,我希望从容器内的文件夹中复制内容。
我有这样的东西:
我有一个这样的 Dockerfile: https://github.com/docker-library/tomcat/blob/f6dc3671bf56465917b52c8df4356fa8f0ebafcd/7/jre7/Dockerfile
之前
EXPOSE 8080
CMD ["catalina.sh", "run"]
我有类似的东西
Tomcat Dockerfile
VOLUME ["/opt/tomcat/conf"]
EXPOSE 8080
CMD ["catalina.sh", "run"]
当我构建此图像时,我将其标记为 tomcat。
然后我有另一个 Dockerfile,其中包含我设置的一堆环境变量和一个脚本。
像这样:
MyApp Dockerfile
FROM tomcat
ENV SOME_VAR=Test1
COPY assets/script.sh /script.sh
第二张图片基于第一张图片构建,只是添加了一个脚本并设置了一些设置。到目前为止一切顺利。
我想在我的 docker-compose.yml 文件中做这样的事情:
Docker Compose file
website:
image: myapp
ports:
- "8000:8080"
volumes:
- /srv/myapp/conf:/opt/tomcat/conf
我希望 /opt/tomcat/conf 的内容在首次创建该文件夹时复制到 /srv/myapp/conf 中。我读到的所有内容都表明这应该有效,但它只是创建文件夹而不复制内容。我在这里遗漏了什么吗?
基本上我有这个问题: https://github.com/moby/moby/issues/18670
哦,我的 docker-compose yaml 文件使用的是 2.1 版,如果有区别的话。
当您在容器内绑定主机卷时,您正在寻找的是不可能的。它只有在您有命名卷时才有效。然后docker将文件夹的内容复制到一个容器中。您需要将撰写文件更改为
version: '3'
services:
website:
image: myapp
ports:
- "8000:8080"
volumes:
- appconfig:/opt/tomcat/conf
volumes:
appconfig: {}
如果您想获取配置,那么您可以使用 shell 脚本和您的原始撰写文件
#!/bin/bash
if [ ! -d "/srv/myapp/conf" ]; then
mkdir /srv/myapp/conf
docker create --name myappconfig myapp
docker cp myapp:/opt/tomcat/conf /srv/myapp/
docker rm myapp
fi
docker-compose up -d
要使此目录正常工作,目录不应是第一次存在。