无法运行容器的启动脚本

时间:2019-05-31 10:29:09

标签: docker docker-compose dockerfile

我正在尝试使用docker-compose启动三个docker容器;一个postgresql数据库,一个rest api和一个前端Web应用程序。

以前,我的其余api和数据库运行正常(运行迁移并启动了服务器),但是当我想从Web应用程序向其发送请求时,我无法连接到docker网络。互联网上的所有讨论都围绕将一个容器中的Web应用程序连接到另一个容器中的api进行,我没有找到任何有前途的方法来连接它(除了在内核中启用端口转发并将自己暴露于网络之外? ),因此我决定将Web应用也打包在一个容器中。

我的目录结构:

ProjectName
|-> projectapi
|-> |-> api.docker
|-> |-> api_start.sh
|-> projectapp
|-> |-> front.docker
|-> |-> front_start.sh
|-> docker-compose.yml

问题是在正确的上下文中运行这些启动脚本(我只需要运行npm startpython manage.py runserver)。

我想不出我没有尝试过的任何东西,但是我的大部分努力都集中在乱弄路径上,因为在最长的时间内,问题一直没有找到我认为已经修复的文件。

这是docker-compose文件,我尝试在此处使用各种command条目来运行所需的启动脚本。我也用过entrypoint

version: '3.7'

services:
  db:
    container_name: projectdb
    image: postgres:9.6-alpine
    restart: always
    volumes:
      - projectdb:/var/lib/postgresql/data/
    environment:
      POSTGRES_DB: projectdb
      POSTGRES_PASSWORD: root
    ports:
      - "8001:5432"

  api:
    container_name: projectapi
    build:
      context: projectapi/
      dockerfile: api.docker
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db
    restart: always
    environment:
      POSTGRES_DB: 'projectdb'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'root'
      POSTGRES_HOST: 'db'

  front:
    container_name: projectapp
    build:
      context: projectapp/
      dockerfile: front.docker
    ports:
      - "3000:3000"
    restart:
      always


volumes:
  projectdb:

然后是Dockerfile:

FROM node:8
RUN mkdir /projectapp
COPY $HOSTDIR/package*.json /projectapp/
RUN npm install /projectapp
COPY $HOSTDIR/* /projectapp/
ENTRYPOINT ["npm", "start", "/projectapp"]

后退

FROM python:3.6-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1

RUN mkdir /projectapi
COPY $HOSTDIR/requirements.txt /projectapi/
RUN pip install -r /projectapi/requirements.txt
COPY $HOSTDIR/* /projectapi/
CMD ["python", "manage.py", "migrate"]

最后一行也可以是runserver。这些只是我所经历的排列的一些示例,但是在这一点上,我认为问题是一些概念上的误解,我已经阅读了文档。

错误消息是找不到启动脚本的所有不同排列。我认为在某种程度上我设法运行了启动脚本,但错误却变成找不到manage.py,这时我开始研究如何编写脚本,而不仅仅是:python manage.py runserver,距离不远。

2 个答案:

答案 0 :(得分:0)

尝试使用WORKDIR。您当前的运行路径没有manage.py-

我尝试过暂时更改-

WORKDIR /projectapi
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver"]

答案 1 :(得分:0)

我已经解决了这个问题,但仍然没有使网络正常工作,但这是另一个问题。虽然我用启动脚本解决了问题,但事实证明这不是必需的,但这是当前的情况:

目录结构与以前相同。

docker-compose.yml

do {
        try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: .allowBluetooth)
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {}
let availableInputs = AVAudioSession.sharedInstance().availableInputs

version: '3.7'

services:
  db:
    container_name: compdb
    image: postgres:9.6-alpine
    restart: always
    volumes:
      - compdb:/var/lib/postgresql/data/
    environment:
      POSTGRES_DB: compdb
      POSTGRES_PASSWORD: root
    networks:
      - internal
    ports:
      - "8001:5432"

  api:
    container_name: back
    build:
      context: back/
      dockerfile: api.docker
    entrypoint: ["python", "/back/manage.py", "runserver", "0.0.0.0:8000"]
    networks:
      - internal
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db
    restart: always
    environment:
      POSTGRES_DB: 'compdb'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'root'
      POSTGRES_HOST: 'db'

  front:
    container_name: front
    build:
      context: front/
      dockerfile: front.docker
    entrypoint: ["npm","start", "--prefix", "/front/"]
    networks:
      - internal
    ports:
      - "3000:3000"
    expose:
      - "3000"
    depends_on:
      - api
    restart:
      always

  staff:
    container_name: staff
    build:
      context: staff/
      dockerfile: staff.docker
    entrypoint: ["npm","start","--prefix","/staff/"]
    networks:
      - internal
    ports:
      - "3006:3006"
    expose:
      - "3006"
    depends_on:
      - api
    restart:
      always

volumes:
  compdb:

networks:
  internal:

后退

FROM node:8
RUN mkdir /front
COPY package*.json /front/
RUN npm install /front
COPY . /front/

工作人员类似于前台。

通过使用docker compose将构建上下文移动到每个目录中,解决了该问题。运行启动脚本可以通过更改入口点来完成,但是对于本地开发,将其附加到容器以运行迁移或类似操作更为方便。