【问题标题】:Running npm run test in the Dockerfile?在 Dockerfile 中运行 npm run test?
【发布时间】:2019-08-09 18:40:20
【问题描述】:

使用构建器生成较小的 docker 映像,运行npm run test 的好方法是什么?我似乎在构建之后在 Dockerfile 中运行它是有意义的,但也许我错过了一些东西

Dockerfile

# Global args to persist through build stages
ARG docker_build_user
ARG docker_build_time
ARG docker_build_head
ARG docker_build_head_short
ARG docker_build_submodules_head

FROM node:8.9.4-alpine as builder

WORKDIR /app

COPY . .

RUN apk add --no-cache bash
RUN apk add --no-cache git
RUN apk add --no-cache make gcc g++ python

RUN npm install

ENV NODE_ENV=production

RUN npm run build

RUN rm -rf node_modules

RUN npm install

FROM node:8.9.4-alpine

# setup build metadata
ARG docker_build_user
ARG docker_build_time
ARG docker_build_head
ARG docker_build_head_short
ARG docker_build_submodules_head

WORKDIR /app

COPY --from=builder /app .

ENV DOCKER_BUILD_USER $docker_build_user
ENV DOCKER_BUILD_TIME $docker_build_time
ENV DOCKER_BUILD_HEAD $docker_build_head
ENV DOCKER_BUILD_HEAD_SHORT $docker_build_head_short
ENV DOCKER_BUILD_SUBMODULES_HEAD $docker_build_submodules_head
ENV DOCKER_BUILD_DESCRIPTION This build was created by $docker_build_user at $docker_build_time from $docker_build_head_short
ENV NODE_ENV=production
ENV ENABLE_LOGGING=true

RUN echo "DESCRIPTION:${DOCKER_BUILD_DESCRIPTION}"

RUN chown -R 999:999 .
USER 999

# expose our service port
EXPOSE 8080

# Default is to run the server (should be able to run worker)
# Set env var in k8s or run : NPM_RUN_TASK (default is serve)
CMD ["/app/startup.sh"]

【问题讨论】:

    标签: docker testing continuous-integration


    【解决方案1】:

    根据您的承受能力,您已经将multistage build 用于您的Dockerfile,一个阶段用于构建,一个阶段用于打包。

    您使用它是因为最终的包阶段不需要一些构建依赖项来构建,因此您将构建与第一阶段分开。然后测试的东西是一样的,你的 dockerfile 结构将类似于下一个:

    Dockerfile:

    # Build stage
    FROM node:8.9.4-alpine as builder
    # ......
    RUN npm install
    
    # Test stage
    FROM builder as test
    # ......
    RUN npm run test
    
    # Package stage
    FROM node:8.9.4-alpine
    COPY --from=builder /app .
    # ......
    

    那么,测试阶段仍然可以使用构建阶段构建的东西进行测试,但是打包阶段不会在测试阶段生成任何东西。

    一些相关指南参考this和this,以上是其他人每天为他们的nodejs项目docker集成所做的。

    【讨论】:

    • 谢谢,这很有帮助!我将它与 docker build --target test 结合使用来执行 CI 管道中的测试
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 2020-09-03
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2018-02-14
    • 2021-03-03
    相关资源
    最近更新 更多