доступ к томам, установленным в docker-compose.yml из dockerfile

#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