如何在Docker文件中使用“ADD”命令包含Docker构建上下文之外的文件?
从Docker文档中:
路径必须位于生成的上下文中;您不能添加../something/something,因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护进程。
我不想重组我的整个项目,只是为了在这件事上适应Docker。我想将所有Docker文件保存在同一个子目录中。
此外,Docker似乎还不支持符号链接:Dockerfile ADD命令不支持主机#1676上的符号链接。
我唯一能想到的另一件事是包含一个预构建步骤,将文件复制到Docker构建上下文中(并配置我的版本控制以忽略这些文件)。还有比这更好的解决方法吗?
如何在两个Dockerfile之间共享typescript代码
我也遇到过同样的问题,只是在两个typescript项目之间共享文件。其他一些答案对我不起作用,因为我需要保留共享代码之间的相对导入路径。我通过这样组织代码来解决这个问题:
api/
Dockerfile
src/
models/
index.ts
frontend/
Dockerfile
src/
models/
index.ts
shared/
model1.ts
model2.ts
index.ts
.dockerignore
注意:在将共享代码提取到顶部文件夹后,我避免了更新导入路径,因为我更新了api/models/index.ts和frontend/models//index.ts以从共享导出:(例如export*from'../../shared)
由于构建上下文现在高了一个目录,我不得不做一些额外的更改:
更新build命令以使用新上下文:docker build-f Dockerfile。。(两个点而不是一个)在顶层使用一个.dockerignore来排除所有node_module。(例如**/node_modules/**)在Dockerfile COPY命令前面加上api/或frontend/复制共享(除了api/src或frontend/src)工作目录/usr/src/appCOPY api/package*.json./<----前缀为api/运行npm ciCOPY api/src api/ts*.json./<----前缀为api/复制共享usr/src/shared<----添加RUN npm运行构建
这是我可以将所有内容发送到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
我个人对一些答案感到困惑,所以决定简单地解释一下。
当想要创建图像。
我总是选择项目的根作为Dockerfile中的上下文。
例如,如果您使用COPY命令,如COPY。
第一个点(.)是上下文,第二个点(。)是容器工作目录
假设上下文是项目根、点(.),代码结构如下
sample-project/
docker/
Dockerfile
如果要构建映像
您的路径(运行docker build命令的路径)是/full-path/sample-project/,你应该这样做
docker build -f docker/Dockerfile .
如果您的路径是/full-path/sampleproject/docker/,你应该这样做
docker build -f Dockerfile ../