复制docker,但排除

在Dockerfile中,我有

COPY . .

我想排除整个目录,在我的例子中是node_modules目录。

就像这样:

   COPY [all but **/node_modules/**] .

Docker能做到这一点吗?

300029 次浏览

在docker构建上下文目录中创建文件.dockerignore(在这种情况下,最有可能是node_modules的父目录),其中包含一行:

**/node_modules

尽管你可能只是想:

node_modules

关于dockerignore的信息:https://docs.docker.com/engine/reference/builder/#dockerignore-file

添加.dockerignore对我有用。 那些正在尝试Windows上的解决方案Windows不允许你创建。dockerignore文件(因为默认情况下不允许创建以。开头的文件)的人

从…开始创建这样的文件。在Windows上还包括一个结尾点,比如:.dockerignore.并按enter(前提是你已经从文件夹选项中启用了视图扩展选项)

对于那些不能使用.dockerignore文件的人(例如,如果你需要一个COPY文件而不是另一个COPY文件):

是的,但是你需要多个COPY指令。具体来说,您需要为您希望排除的文件名中的每个字母提供一个COPY。

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

继续下去,直到您有完整的文件名,或者只有一个您确信不会有任何其他文件的前缀。

从当前目录中排除node_modules

node_modules

在任何直接子目录中不包含node_modules

*/node_modules

这里是官方文档

对于一个线性解决方案,在项目根目录的命令提示符终端中键入以下内容。

echo node_modules >> .dockerignore

该命令添加了"node_modules"在dockerignore文件中。如果.dockerignore还不存在,它将创建一个新的。将node_modules替换为要排除的文件夹。

< >强警告: 如果您是Docker生态系统的新手和/或您的项目中已经有.dockerignore文件,请在继续之前进行备份

奖金:(由Joey Baruch指出)

(To CREATE/OVERWRITE the .dockerignore file via PowerShell, which can be handled by Docker):
>> echo node_modules | Out-File -Encoding UTF8 .dockerignore

对于那些使用gcloud构建的人:

gcloud build忽略.dockerignore,而是寻找.gcloudignore

使用:

cp .dockerignore .gcloudignore

Source .

我使用了多阶段构建方法,因为我需要一个阶段来访问文件,但不需要另一个阶段,所以.dockerignore将不起作用:

FROM ruby AS builder


COPY app/ app/


# Do stuff with app


# remove the stuff you don't want
RUN rm -Rf app/assets


FROM ruby AS publish


# In my real version I needed the absolute path to builder WORKDIR.
# Since I'm copying from the builder stage, app/assets won't exist
# and neither will it be part of the publish image.
COPY --from=builder app app