使用 Gitlab CI docker-in-docker 时如何修复 docker 容器中的“sh: tsc not found”错误

Posted

技术标签:

【中文标题】使用 Gitlab CI docker-in-docker 时如何修复 docker 容器中的“sh: tsc not found”错误【英文标题】:How to fix 'sh: tsc not found' error in docker container when using Gitlab CI docker-in-docker 【发布时间】:2019-12-10 17:08:39 【问题描述】:

我正在为一个项目设置 Gitlab CI docker-in-docker。不幸的是,这项工作一直失败,因为在运行命令时似乎找不到已安装的 NPM 包。我得到的错误:

backend_1   | 
backend_1   | > tacta-backend@0.0.1 build /app
backend_1   | > tsc
backend_1   | 
backend_1   | sh: tsc: not found
backend_1   | npm ERR! file sh
backend_1   | npm ERR! code ELIFECYCLE
backend_1   | npm ERR! errno ENOENT
backend_1   | npm ERR! syscall spawn
backend_1   | npm ERR! tacta-backend@0.0.1 build: `tsc`
backend_1   | npm ERR! spawn ENOENT
backend_1   | npm ERR! 
backend_1   | npm ERR! Failed at the tacta-backend@0.0.1 build script.
backend_1   | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
backend_1   | 
backend_1   | npm ERR! A complete log of this run can be found in:
backend_1   | npm ERR!     /root/.npm/_logs/2019-08-02T04_46_04_881Z-debug.log

奇怪的是,当我在不使用 Gitlab CI 的情况下手动运行 docker-compose 时,它​​确实有效。这就是我的 .gitlab-ci.yml 的样子:

build:
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
  image: docker:18
  stage: build
  services:
    - docker:18-dind
  before_script:
    - docker info
    - apk add python-dev libffi-dev openssl-dev gcc libc-dev make
    - apk add py-pip
    - pip install docker-compose
  script:
    - docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

这是我的 docker-compose.yml:

version: '3'
services:
  frontend:
    build:
      context: ./frontend
      args:
        NODE_ENV: production
        PGUSER: $PGUSER
        PGHOST: $PGHOST
        PGPASSWORD: $PGPASSWORD
        PGDATABASE: $PGDATABASE
        PGPORT: $PGPORT
        DATABASE_URL: $DATABASE_URL
    command: npm run build
    ports:
      - "9000:9000"
    volumes:
      - /app/node_modules
      - ./frontend:/app
  backend:
    build:
      context: ./backend
      args:
        NODE_ENV: production
    command: npm run build
    ports:
      - "3000:3000"
    volumes:
      - /app/node_modules
      - ./backend:/app

这是 Dockerfile:

FROM node:11.10.1-alpine
ARG NODE_ENV
ARG PGUSER
ARG PGHOST
ARG PGPASSWORD
ARG PGDATABASE
ARG PGPORT
ARG DATABASE_URL
ENV NODE_ENV $NODE_ENV
ENV PGUSER $PGUSER
ENV PGHOST $PGHOST
ENV PGPASSWORD $PGPASSWORD
ENV PGDATABASE $PGDATABASE
ENV PGPORT $PGPORT
ENV DATABASE_URL $DATABASE_URL
WORKDIR '/app'
COPY ./package.json ./
RUN npm install
COPY ./ ./

我希望已安装的软件包及其命令在 docker 容器中可用。在某些时候他们工作了,我不知道配置中的什么变化导致了这个问题。

我不希望你们提供复制/粘贴解决方案,但我希望你们能指出正确的方向,以正确找到问题的根源。

【问题讨论】:

***.com/questions/39404922/… @LinPy 谢谢,我已经阅读了几十个这样的线程,但它们似乎并没有解决我遇到的问题。如前所述:它在运行 docker-compose 时确实有效,只是在我通过 Gitlab CI 运行程序执行时无效。 调试的第一步应该是删除docker-compose.yml 中的volumes:。他们隐藏图像中的所有内容并将其替换为您在本地系统上的内容(包括永远不会更新的node_modules 的副本),因此您的“它在我的本地环境中构建良好”的设置很可能与Dockerfile 构建了什么。 @DavidMaze 它在我的本地机器上使用 docker-compose 工作,它仍然使用卷设置。无论如何,我在没有设置音量的情况下尝试了一下,问题仍然存在。 【参考方案1】:

问题是我从NODE_ENV: development 切换到NODE_ENV: production。启用生产后,我的 package.json 中的 devDependencies 不再被安装(duh me)。

我在常规 dependencies 中添加了 typescript 和 webpack,现在它又像魅力一样工作了。

【讨论】:

你拯救了我的一天。

以上是关于使用 Gitlab CI docker-in-docker 时如何修复 docker 容器中的“sh: tsc not found”错误的主要内容,如果未能解决你的问题,请参考以下文章

GitLab CI/CD 的使用

使用 GitLab + Jenkins 实现持续集成(CI)环境

关于gitlab ci在include中使用变量

如何使用 gitlab-ci 作业推送到 gitlab 存储库?

gitlab CI + jenkins 实践

dotnet 使用 gitlab-ci 发布傻瓜