docker-在初始启动时撰写命名卷拷贝内容

时间:2017-08-16 21:00:20

标签: docker docker-compose docker-volume

我可能对卷的工作方式感到有些困惑,而且我一遍又一遍地阅读相同的内容,而且我应该正常工作。如果第一次初始化卷,我希望容器内的文件夹中的内容复制。

我有这样的事情:

我有一个像这样的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撰写文件

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,如果这有所不同。

1 个答案:

答案 0 :(得分: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

为此,目录不应该是第一次存在。