Почему на другой машине мое приложение docker-compose выдает ошибку об отсутствующих файлах, если я включил каждый файл в свой образ docker?

#docker #docker-compose #dockerfile #docker-registry #dockerhub

Вопрос:

Я хотел спросить о некоторых ошибках в моем приложении для создания докеров, которые я не могу понять. Я не уверен, совершаю ли я какую-то ошибку в коде или я неправильно понимаю всю концепцию docker compose.

Вот вещи, которые я делаю:

  1. Я построил докер-сочинение на ноутбуке А — все работает
  2. В docker-compose.yml я изменил имя, если мое изображение на mynick/myimage:тест
  3. Я отправил свое «пользовательское» изображение в docker hub с помощью docker-compose push
  4. Я скопировал свой файл docker-compose.yml и файл .env в ноутбук B
  5. Я сделал докер-сочинение —env-файл env вверх
  6. Каждое изображение было успешно загружено из docker hub, и мое приложение запустилось
  7. После загрузки моего приложения я вижу ошибки об отсутствующих файлах и каталогах из моей основной папки приложения (в которой также были docker-compose и файл docker внутри, поэтому он уже должен включать все?)

И ошибки, которые я вижу на шаге 7, например, «отсутствует файл alembic.ini». И когда я вручную копирую его в ноутбук B (папка, в которой находится docker-compose.yml), я вижу ошибку «НЕ УДАЛОСЬ: путь не существует: ‘/my_app/перегонный куб».

Я нахожу это странным, потому что в моем пользовательском изображении была команда «КОПИРОВАТЬ . /my_app», поэтому, насколько я понимаю, он должен копировать все файлы внутри изображения, поэтому у него должны быть все файлы и точно такая же структура папок?

И эта структура папок выглядит примерно так: моя структура папок выглядит так:

 ->my_app
----alembic.ini
---->alembic
-------->versions
------------.keep
--------various_stuff
----main.py
----Dockerfile
----docker-compose.yml
----various_stuff
 

Мой Док-файл:

 FROM python:3-slim-buster
ENV PYTHONUNBUFFERED=1
WORKDIR /myapp
COPY requirements.txt requirements.txt
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
COPY . /myapp
CMD 0.0.0.0:$PORT
 

My docker-compose.yml:

 version: "3.8"

services:
  database:
    container_name: postgresql_db
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD}
    ports:
      - "5050:80"
    depends_on:
      - database

  myapp:
    container_name: myapp
    build: .
    image: myapp:main
    command: bash -c "alembic upgrade head amp;amp; uvicorn main:app --host 0.0.0.0 --port 8000"
    volumes:
      - .:/myapp
    ports:
      - "8000:8000"
    depends_on:
      - database
    restart: always

  migration:
    image: myapp:main
    command: bash -c "alembic revision --autogenerate -m 'New Migration'"
    volumes:
      - .:/myapp
    depends_on:
      - myapp

  upgrade_head:
    image: myapp:main
    command: bash -c "alembic upgrade head"
    volumes:
      - .:/myapp
    depends_on:
      - migration
 

И мой docker-compose.yml после того, как я изменю его для запуска на других компьютерах:

 version: "3.8"

services:
  database:
    container_name: postgresql_db
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=${DB_NAME}

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD}
    ports:
      - "5050:80"
    depends_on:
      - database

  myapp:
    container_name: myapp
    build: .
    image: dockerhubnick/myappimage:latest
    command: bash -c "alembic upgrade head amp;amp; uvicorn main:app --host 0.0.0.0 --port 8000"
    volumes:
      - .:/myapp
    ports:
      - "8000:8000"
    depends_on:
      - database
    restart: always

  migration:
    image: dockerhubnick/myappimage:latest
    command: bash -c "alembic revision --autogenerate -m 'New Migration'"
    volumes:
      - .:/myapp
    depends_on:
      - myapp

  upgrade_head:
    image: dockerhubnick/myappimage:latest
    command: bash -c "alembic upgrade head"
    volumes:
      - .:/myapp
    depends_on:
      - migration
 

В настоящее время я не уверен, создаю ли я какую-то программу, связанную с кодом, или я неправильно понял, как работает docker-compose?

Ответ №1:

Проблема заключается в volume директиве во втором docker-compose.yml файле. Это перезапись файлов, которые вы скопировали в изображение, содержимым локального каталога. Вы не заметите разницы на первом ноутбуке, потому что локальный каталог содержит те же файлы, которые копируются в изображение. Но на втором ноутбуке вы получаете сообщение об ошибке, потому что файлы проекта отсутствуют.

Удалите volume директивы в docker-compose.yml файле для второго ноутбука, и ошибки должны исчезнуть. Без volume этого файлы , которые вы скопировали в изображение, будут использоваться как исключенные.

Комментарии:

1. Спасибо! Это была моя проблема. Я удалил часть тома, как вы сказали, и это начало работать как заклинание, спасибо! Я хотел быстро подтвердить еще одну вещь, единственная возможность поделиться своим приложением, использующим docker-compose,-это фактически поделиться файлом docker-compose.yml (и отправить пользовательское изображение в docker hub), я прав? Невозможно протолкнуть куда-нибудь весь «пакет», чтобы другим вообще не понадобились какие-либо файлы?

2. На этот вопрос трудно ответить без дополнительного контекста. Вообще говоря, до тех пор, пока вы хотите, чтобы пользователи выполняли вашу программу на своем компьютере, им всегда придется что- то скачивать. Если вам все равно, запускают ли пользователи это на своем компьютере, вы можете разместить это как веб-приложение, чтобы они могли получить доступ к нему через браузер. Лучшее решение действительно зависит от приложения, которое вы создаете. Вероятно, вы получите лучшие ответы, если создадите новый вопрос и опишете, что вы создаете и как вы хотите, чтобы пользователи взаимодействовали с ним.

3. Ах, мне очень жаль. Я просто подумал , что, возможно, можно будет получить все с помощью одной простой команды, например docker pull <something> , без загрузки первого файла docker-compose, а затем выполнения docker-compose build