Python 如何在远程服务器上以与Docker compose up相同的方式运行Docker容器?

Python 如何在远程服务器上以与Docker compose up相同的方式运行Docker容器?,python,docker,nginx,docker-compose,Python,Docker,Nginx,Docker Compose,TL;DR:获取错误/docker-entrypoint.sh:第10行:exec:nginx:cannot execute:当docker compose up工作正常时,目录是否正在运行docker run username/srdc\u prod:2020.07.26 我有一个docker容器,我已经推到DockerHub。我可以在本地运行docker compose。我在我的远程服务器上关闭了它,现在我正在尝试使用docker-run-username/srdc\u-prod:2020.

TL;DR:获取错误
/docker-entrypoint.sh:第10行:exec:nginx:cannot execute:当
docker compose up
工作正常时,目录是否正在运行
docker run username/srdc\u prod:2020.07.26

我有一个docker容器,我已经推到DockerHub。我可以在本地运行docker compose。我在我的远程服务器上关闭了它,现在我正在尝试使用
docker-run-username/srdc\u-prod:2020.07.26

执行此操作时,会出现错误
/docker-entrypoint.sh:第10行:exec:nginx:cannot execute:Is a directory
。执行
docker compose up
在本地运行良好。我想将此映像推送到Docker Hub,然后将其下拉并在远程服务器上运行。但是,我不能使用
docker compose up
,因为
docker compose.yaml
文件在远程不存在。我意识到我可以尝试远程克隆我的GitHub repo,然后运行
docker compose up
,但这无法实现将容器推送到DockerHub并最终设置CI/CD的目的

有没有办法在容器上运行docker compose?或者可以看到所有执行的命令吗?我发现我可以使用
docker ps--no trunc
查看运行docker容器所执行的所有命令,但所有这些都依赖于
docker entrypoint.sh
文件,我似乎无法远程执行该文件。我这样做是否都错了,我需要重构Dockerfile以在远程服务器上运行

远程服务器上的映像 docker-entrypoint.sh Dockerfile docker-compose.yml
您看到的错误是准确的:
nginx
是一个目录。根据您的
docker compose.yml
manifset,根目录中有一个
nginx
文件夹,您可以将其用作
nginx
服务的生成上下文

  nginx:
    build: ./nginx # Here's the evidence for the nginx folder.
    ports:
构建
django_web
图像时,将整个上下文目录复制到
/app
,其中包括
nginx
目录

COPY . /app
# set working directory
WORKDIR /app
您的
username/srdc\u prod
图像的
CMD
nginx-g守护进程关闭,由您的
docker entrypoint.sh
执行。这会失败,因为
nginx
是一个目录

COPY . /app
# set working directory
WORKDIR /app
根据您的
docker compose.yml
清单,您实际需要的
CMD
看起来像是
daphne-b0.0.0-p8000 srdc.asgi:application
或类似的东西,但不是
nginx
,它没有安装在基于阿尔卑斯山的映像中

有些建议超出了问题的范围

  • 如果在DeV中使用DOCKE撰写,请考虑在宿主环境中使用它,而不是运行RAW <代码> DOCKER运行命令。
  • 更好的是,在swarm模式下使用Docker。您可以通过这种方式重新使用清单文件,尽管您需要删除一些不推荐使用的内容(例如,
    取决于
    ),并稍微扩展一下服务定义。使用swarm模式或其他编排工具将使将来更容易扩展您的服务,此外,您还可以获得一些其他方便的功能,如机密、重启策略、网络隔离等

  • 也许我遗漏了什么,但是在你的Dockerfile中你似乎没有安装nginx,但是你的
    CMD
    nginx-g…
    。如果该命令是
    daphne…
    ?有一个名为“nginx”的目录,它有一个Dockerfile。我可能应该包括它。但这是
    nginx
    服务的
    Dockerfile
    ,对吗?根据您正在运行的映像(
    srdc\u prod
    ),您的问题似乎是关于
    django\u web
    服务的,它不需要
    nginx
    Dockerfile
    。您列出了三个容器,看起来您在错误的容器中运行了
    nginx
    命令。谢谢。你能详细阐述一下这个代码吗?如果你在DeV中使用DOCKE撰写,考虑在你的宿主环境中使用它,而不是运行原始的DOCKER运行命令。< /代码>?如果不将repo克隆到远程服务器上,我看不到一种简单的方法来实现这一点。我将研究群集模式。谢谢通常,除了docker-compose.yml文件,以及一些用于配置的env文件之外,您不需要在远程服务器上放置任何东西。所有的映像都应该存在于某个容器注册表中的云中,并且每个映像都应该拥有它需要运行的所有东西(即所有的应用程序代码和资产等等)。在您共享的YAML文件中,django容器装载
    /app
    目录,但在构建的映像中
    app
    被复制到容器中。因此,您不需要在远程服务器上克隆repo?你有什么链接可以让我在prod中运行docker compose吗?谢谢对不起,我没有任何链接。我在prod、QA和UAT中使用Docker Swarm。我个人只在所有环境中使用一个docker-compose.yml文件,但每个环境都有单独的环境文件。在我看来,服务定义在所有环境中都应该是相同的,从env到env的变化应该可以使用环境变量进行配置。
    version: '3'
    
    services:
      django_web:
        build: .
        command: bash -c "daphne -b 0.0.0.0 -p 8000 srdc.asgi:application"
        expose:
           - 8000
        image: srdc:v0
        container_name: srdc_django_web
        volumes:
          - .:/app
          - static_volume:/var/www/srdc/static/
        depends_on:
          - db
      nginx:
        build: ./nginx
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - static_volume:/var/www/srdc/static/
          - ./data/certbot/conf:/etc/letsencrypt
          - ./data/certbot/www:/var/www/certbot
        depends_on:
          - django_web
      db:
        image: postgres
        container_name: "my_postgres"
        ports:
          - "54320:5432"
        volumes:                                                                                                                                                                                     - my_dbdata:/var/lib/postgresql/data
    volumes:                                                                                                                                                                                       my_dbdata:
        static_volume:                                                                                                                                                                             media_volume:
    
      nginx:
        build: ./nginx # Here's the evidence for the nginx folder.
        ports:
    
    COPY . /app
    # set working directory
    WORKDIR /app