Dockerfile在多个环境中部署Vue.js应用程序?

时间:2020-06-05 17:31:03

标签: docker vue.js google-cloud-platform dockerfile devops

我正在尝试创建一个Dockerfile,以将Vue.js应用部署为Cloud Run(GCP)中的docker。从Vue官方文档中获取Dockerfile,以“生产模式”部署应用程序:

FROM node:lts-alpine
RUN npm install -g http-server
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 8080
CMD [ "http-server", "dist" ]

它可以正常工作,但是我想修改Dockerfile使其动态。我的意思是,我希望该文件能够使用一种输入参数部署到生产或DEV

我尝试了几次尝试,其中之一是添加这些新行

ENV ENT=production
RUN NODE_ENV=${ENT} npm run build

意图将环境变量的默认值定义为“生产”,并在Cloud Run服务中将相同的环境变量定义为“ dev”。我以为在云运行服务上定义的变量将在运行Docker时覆盖局部变量(Dockerfile)。它没有被覆盖,并且该应用再次在生产中运行

您知道是否有一种方法可以覆盖Dockerfile环境变量,或者是否可以创建类似的内容

npm run build:dev
npm run build:prod

动态地取决于我要部署的环境?

这是我的 package.json

{
  /// ...
  "scripts": {
    "dev": "vue-cli-service serve --mode development",
    "test": "cross-env NODE_ENV=testing vue-cli-service serve --mode testing",
    "prod": "vue-cli-service serve --mode production",
    "build:dev": "vue-cli-service build --mode development",
    "build": "vue-cli-service build --mode production",
    "lint": "vue-cli-service lint"
  },
  /// ...
}

2 个答案:

答案 0 :(得分:0)

第一种方式:

传递docker参数

ARG NODE_ENV 
ENV NODE_ENV $NODE_ENV
RUN /bin/bash -c '[[ "${NODE_ENV}" == "production" ]] && npm run build:prod || npm run build:dev'

第二种方式:

将参数传递给npm脚本

在脚本中

  "build": "vue-cli-service build --mode production $npm_config_environment"

在docker文件中

ARG NODE_ENV 
RUN npm run build --environment "$NODE_ENV"

在构建docker时

docker build --build-arg NODE_ENV=production

答案 1 :(得分:0)

基于Muni Kumar的回答,我找到了一种方法,因为在GCP中部署容器的工具有些棘手。通过云构建来创建docker映像,并通过Cloud Run进行部署

在脚本中:

"build:dev": "vue-cli-service build --mode development",
"build:prod": "vue-cli-service build --mode production",

在Dockerfile中:

ARG ENV
RUN npm run build:${ENV}

新文件名为: cloudbuild.yaml ,用于向Cloud Build添加一些自定义配置

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build',
         '--build-arg',
        'ENV=${_ENV}',
         '-t',
         'gcr.io/$PROJECT_ID/landing',
         '.']
substitutions:
    _ENV: test # default value
images: [
    'gcr.io/$PROJECT_ID/landing',
]

然后创建运行下一个命令

gcloud builds submit --config=cloudbuild.yaml --substitutions=_ENV="prod"