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

要使此目录正常工作,目录不应是第一次存在。