#docker #docker-compose #dockerfile #docker-registry #dockerhub
Вопрос:
Я хотел спросить о некоторых ошибках в моем приложении для создания докеров, которые я не могу понять. Я не уверен, совершаю ли я какую-то ошибку в коде или я неправильно понимаю всю концепцию docker compose.
Вот вещи, которые я делаю:
- Я построил докер-сочинение на ноутбуке А — все работает
- В docker-compose.yml я изменил имя, если мое изображение на mynick/myimage:тест
- Я отправил свое «пользовательское» изображение в docker hub с помощью docker-compose push
- Я скопировал свой файл docker-compose.yml и файл .env в ноутбук B
- Я сделал докер-сочинение —env-файл env вверх
- Каждое изображение было успешно загружено из docker hub, и мое приложение запустилось
- После загрузки моего приложения я вижу ошибки об отсутствующих файлах и каталогах из моей основной папки приложения (в которой также были 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