在 Docker-compose 中为 Angular 应用程序的 NX monorepo 提供服务

RoX*_*XaS 8 docker docker-compose docker-volume angular nrwl-nx

我有一个带有 2 个应用程序的 NX monorepo:

  • 店铺
  • 降落

我希望使用 docker-compose 来运行我的整个环境,最终包含一些 API 和数据库等。

我创建了一个带有参数的 docker 文件,可以重新用于在 Nx 中运行多个角度应用程序:

# base image
FROM node

ARG APP


# # install chrome for protractor tests
# RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
# RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
# RUN apt-get update && apt-get install -yq google-chrome-stable
# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json
COPY decorate-angular-cli.js /app/decorate-angular-cli.js
RUN npm install
RUN npm install -g @angular/cli@latest
RUN npm install reflect-metadata tslib rxjs @nestjs/platform-express

# add app
COPY . /app
# start app
CMD npm start $APP -- --host 0.0.0.0 --port 4200 --disableHostCheck=true --poll 100
Run Code Online (Sandbox Code Playgroud)

我创建了一个 docker-compose 文件,用于设置 .net 5 API 和 2 个 Web 应用程序:

version: '3.4'

services:
  sletsgo.user.api:
    image: ${DOCKER_REGISTRY-}sletsgo.user.api
    build:
      context: .
      dockerfile: SletsGo.User.Api/Dockerfile
    ports:
      - "5000:2000"
      - "444:443"

  sletsgo.shop:
    container_name: 'SletsGo.Shop'
    image: ${DOCKER_REGISTRY}sletsgo.shop:dev
    build:
        context: SletsGo
        dockerfile: .docker/Dockerfile
        args:
            - APP=shop
    ports:
        - '4000:4200'
    #volumes:
    #    - sletsgo-web:/app
    #    - '/app/node_modules'

  sletsgo.landing:
    container_name: 'SletsGo.Landing'
    image: ${DOCKER_REGISTRY}sletsgo.landing:dev
    build:
        context: SletsGo
        dockerfile: .docker/Dockerfile
        args:
            - APP=landing
    ports:
        - '4100:4200'
  #  volumes:
  #      - sletsgo-web:/app
  #      - '/app/node_modules'

 


#volumes:
# sletsgo-web:
#    driver: local
#    driver_opts:
#      type: local
#      device: ./SletsGo
#      o: bind
Run Code Online (Sandbox Code Playgroud)

请注意,很多行都被注释掉了。问题是,如果我运行这个 docker-compose,我会得到 2 个运行的商店应用程序实例。

显示 2 个商店实例的屏幕截图

我怎样才能解决这个问题?

PS我还想象使用卷我可能能够简化很多事情。但我尝试安装失败,因为我在 Windows 机器上使用 Linux 容器。如果有人愿意帮助我更上一层楼,我会非常高兴,但现在我只想运行这两个 Web 应用程序。

mas*_*eyb 7

长话短说

ARG是构建时间变量。您可以在构建过程中将 的值保留ARG在图像环境中,或者覆盖services[*].commanddocker-compose.yaml.


坚持在环境中

--build-arg您可以在构建期间保留图像环境中设置的环境变量:

FROM alpine:3
ARG APP
ENV APP=${APP}
CMD echo $APP
Run Code Online (Sandbox Code Playgroud)

构建docker图像:docker build --rm --build-arg APP=123 -t so:66935830 .

运行docker容器:docker run --rm -it so:66935830

docker 使用 --build-arg 设置的环境变量运行

覆盖command

您可以覆盖command以下中的每个服务docker-compose.yaml

version: '3.7'
services:
  a:
    image: 'a'
    build:
      context: '.'
    command: ['echo', '123']
  b:
    image: 'b'
    build:
      context: '.'
    command: ['echo', '456']
Run Code Online (Sandbox Code Playgroud)

docker-compose 运行命令覆盖

  • 感谢这堂课!很有帮助 (2认同)