我正在尝试使用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 start
和python 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
,距离不远。
答案 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将构建上下文移动到每个目录中,解决了该问题。运行启动脚本可以通过更改入口点来完成,但是对于本地开发,将其附加到容器以运行迁移或类似操作更为方便。