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