docker-compose внешний контекст сборки с относительным dockerfile - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь сделать следующее: я хочу кэшировать каталог текущих пользователей ~/.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 загружал ctx.dockerfile из того же каталога, что и docker-compose.yml, и устанавливал контекст таким, какой я есть?

Я готов изменить свой подход к проблеме, но у меня есть несколько ограничений:

  1. любое решение должно быть работоспособным в Windows, OSX и Linux
  2. любое решение должно требовать только docker и / или docker-compose, я могуне запускаю сценарий оболочки заранее

1 Ответ

0 голосов
/ 22 мая 2019

Могу ли я в любом случае заставить docker-compose загрузить файл ctx.docker из того же каталога, что и docker-compose.yml, и установить контекст таким, какой я есть?

AFAIK: Нет, нет.

Все, с чем Dockerfile взаимодействует во время сборки, должно быть в определенном контексте. Итак, вам нужно, чтобы .aws и текущая папка, в которой живет docker-compose.yml и т. Д., Находились в одном и том же контексте, то есть контекст должен быть наивысшим уровнем вашей соответствующей структуры каталогов, а затем вам нужно будет определить относительные пути к нужным файлам (Dockerfiles и .aws).

Возможно, вы могли бы установить /home/$USER в качестве контекста сборки (или даже более высокий уровень, в зависимости от того, где находятся ваши файлы Docker и т. Д.), Но тогда вам также потребуется создать файл .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 в /root/.aws, если вы хотите изменить содержимое этой папки в контейнере, но не хотите прикасаться к нему на реальном хосте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...