仅复制 Dockerfile 中的 Git 跟踪文件

jan*_*szm 8 git docker

我想知道如何在 Dockerfile 中实现以下内容(不使用 .dockerignore):

COPY `git ls-tree -r HEAD --name-only` ./
Run Code Online (Sandbox Code Playgroud)

也就是说,仅复制在 Git 存储库中跟踪的文件。当然,上面的方法是行不通的,因为 Docker 不会以这种方式执行 shell 命令,但也许类似的事情是可能的?

这是一个相当普遍的问题。例如,在 AWS Elastic Beanstalk 平台中,它使用git archive -v -o myapp.zip --format=zip HEAD( https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/applications-sourcebundle.html )解决。类似地,Heroku 基于 Git 推送构建它的“slugs”(同样,仅在 Git 文件中跟踪)。

总结一下,我想将应用程序打包为 Docker 映像,我不想包含所有未跟踪和 Git 忽略的文件。我想避免将.gitignore文件复制到.dockerignore文件中。

moe*_*ius 5

您可以git archive按照您的建议使用存档应用程序:

git archive -v -o myapp.tar.gz --format=tar.gz HEAD
Run Code Online (Sandbox Code Playgroud)

然后只需从存档文件构建您的 docker 镜像:

docker import myapp.tar.gz myapp:latest
Run Code Online (Sandbox Code Playgroud)