Docker 使用 Gitlab CI 为 Vue JS 构建一致性

Posted

技术标签:

【中文标题】Docker 使用 Gitlab CI 为 Vue JS 构建一致性【英文标题】:Docker build inconsistency for VueJS with GitlabCI 【发布时间】:2020-07-17 01:13:41 【问题描述】:

使用 Gitlab CI,我正在尝试为 VueJS 应用程序构建 docker 图像。 .gitlab-ci.yml文件如下:

image: docker
services:
  - docker:dind
stages: 
  - staging
  - deploy

staging:
  stage: staging
  tags: [staging]
  script:
    - docker build --build-arg env=staging -t npmmc/router-control .
    - docker stop router-control || true && docker rm router-control || true
    - docker run -d -p 4001:8080 --restart unless-stopped --env NODE_ENV=staging --name router-control npmmc/router-control

deploy:
  stage: deploy
  tags: [production]
  when: manual
  only: 
    - master
  script:
    - docker build --build-arg env=production -t npmmc/router-control .
    - docker stop router-control || true && docker rm router-control || true
    - docker run -d -p 4001:8080 --restart unless-stopped --env NODE_ENV=production --name router-control npmmc/router-control

还有Dockerfile:

FROM node:lts-alpine

ARG env=development
ENV NODE_ENV=$env

RUN npm install -g http-server
WORKDIR /app
COPY package*.json ./
RUN npm install --progress=false
COPY . .
RUN NODE_ENV=$NODE_ENV npm run build

EXPOSE 8080
CMD ["http-server", "dist"]

staging 步骤构建和运行没有任何问题。 production 步骤失败并出现错误 sh: vue-cli-service: not found。我不明白它们之间有什么不同,当我在测试后第二次为生产构建完全相同的 docker 映像时。任何帮助表示赞赏。

【问题讨论】:

这行 docker build:RUN NODE_ENV=$NODE_ENV npm run build 是否失败? 【参考方案1】:

当环境变量 NODE_ENV 设置为 production 运行时,npm 不会安装列为“devDependencies”的软件包。引用自official documentation:

使用 --production 标志(或者当 NODE_ENV 环境变量设置为生产时),npm 将不会安装 devDependencies 中列出的模块。当 NODE_ENV 环境变量设置为生产时,要安装依赖项和 devDependencies 中列出的所有模块,您可以使用 --production=false。

因此,您的问题的解决方案是:

ENV NODE_ENV=$env 行向下移动一点,使其RUN npm install --progress=false 行之后, 将RUN npm install --progress=false 替换为RUN npm install --progress=false --production=false(添加--production=false 标志)。

【讨论】:

以上是关于Docker 使用 Gitlab CI 为 Vue JS 构建一致性的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI/CD 之 Gitlab Runner Docker Executor 缓存问题

以 shell 执行器和 docker 镜像为基础的 Gitlab CI

如何使用 CI/CD 为 Gitlab 注册表推送基于 docker compose 的图像

无法在 Windows 服务器上使用 docker 为 gitlab-ci 运行构建

Python Flask项目在Gitlab CI中自动打包Docker镜像

使用 Gitlab CI 时如何设置 docker 容器的主机名