Docker 不复制 .gitignore 中的文件

Ste*_*oro 5 git continuous-integration gitlab docker google-cloud-platform

在我的项目中,我必须docker-in-docker使用 CLoudBuild 从 GitLab 上传 Google CloudRun。我遇到了一个奇怪的错误。我有一个本地版本.env ,我不想将其排除在 git 修订之外。所以我把它放入.gitignore文件中。

但在 CloudBuild 上传过程中,我创建了一个.env使用 GitLab 的 CI/CD 中设置的变量命名的文件。我用这个.gitlab-ci.yml

image: docker:latest

stages:
    - deploy

deploy:
    stage: deploy
    image: google/cloud-sdk
    services:
        - docker:dind
    script:
        - echo CLOUDSQL_PASSWORD=$CLOUDSQL_PASSWORD >> app/.env
        - echo CLOUDSQL_USERNAME=$CLOUDSQL_USERNAME >> app/.env
        - echo CLOUDSQL_HOST=$CLOUDSQL_HOST >> app/.env
        - echo MONGODB_PASSWORD=$MONGODB_PASSWORD >> app/.env
        - echo MONGODB_USERNAME=$MONGODB_USERNAME >> app/.env
        ...
Run Code Online (Sandbox Code Playgroud)

问题是该文件没有被 docker 复制到新容器,并且我无法在 Node.js 应用程序中访问它。看起来 docker 还合并了文件行.gitignore并排除了.envGitLab CI 刚刚创建的文件。

.dockerignore我尝试以白名单方法设置该文件。

*
#white list
!app/.env
!app/index.js
!app/package.json
!app/service-account.json
!app/yarn.lock
Run Code Online (Sandbox Code Playgroud)

这就是Dockerfile正在使用的。

FROM node:14.12-alpine3.12

ENV NODE_ENV production
ENV GOOGLE_APPLICATION_CREDENTIALS service-account.json

EXPOSE 8080

WORKDIR /app

COPY app/ ./

RUN yarn

CMD ["yarn", "start"]
Run Code Online (Sandbox Code Playgroud)

Jan*_*sen 2

官方文档没有说,但从个人经验来看,如果你没有.gcloudignore文件,那么它默认遵循你的规则.gitignore

可以选择全局禁用此默认行为:

gcloud config set gcloudignore/enabled false
Run Code Online (Sandbox Code Playgroud)

但这听起来不是一个好的选择。最好是显式添加 .gcloudignore 文件:

.gcloudignore
.git
.gitignore

!app/.env
Run Code Online (Sandbox Code Playgroud)

最后一行不会对您的情况产生影响,只是将其包含在内以显示如何显式包含丢失的文件。