当前位置: 首页 > 知识库问答 >
问题:

如何以与docker组合相同的方式在远程服务器上运行Docker容器?

冀俊良
2023-03-14

TL;DR:获取错误代码/docker入口点。sh:第10行:exec:nginx:cannot execute:Is a directoryrunningdocker run username/srdc\u prod:2020.07.26whendocker compose up工作正常。

我有一个docker容器,我已经推到DockerHub。我可以用docker compose在本地运行此功能。我在我的远程服务器上下载了这个,现在我正在尝试使用docker run用户名/srdc\U产品:2020.07.26。

当我这样做时,我得到错误/docker-entrypoint.sh:第10行:exec: nginx:无法执行:是一个目录。执行docker-compose up在本地工作得很好。我想将此映像推送到Docker Hub并将其下拉并在我的远程服务器上运行它。但是,我不能使用docker-compose up,因为docker-compose.yaml文件不存在远程。我意识到我可以尝试远程克隆我的GitHub存储库,然后运行docker-compose up,但这违背了将容器推送到DockerHub并最终设置CI/CD的目的。

有没有办法在容器上运行docker compose?或者是否可以看到执行的所有命令?在这个问题中,我看到我可以使用docker ps—无trunc来查看为运行docker容器而执行的所有命令,但所有这些都依赖于docker入口点。sh文件,似乎无法远程执行。我是否做错了,需要重构Dockerfile以在远程服务器上运行?

username@ubuntu-512mb-name:~$ docker image ls
WARNING: Error loading config file: /home/username/.docker/config.json: stat /home/username/.docker/config.json: permission denied
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
username/srdc_prod        2020.07.26          af62927882ee        5 days ago          504MB
  1 #!/bin/bash
  2
  3 echo "Collect static files"
  4 python manage.py collectstatic --noinput
  5
  6 echo "Apply database migrations"
  7 python manage.py migrate --noinput
  8
  9 echo "Starting daphne server"
 10 exec "$@" # offending line
FROM python:3-alpine

# set env vars
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir /app

RUN apk update && apk add --no-cache postgresql-dev gcc libffi-dev musl-dev build-base python3-dev bash

COPY requirements.txt /app/requirements.txt
RUN pip install --upgrade pip && pip install --no-cache-dir -r /app/requirements.txt

COPY test-requirements.txt /app/test-requirements.txt
RUN pip install --upgrade pip && pip install --no-cache-dir -r /app/test-requirements.txt

COPY . /app
# set working directory
WORKDIR /app

RUN mkdir -p /var/www/srdc/static/
RUN chmod 755 /var/www/srdc/static/

EXPOSE 8000

ENV DJANGO_SETTINGS_MODULE=srdc.settings

CMD ["nginx", "-g", "daemon off;"]

ADD docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
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:

共有1个答案

严瑞
2023-03-14

您看到的错误是准确的:nginx是一个目录。根据您的docker-compose.yml清单集,您的根目录中有一个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

您的用户名/srdc\U产品图像的CMD是nginx-g守护进程关闭 ,这是docker入口点。执行sh。这会失败,因为nginx是一个目录。

根据您的docker-compose.yml清单,您实际上想要的CMD似乎是daphne-b0.0.0.0-p 8000srdc.asgi: Application或类似的东西,但不是nginx,它没有安装在基于阿尔卑斯山的映像中。

一些建议超出了问题的范围。

  1. 如果您在开发中使用docker-compose,请考虑在托管环境中也使用它,而不是运行原始docker run命令。
  2. 更好的是,在群模式下使用Docker。您可以通过这种方式重用清单文件,尽管您需要删除一些已弃用的内容(例如depends_on)并稍微扩展服务定义。使用群模式——或其他一些编排工具——将更容易在未来扩展您的服务,此外您还可以获得一些其他方便的功能,例如机密、重启策略、网络隔离等。
 类似资料:
  • 我有一个运行在Ubuntu16.04上的amazon web服务器。此服务器专用于运行由多个进程组成的模拟。我被赋予了创建docker容器的任务,以便可以在服务器上同时运行模拟的多个实例。我知道运行多个容器需要为每个容器更改一些端口ID,所以我的第一个任务是在一个容器中运行一个模拟实例。看来我可以在dockerFile中调用所有必要的软件映像来创建我的映像文件。但我想知道是否有一个更简单的方法来创

  • 问题内容: 我在CI和CD上创建了Jenkinsfile,Dockerfile,Dockerfile.test到CI和CD,在GitHub上构建了我的服务器API,我在Jenkins上构建了该构建,并且构建成功,并且我的docker在Jenkinsfile阶段也在容器上运行,我创建了用于测试和部署在服务器API上,并使用docker作为容器 我也使用docker-compose在docker上运行

  • 我已经在我的主机虚拟机上安装了docker。现在想用vi创建一个文件。 但它向我展示了一个错误:

  • 问题内容: 我正在研究Centos7。我有一个运行Jenkins的Docker容器。在那个Jenkins容器中,我必须构建并运行其他Docker容器。但是詹金斯不认识码头工人。我能够执行一个shell并将docker安装在容器中。但是,是否有可能让容器在主机上使用我的docker- engine?如何使用? 在Jenkins-(docker)-容器中安装Docker的最佳选择是什么? 问题答案:

  • 问题内容: 我已经开始使用docker进行开发,并进行以下设置: 主机-ubuntu服务器。 Docker容器-带有tomcat服务器的webapp(使用https)。 就主机-容器访问而言-一切正常。 但是 ,我无法从远程计算机(尽管仍然在同一网络中)访问容器的webapp。 跑步时 输出符合预期,因此docker的端口绑定看起来不错。 有任何想法吗? 谢谢! 问题答案: 我发现了我错过的内容,

  • 问题内容: 我正在设置一个简单的图像:包含Riak(一个NoSQL数据库)的图像。该映像以CMD形式启动Riak服务。现在,如果我使用将该程序作为守护程序运行,它将启动Riak进程(我可以在日志中看到它)。但是,它会在几秒钟后自动关闭。如果我使用riak进程未启动运行它(更新:对此的解释,请参见答案)。实际上,根本没有任何服务在运行。我可以使用终端手动启动它,但是我希望Riak自动启动。我认为其他