#docker #docker-compose #dockerfile
#docker #docker-compose #dockerfile
Вопрос:
У меня такая архитектура моего проекта:
.
├── app/
├── context/
│ ├── Dockerfile
│ ├── .dockerignore
│ └── php.ini
├── database/
├── http/
├── composer.json
└── docker-compose.yml
и у docker-compose.yml
меня есть следующая конфигурация:
version: '3.8'
services:
app:
container_name: "ERP"
restart: always
build:
context: ./context
dockerfile: Dockerfile
stdin_open: true
tty: true
ports:
- '8000:80'
links:
- db_server
volumes:
- .:/usr/src/app
working_dir: /usr/src/app
db_server:
container_name: "db_server"
image: 'mysql:8.0'
ports:
- '3306:3306'
Но когда я устанавливаю Dockerfile
содержимое для настройки приложения с docker-compose up
Dockerfile
таким содержимым:
FROM ubuntu:20.04
WORKDIR /usr/src/app
RUN cat composer.json
В нем говорится "No such file or directory composer.json"
. Почему?
Обновить
Мне удалось решить проблему на основе конфигурации точки ВХОДА..
насколько я понимаю — я новичок в docker — , точка ВХОДА определяет сценарий ввода, запущенный в начале контейнера, таким образом, запуск этого сценария будет определенно во время выполнения контейнера и после инициализации, указанной в файле docker-compost.yml . так что содержимое фактическогоконтекст будет доступен для скрипта, чтобы видеть его во время его выполнения..
Спасибо всем за ваши ответы.
Комментарии:
1. Попробуйте использовать
RUN ls -al
, чтобы увидеть, какие файлы находятся в рабочем каталоге?2. он возвращает файлы каталога контекста..
Ответ №1:
Это потому, что вы определяете контекст как «./context», поэтому вы застряли в этой папке, где composer.json нет.
Используйте «.» для контекста. и context/Dockerfile для dockerfile. Затем монтирование ‘.’ смонтирует весь каталог, а не только ./context.
Комментарии:
1. это имеет смысл .. , я переместил файлы внутри контекстного каталога в корневой каталог, установил контекст равным . , но теперь он застрял с «созданием приложения …» почему это?
2. Просто «создание приложения»? разве dockerfile вообще не интерпретировался?
3. Я боюсь, что это проблема с памятью
4. вы можете попробовать использовать подробный вариант: docker-compose —verbose up
Ответ №2:
Процесс сборки для создания образа происходит до процесса выполнения, который принимает этот образ и запускает контейнер. Файл компоновки включает раздел сборки, позволяющий легко создавать образ перед его запуском, но все остальные части файла компоновки определяют конфигурации среды выполнения, такие как подключение томов и подключение к сети.
Во время сборки вы не можете указывать источники томов, самое большее, вы можете определить требуемый целевой объем в образе с шагом ГРОМКОСТИ. (Обратите внимание, что если вы это сделаете, на последующих этапах выполнения в Dockerfile могут возникнуть проблемы с изменением этого каталога, поскольку многие инструменты сборки монтируют анонимный том, как вы просили, но фиксируют только изменения в файловой системе контейнера, а не в файловой системе тома).
Если вам нужно содержимое файла или каталога в вашем образе, вы должны выполнить КОПИРОВАНИЕ или ДОБАВИТЬ шаг в Dockerfile для копирования из контекста сборки (обычно импортируемого как .
текущий каталог) в образ.
Ответ №3:
Ключ build.context определяет путь к каталогу, содержащему Dockerfile
. Это контекст построения образа, и в процессе сборки docker не имеет доступа к composer.json
файлу (он находится вне контекста).
Command RUN запускает команду во время сборки. Если вы хотите запустить его при запуске контейнера, вам следует использовать CMD.
FROM ubuntu:20.04
WORKDIR /usr/src/app
CMD cat composer.json