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 загрузить ctx.dockerfile из того же каталога, что и docker-compose.yml, И установить контекст так, как я?

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

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

Решает ли ответ вашу проблему или вам нужна дополнительная помощь?

bellackn 10.09.2019 13:52
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
4
1
2 519
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is there anyway I can have docker-compose load the ctx.dockerfile from same directory as docker-compose.yml AND set the context the way that I am?

АФАИК: Нет, нет.

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

Возможно, вы установили мог в качестве контекста сборки (или даже более высокого уровня, в зависимости от того, где находятся ваши Dockerfiles и т. д.), но тогда вам также придется создать файл /home/$USER и игнорировать все в контексте, кроме .dockerignore и текущей папки.. Как видите, это будет беспорядок и не очень воспроизводимо.

Я бы предложил использовать том вместо .aws папки COPY внутри вашего контейнера.

Пример:

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

~/.aws:

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

Вы можете пойти оттуда и скопировать содержимое docker-compose.yml в /tmp/aws, если вы хотите изменить содержимое этой папки в контейнере, но не хотите трогать его на реальном хосте.

Другие вопросы по теме