如何在docker中复制子文件夹

如何在docker中复制子文件夹,docker,dockerfile,Docker,Dockerfile,我有以下文件夹结构: nova-components component1 dist ... component2 dist ... component3 dist ... ... 有没有办法只复制docker中的dist文件夹。 我在想这样的事情: COPY --from=assets /nova-components/*/dist /var/www/nova-co

我有以下文件夹结构:

nova-components
    component1
        dist
        ...
    component2
        dist
        ...
    component3
        dist
        ...
    ...
有没有办法只复制docker中的dist文件夹。 我在想这样的事情:

COPY --from=assets /nova-components/*/dist /var/www/nova-components/*/dist

最终目标是在最终映像中包含生成的dist文件夹,并保留目录树结构。

使用
Dockerfile添加
.dockergnore
文件

nova-components/*/*
!nova-components/*/dist
像复制一样

COPY nova-components/ /var/www/nova-components
编辑

因此,对于多阶段构建,这目前不起作用。一个新的解决方案是在最后阶段运行

rsync -avz --include='dist/' nova-components/ nova-components-dist/.
然后在最后阶段,

COPY --from=assets /nova-components-dist/ /var/www/nova-components

目前,
多阶段docker build
不尊重
.dockerignore
,看到这一点,所以你必须自己做,一种方法是在第一阶段清理东西,如下所示:

Dockerfile:

FROM ubuntu:16.04 AS assets

RUN mkdir -p /nova-components/component1/dist && \
  mkdir -p /nova-components/component1/others && \
  mkdir -p /nova-components/component2/dist && \
  mkdir -p /nova-components/component2/others

RUN find /nova-components/*/* ! -name "dist" -maxdepth 0 | xargs rm -fr

FROM ubuntu:16.04

COPY --from=assets /nova-components /var/www/nova-components/

RUN ls -alh /var/www/nova-components
RUN ls -alh /var/www/nova-components/*
# docker build --no-cache -t try:1 .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM ubuntu:16.04 AS assets
 ---> b9e15a5d1e1a
Step 2/7 : RUN mkdir -p /nova-components/component1/dist &&   mkdir -p /nova-components/component1/others &&   mkdir -p /nova-components/component2/dist &&   mkdir -p /nova-components/component2/others
 ---> Running in d4c9c422d53a
Removing intermediate container d4c9c422d53a
 ---> d316032dd59d
Step 3/7 : RUN find /nova-components/*/* ! -name "dist" -maxdepth 0 | xargs rm -fr
 ---> Running in b6168b027f4c
Removing intermediate container b6168b027f4c
 ---> 9deb57cb5153
Step 4/7 : FROM ubuntu:16.04
 ---> b9e15a5d1e1a
Step 5/7 : COPY --from=assets /nova-components /var/www/nova-components/
 ---> 49301f701db2
Step 6/7 : RUN ls -alh /var/www/nova-components
 ---> Running in 9ed0cafff2fb
total 16K
drwxr-xr-x 4 root root 4.0K Nov  6 02:13 .
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 ..
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 component1
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 component2
Removing intermediate container 9ed0cafff2fb
 ---> f1ee82cff972
Step 7/7 : RUN ls -alh /var/www/nova-components/*
 ---> Running in 23a27e5ce853
/var/www/nova-components/component1:
total 12K
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 .
drwxr-xr-x 4 root root 4.0K Nov  6 02:13 ..
drwxr-xr-x 2 root root 4.0K Nov  6 02:13 dist

/var/www/nova-components/component2:
total 12K
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 .
drwxr-xr-x 4 root root 4.0K Nov  6 02:13 ..
drwxr-xr-x 2 root root 4.0K Nov  6 02:13 dist
Removing intermediate container 23a27e5ce853
 ---> b9d5ab8f5157
Successfully built b9d5ab8f5157
Successfully tagged try:1
测试:

FROM ubuntu:16.04 AS assets

RUN mkdir -p /nova-components/component1/dist && \
  mkdir -p /nova-components/component1/others && \
  mkdir -p /nova-components/component2/dist && \
  mkdir -p /nova-components/component2/others

RUN find /nova-components/*/* ! -name "dist" -maxdepth 0 | xargs rm -fr

FROM ubuntu:16.04

COPY --from=assets /nova-components /var/www/nova-components/

RUN ls -alh /var/www/nova-components
RUN ls -alh /var/www/nova-components/*
# docker build --no-cache -t try:1 .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM ubuntu:16.04 AS assets
 ---> b9e15a5d1e1a
Step 2/7 : RUN mkdir -p /nova-components/component1/dist &&   mkdir -p /nova-components/component1/others &&   mkdir -p /nova-components/component2/dist &&   mkdir -p /nova-components/component2/others
 ---> Running in d4c9c422d53a
Removing intermediate container d4c9c422d53a
 ---> d316032dd59d
Step 3/7 : RUN find /nova-components/*/* ! -name "dist" -maxdepth 0 | xargs rm -fr
 ---> Running in b6168b027f4c
Removing intermediate container b6168b027f4c
 ---> 9deb57cb5153
Step 4/7 : FROM ubuntu:16.04
 ---> b9e15a5d1e1a
Step 5/7 : COPY --from=assets /nova-components /var/www/nova-components/
 ---> 49301f701db2
Step 6/7 : RUN ls -alh /var/www/nova-components
 ---> Running in 9ed0cafff2fb
total 16K
drwxr-xr-x 4 root root 4.0K Nov  6 02:13 .
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 ..
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 component1
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 component2
Removing intermediate container 9ed0cafff2fb
 ---> f1ee82cff972
Step 7/7 : RUN ls -alh /var/www/nova-components/*
 ---> Running in 23a27e5ce853
/var/www/nova-components/component1:
total 12K
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 .
drwxr-xr-x 4 root root 4.0K Nov  6 02:13 ..
drwxr-xr-x 2 root root 4.0K Nov  6 02:13 dist

/var/www/nova-components/component2:
total 12K
drwxr-xr-x 3 root root 4.0K Nov  6 02:13 .
drwxr-xr-x 4 root root 4.0K Nov  6 02:13 ..
drwxr-xr-x 2 root root 4.0K Nov  6 02:13 dist
Removing intermediate container 23a27e5ce853
 ---> b9d5ab8f5157
Successfully built b9d5ab8f5157
Successfully tagged try:1

在第一阶段使用
运行find/nova components/*/*进行清理-命名为“dist”-maxdepth 0 | xargs rm-fr
,然后您就可以了,让我们等待可能的官方功能支持。

它看起来更像是一个黑客而不是合适的解决方案,但在docker中,我感觉一切都像是黑客。至少它可以工作,而且比20行
COPY--from=assets
要好。另外,您的命令还删除了dist文件夹的内容,所以我必须调整它以获得一个好的解决方案<代码>运行find/nova components/*/*-名称“dist”-最大深度0|xargs rm-fr