为什么在另一台机器上,如果我将每个文件都包含在我的 docker 映像中,我的 docker-compose 应用程序会抛出有关丢失文件的错误?

佩克西奥

我想问一下我的 docker-compose 应用程序中一些我无法理解的错误。我不确定我是否犯了某种代码错误,或者我误解了 docker compose 的整个概念。

以下是我正在做的事情:

  1. 我在笔记本电脑 A 上构建了 docker-compose - 一切正常

  2. 在 docker-compose.yml 中,如果我的图像为 mynick/myimage:test,我将名称更改为

  3. 我使用 docker-compose push 将我的“自定义”图像推送到 docker hub

  4. 我将 docker-compose.yml 文件和 .env 文件复制到笔记本电脑 B

  5. 我做了 docker-compose --env-file env up

  6. 每个图像都从 docker hub 成功下载,我的应用程序启动

  7. 启动我的应用程序后,我看到有关从我的主应用程序文件夹中丢失文件和目录的错误(其中还包含 docker-compose 和 docker 文件,因此它应该已经包含所有内容?)

我在第 7 步中看到的错误是例如“缺少 alembic.ini 文件”。当我手动将它复制到笔记本电脑 B(docker-compose.yml 所在的文件夹)时,我看到错误“失败:路径不存在:'/my_app/alembic”

我觉得很奇怪,因为我的自定义图像有命令“COPY ./my_app”,据我所知它应该复制图像中的所有文件,所以它应该具有所有文件和完全相同的文件夹结构?

这个文件夹结构看起来像这样:我的文件夹结构看起来像这样:

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

我的 Dockerfile:

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

我的 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 && 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 && 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 的工作原理?

电话号码

问题是volume第二个docker-compose.yml文件中指令它正在用本地目录的内容覆盖您复制到映像中的文件。您不会注意到第一台笔记本电脑上的差异,因为本地目录包含复制到映像中的相同文件。但是在第二台笔记本电脑上,您会收到错误消息,因为缺少项目文件。

删除第二台笔记本电脑文件中volume指令,docker-compose.yml错误应该会消失。如果没有volume,您复制到图像中的文件将作为例外使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章