我正在使用此目录方案开发网络:
.
├── api
│ ├── here is my backend application
│ └── Dockerfile,
├── client
│ ├── here is my frontend application
│ └── Dockerfile
├── docker-compose
我在 NuxtJS 中有这个 Dockerfile 的前端:
FROM node:10
# Create app directory
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
RUN npm run build
ENV HOST 0.0.0.0
EXPOSE 3000
# start command
CMD [ "npm", "start"]
我的后端是带有这个 Dockerfile 的 Strapi:
FROM strapi/base:latest
# Create app directory
WORKDIR /app
COPY package.json /app
# install
RUN npm install
COPY . /app
# RUN rm yarn.lock
# RUN npm
RUN npm run build
ENV HOST 0.0.0.0
EXPOSE 1337
# start command
CMD [ "npm", "start"]
最后这是我的 docker-compose.yaml 文件:
version: '3'
services:
frontend:
build:
context: ./client
dockerfile: Dockerfile
volumes:
- ./client:/app
- /app/node_modules
- /app/.nuxt
stdin_open: true
tty: true
environment:
- HOST=0.0.0.0
- CHOKIDAR_USEPOLLING=true
ports:
- 3000:3000
depends_on:
- "backend"
backend:
build:
context: ./api
dockerfile: Dockerfile
volumes:
- ./api:/app
- /app/node_modules
stdin_open: true
tty: true
environment:
- HOST=0.0.0.0
- CHOKIDAR_USEPOLLING=true
ports:
- 1337:1337
当我尝试分别构建两个图像然后运行它们时,一切正常,前端能够调用后端。但是,如果我尝试使用 docker-compose up
使用 docker-compose,前端和后端都可以正常启动,但是前端无法访问后端。你能帮我看看有什么问题吗?为什么?
谢谢
答案 0 :(得分:0)
Compose 将启动两个不同的 Docker 容器加入网络(参见 https://docs.docker.com/compose/networking/)。
它们可以通过您在撰写文件中使用的名称相互访问:
这与您从运行 docker 的主机访问它们的方式不同。在那里你可以使用本地主机。从每个容器中,您需要使用正确的网络名称。 因为在前端容器中只有前端在运行和监听,所以没有人监听 localhost:1337。
通常,您可以通过环境变量配置后端 url,并使用 localhost 作为默认值,以便在没有 docker 的情况下在本地运行它们。 在 Docker Compose 中,您需要像使用 HOST 一样通过环境部分覆盖配置参数。
检查您的前端框架应该如何执行此操作: https://nuxtjs.org/docs/2.x/configuration-glossary/configuration-env