如何在Docker文件中使用“ADD”命令包含Docker构建上下文之外的文件?
从Docker文档中:
路径必须位于生成的上下文中;您不能添加../something/something,因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护进程。
我不想重组我的整个项目,只是为了在这件事上适应Docker。我想将所有Docker文件保存在同一个子目录中。
此外,Docker似乎还不支持符号链接:Dockerfile ADD命令不支持主机#1676上的符号链接。
我唯一能想到的另一件事是包含一个预构建步骤,将文件复制到Docker构建上下文中(并配置我的版本控制以忽略这些文件)。还有比这更好的解决方法吗?
使用docker compose,我通过创建一个服务来装载所需的卷并提交容器的映像来完成这一点。然后,在后续服务中,我依赖于先前提交的映像,该映像将所有数据存储在装载位置。然后,您必须将这些文件复制到其最终目的地,因为在运行docker commit命令时不会提交主机装载的目录
你不必使用docker compose来实现这一点,但它会让生活变得简单一些
# docker-compose.yml
version: '3'
services:
stage:
image: alpine
volumes:
- /host/machine/path:/tmp/container/path
command: bash -c "cp -r /tmp/container/path /final/container/path"
setup:
image: stage
# setup.sh
# Start "stage" service
docker-compose up stage
# Commit changes to an image named "stage"
docker commit $(docker-compose ps -q stage) stage
# Start setup service off of stage image
docker-compose up setup
一种快速而肮脏的方法是将构建上下文设置为所需的多个级别,但这可能会产生后果。如果您使用的是这样的微服务架构:
./Code/Repo1
./Code/Repo2
...
您可以将构建上下文设置为父代码目录,然后访问所有内容,但事实证明,对于大量存储库,这可能会导致构建花费很长时间。
示例情况可能是另一个团队在Repo1中维护数据库模式,而您的团队在Repo2中的代码依赖于此。您希望在不担心模式更改或污染其他团队的存储库的情况下,将这种依赖关系与您自己的种子数据固定在一起(当然,根据更改的内容,您可能仍然需要更改种子数据脚本)第二种方法很粗糙,但避开了长构建的问题:
在中创建sh(或ps1)脚本/Code/Rep2复制所需文件并调用所需的docker命令,例如:
#!/bin/bash
rm -r ./db/schema
mkdir ./db/schema
cp -r ../Repo1/db/schema ./db/schema
docker-compose -f docker-compose.yml down
docker container prune -f
docker-compose -f docker-compose.yml up --build
在docker compose文件中,只需将上下文设置为Repo2根目录并使用的内容/dockerfile中的db/schema目录,而不必担心路径。请记住,您可能会意外地将此目录提交给源代码管理,但脚本清理操作应该足够简单。