运行容器后如何将Conainter目录挂载到另一个目录?

时间:2019-05-28 06:22:02

标签: docker nginx mount

我有一个角度应用程序,该应用程序是根据Dockerfile所示的容器运行时构建的,它是由两个图像构建的。

FROM node:10.15.3-alpine as builder

RUN mkdir -p /usr/src/banax_education_platform
WORKDIR /usr/src/banax_education_platform

RUN apk add git
COPY package*.json /usr/src/banax_education_platform/
RUN npm i

COPY . /usr/src/banax_education_platform

RUN npm i -g @angular/cli && npm run-script build


FROM nginx:1.13.12-alpine

RUN rm -rf /usr/share/nginx/html/*

COPY /nginx/default.conf /etc/nginx/conf.d/default.conf

COPY --from=builder /usr/src/banax_education_platform/dist/edu-app /usr/share/nginx/html

EXPOSE 80

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

因此,首先,它获取节点图像并构建具有所有要求的应用程序。然后获取另一个nginx图像并创建服务器块以显示该应用程序。现在,我想拆分两个图像,因此一个容器包含有角度的应用程序,第二个容器包含nginx反向代理。

对此docker-compose.yml

有所了解
version: "2"
services:
 nginx:
  build: ./nginx
  container_name: angular-nginx
  ports:
   - "80:80"
  volumes:
   - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
  depends_on:
   - web
 web:
  build: ./angular
  container_name: angular-app
  ports:
   - "8000"

但是问题是,我想要这个任务: COPY --from=builder /usr/src/banax_education_platform/dist/edu-app /usr/share/nginx/html是通过docker-compose完成的,因为现在我有2个Dockerfile,一个用于angular,一个用于nginx,所以我不知道如何将那个角度容器的目录与nginx容器链接。有人知道吗?

2 个答案:

答案 0 :(得分:2)

在典型的Web应用程序中,您运行某种打包程序(例如Webpack),将您的应用程序“编译”为一组静态文件。然后,您需要一些Web服务器将这些文件发送给客户端,但是一旦构建,就不会在服务器端运行该代码。

这与您在问题中显示的多阶段Docker映像非常匹配。第一阶段只构建工件,一旦完成,就不会运行构建的图像。 (例如,注意缺少CMD。)第二阶段COPY --from=build是它构建的静态工件,就是这样。

由于在第一阶段没有实际的应用程序运行,因此没有必要将其作为单独的Docker Compose服务运行,或者以您所显示的方式“拆分”。

如果您不介意使用多个构建工具,则可以做的一件事是从Nginx的角度将打包的应用程序视为“数据”(它对这些文件的内容一无所知,它只是通过网络发送数据)。您可以在主机上选择某个目录,然后将其挂载到Nginx容器中

version: "3"
services:
  nginx:
    image: nginx:1.13.12-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./dist:/usr/share/nginx/html

,然后在需要重建和重新部署应用程序时在主机系统上npm run-script build

答案 1 :(得分:1)

我认为存在概念上的误解。我对Angular并不熟悉,但是这是我将如何处理(未经测试)的方法。

反向代理本身不需要您在Dockerfile中生成的已编译文件。该容器(在您的情况下为web)就可以将HTTP(S)请求传递到正确的端点(这是另一个Web服务器,我们称之为app)。 app本身是为您的Angular应用程序提供服务的Nginx Web服务器。

所以,您要做的就是这样:

version: "3.7"

services:

  web:
    image: nginx
    volumes:
      - ./config/with/proxy/rules:/etc/nginx/conf.d/default.conf
    ports:
      - 80:80
      - 443:443

  app:
    build: ./path/to/your/dockerfile
    expose:
      - "8000"
    volumes:
      - ./path/to/nice/config:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

第一个卷的配置文件必须包含您需要的所有代理规则。基本上,这样的事情应该发生在某个地方:

location / {
      proxy_pass http://app:8000;
}

这就是您的反向代理所需要知道的全部信息。

相关问题