Docker ADD不复制子文件夹的内容

时间:2019-09-10 17:33:54

标签: docker dockerfile

在构建开发环境(Linux Mint 18.3)时,我必须创建一个具有以下说明的docker文件:

FROM centos:7

ENV CATALINA_HOME /opt/tomcat
ADD apache-tomcat-8.5.5 ${CATALINA_HOME}

其中apache-tomcat-8.5.5是一个文件夹,其中包含部署tomcat-8.5.5的所有文件,这些文件可以从以下位置获取:

https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.5/bin/apache-tomcat-8.5.5.tar.gz

ADD复制除〜/ apache-tomcat-8.5.5 / webapps /中内容以外的所有文件。有人有类似的问题吗?我什至将任何人的权限都更改为RW,但问题仍然存在。

我正在使用

运行该docker
docker run -v /opt/webapi/tomcat/webapps:/opt/tomcat/webapps -v /opt/webapi/tomcat/logs:/opt/tomcat/logs  .....

此共享可以删除webapps中的内容吗?如果是这种情况,我们如何避免这种情况?我没有任何dockerignore文件

1 个答案:

答案 0 :(得分:2)

  

我正在使用

运行该docker
docker run -v /opt/webapi/tomcat/webapps:/opt/tomcat/webapps -v /opt/webapi/tomcat/logs:/opt/tomcat/logs  .....

您将主机装载到webapps覆盖了/opt/webapi/tomcat/webapps目录。在该容器内,只能看到主机上该目录中的文件。这些文件很可能已复制到映像中,但是通过该卷装入,将无法看到映像中的文件。

如果您不想用此主机目录替换容器内的目录,则不要创建卷安装。如果要使用映像中的内容覆盖主机目录,则可以在入口点执行此操作,或切换到命名卷。命名卷为空时将对其进行初始化,并且可以通过将选项传递给卷驱动器来指向主机上的任何文件夹。以下是命名绑定安装的几个示例:

  # create the volume in advance
  $ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

  # create on the fly with --mount
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

  # inside a docker-compose file
  ...
  volumes:
    bind-test:
      driver: local
      driver_opts:
        type: none
        o: bind
        device: /home/user/test
  ...

要在入口点内复制文件,请参阅我的docker-base存储库中的save-volumeload-volume脚本。这样,您便可以灵活地始终用映像中保存的值覆盖主机上的内容。但是,如果要这样做,请考虑是否确实需要卷,以及如何计划通过覆盖用户更改来避免数据丢失。