【问题标题】:How to run docker-compose in production如何在生产中运行 docker-compose
【发布时间】:2021-04-19 17:30:37
【问题描述】:

我已经用 nginx 前端构建了一个 MEAN 堆栈应用程序。

我有 2 个 docker 文件 - 一个用于前端,一个用于后端 我有一个 docker-compose 文件,可以将它们与数据库一起拉到一起

这在我的开发机器上效果很好

然后我将图像推送到我的 dockerhub 站点

在我的生产 ubuntu 机器上,我从我的 dockerhub 存储库中提取我想要的图像

但是我应该如何运行它们呢?

我将我的 docker-compose 文件传输到服务器并尝试运行它:

docker-compose -f docker-compose.prod.yml up

但它抱怨文件夹结构不是我的开发机器上的:

ERROR: build path /home/demo/api either does not exist, is not accessible, or is not a valid URL.

我不想将所有代码都放在服务器上并重新构建它。这肯定违背了使用 dockerhub 映像的目的吗?

我还需要 docker compose 文件来拉入 .prod.env 文件以获取数据库凭据等。

我知道我在这里遗漏了一些东西。 如何运行我的图像而不从头开始重建它们?

为此我需要其他服务吗?

提前致谢

docker-compose.prod.yml:

version: '3'
services:
  # Database    
  database:
    env_file:
      - .prod.env
    image: mongo
    restart: always
    environment:
      # MONGO_INITDB_ROOT_USERNAME: root
      # MONGO_INITDB_ROOT_PASSWORD: $DB_ADMIN_PASSWORD
      # Create a new database. Please note, the
      # /docker-entrypoint-initdb.d/init.js has to be executed
      # in order for the database to be created
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: $MONGO_INITDB_ROOT_PASSWORD
      DB_NAME: $DB_NAME
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
      MONGO_INITDB_DATABASE: $DB_NAME
    volumes:
      # Add the db-init.js file to the Mongo DB container
      - ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro
      - /data/db
    ports:
      - '27017-27019:27017-27019'
    networks:
      - backend-net
  # Database management    
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: $MONGO_INITDB_ROOT_PASSWORD
      ME_CONFIG_MONGODB_SERVER: database
    depends_on:
      - database
    networks:
      - backend-net

  # Nodejs API
  backend:
    depends_on:
      - database
    env_file:
      - .prod.env
    build:
      context: ./api
      dockerfile: Dockerfile-PROD-API
    # Note: put this container name into proxy.conf.json for local angular CLI development instead of localhost
    container_name: node-api-prod
    networks:
      - backend-net

  # Nginx and compiled angular app
  frontend:
    build:
      context: ./ui
      dockerfile: Dockerfile-PROD-UI
    ports:
      - "8180:80"
    container_name: nginx-ui-prod
    networks:
      - backend-net
networks:
  backend-net:
    driver: bridge

DOCKERFILE-PROD-API:

#SERVER ========================================
FROM node:10-alpine as server

WORKDIR /app

# Install dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . .

#RUN ls -lha

EXPOSE 3000

CMD ["npm", "run", "start"]

DOCKERFILE-PROD-UI:

#APP ========================================
FROM node:10-alpine as build

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install @angular/cli && npm install

COPY . .

RUN npm run build

#RUN ls -lha

#FINAL ========================================
FROM nginx:1.18.0-alpine

COPY --from=build /usr/src/app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

【问题讨论】:

  • 您正在尝试构建容器,它说您在“/home/demo”中没有“api”文件夹,我假设您正在运行 docker-compose 命令.
  • 是的.. 但这是否意味着我必须将所有文件从 dev 复制到我的生产服务器上?我想运行容器..而不是构建它们。
  • 查看这里的无构建选项:docs.docker.com/compose/reference/up
  • 非常感谢..实际上对我来说最终解决方案是将图像名称更改为我的 dockerhub 存储库中的全名.. 当我在生产服务器上执行 docker-compose up 时能够使用从 dockerhub 推送(和拉取)的图像,并且不需要构建。我将在下面发布我的新文件

标签: docker docker-compose production


【解决方案1】:

使用包含 dockerhub 路径的完整图像名称为我解决了这个问题。

如下图所示的工作解决方案:

Dockerfile-PROD-UI

#GET ANGULAR ========================================
FROM node:10-alpine as base
WORKDIR /usr/src/app
COPY ui/package*.json ./
RUN npm install @angular/cli && npm install
COPY ui/. .

#BUILD ANGULAR ========================================
FROM base as build 
RUN npm run build
#RUN ls -lha

#NGINX ========================================
FROM nginx:1.18.0-alpine
COPY --from=build /usr/src/app/dist /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

Dockerfile-PROD-API

#SERVER ========================================
FROM node:10-alpine as server

WORKDIR /app

# Install dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . .

#RUN ls -lha

EXPOSE 3000

CMD ["npm", "run", "start"]

docker-compose.yml

version: '3.5'
services:
  # Database
  database:
    image: mongo
    restart: always
    env_file:
      - .prod.env
    environment:
      # MONGO_INITDB_ROOT_USERNAME: root
      # MONGO_INITDB_ROOT_PASSWORD: $DB_ADMIN_PASSWORD
      # Create a new database. Please note, the
      # /docker-entrypoint-initdb.d/init.js has to be executed
      # in order for the database to be created
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: $MONGO_INITDB_ROOT_PASSWORD
      DB_NAME: $DB_NAME
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
      MONGO_INITDB_DATABASE: $DB_NAME
    volumes:
      # Add the db-init.js file to the Mongo DB container
      - ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh:ro
      - db-data:/data/db
    ports:
      - '27017-27019:27017-27019'
    networks:
      - backend-net

  # Nodejs API
  backend:
    image: DOCKERHUBHUSER/DOCKERHUB_REPO:prod-backend
    restart: always
    depends_on:
      - database
    env_file:
      - .prod.env
    build:
     context: ./api
     dockerfile: Dockerfile-PROD-API
    container_name: backend
    networks:
      - backend-net
  # Nginx and compiled angular app
  frontend:
    image: DOCKERHUBHUSER/DOCKERHUB_REPO:prod-frontend
    restart: always
    depends_on:
      - backend
    build:
     context: .
     dockerfile: Dockerfile-PROD-UI
    ports:
      - "8180:80"
    container_name: frontend
    networks:
      - backend-net
networks:
  backend-net:
    driver: bridge
volumes:
  db-data:
    name: db-data
    external: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多