docker-compose具有相对dockerfile的外部构建上下文

时间:2019-05-22 14:01:53

标签: docker docker-compose dockerfile

我要完成的工作是:我想在容器内缓存当前用户~/.aws目录,以便在构建另一个容器时可以使用它们。

我有以下docker-compose.yml:

version: "3.7"
services:
  worker:
    depends_on:
      - aws
  aws:
    build:
      context: ~/.aws
      dockerfile: ./ctx.dockerfile
      args:
        - workdir=/root/.aws

这些是ctx.dockerfile的内容:

FROM alpine:3.9

ARG workdir
WORKDIR ${workdir}

COPY . .

在我的worker服务Dockerfile中,我具有以下内容:

...
COPY --from=aws_ctx:local /root/.aws /root/.aws
...

问题

docker compose并未将dockerfile服务中的aws路径视为相对于docker-compose.yml的路径,而是假设它相对于context路径。无论如何,我可以让docker-compose从与docker-compose.yml相同的目录中加载ctx.dockerfile并按我的方式设置上下文吗?

我愿意改变问题的解决方法,但是有一些限制:

  1. 任何解决方案都必须能够在Windows,OSX和Linux上使用
  2. 任何解决方案都只需要docker和/或docker-compose,我无法事先运行shell脚本

1 个答案:

答案 0 :(得分:0)

  

无论如何,我是否可以让docker-compose从与docker-compose.yml相同的目录中加载ctx.dockerfile并按我的方式设置上下文?

AFAIK:不,没有。

在构建时与Dockerfile进行交互的所有内容都必须在定义的上下文中。因此,您需要.awsdocker-compose.yml等所在的当前文件夹位于同一上下文中,即该上下文必须是相关目录结构的最高级别,然后您将定义所需文件(Dockerfile和.aws)的相对路径。

也许您可以 /home/$USER设置为构建上下文(或更高级别,具体取决于Dockerfile等的生存位置),但是随后您还必须创建一个{{ 1}}文件,并忽略.dockerignore和当前文件夹之外的上下文中的一切。如您所见,这将是一团糟,而且不是很可重复。

我建议您使用一个卷而不是.aws来放置容器中的COPY文件夹。

示例:

~/.aws

nico@lapap12:~$ ls -l ~/.aws total 0 -rw-r--r-- 1 nico nico 0 May 22 17:45 foo.bar

docker-compose.yml
version: "3.7"

services:
  allinone:
    image: alpine:latest
    volumes:
      - ~/.aws:/tmp/aws:ro
    command: ls -l /tmp/aws

如果要更改容器中此文件夹的内容,但又不想在实际主机上触摸它,则可以从那里将nico@lapap12:~/local/so$ docker-compose up Creating so_allinone_1 ... done Attaching to so_allinone_1 allinone_1 | total 0 allinone_1 | -rw-r--r-- 1 1000 1000 0 May 22 15:45 foo.bar so_allinone_1 exited with code 0 的内容复制到/tmp/aws。 / p>