【发布时间】: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