Неожиданный экспорт токена с использованием babel в контейнере докеров с монорепозиторием docker-compose и typescript

Последние пару дней я боролся со следующей проблемой и не могу ее отследить. У меня есть монорепозиторий машинописного текста с общим пакетом, который я пытаюсь разработать в докере с помощью docker-compose. Я могу запустить их все прямо с моей локальной машины с помощью yarn, и все загружается нормально. Однако, как только я их докеризую и запускаю с помощью docker-compose, API не запускается с выводом:

/project/node_modules/@project/shared-components/index.ts:1
export * from './src';
^^^^^^
SyntaxError: Unexpected token 'export'

Что мне очень похоже на то, что Babel почему-то терпит неудачу. Файл docker-compose выполняет идентичную команду, которую я использую из своей локальной сети, и использует все те же файлы конфигурации. Я также устанавливаю объем каждого контейнера докеров в рабочую область пряжи, содержащую мои пакеты.

file structure

/project
  /packages
    /api
    /shared-components

command run from workspace root

yarn install
yarn run dev

/project/package.json

...
"workspaces": {
  "packages": [
    "packages/*"
  ]
},
"scripts": {
   ...
   "dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}

/project/docker-compose.yml

version: '3.8'
services:
  api:
    container_name: api
    environment:
      - NODE_ENV=development
    volumes:
      - './:/project'
    build:
      context: '.'
      dockerfile: Dockerfile.dev
    working_dir: /project/packages/api
    entrypoint: ['yarn', 'run', 'dev']
    ports:
      - '3000:3000'

/project/Dockerfile.dev

# configure container
FROM node:14
USER root

/project/packages/api/package.json

...
"scripts": {
    ...
    "dev": "set NODE_ENV=development&& set NEW_RELIC_ENABLED=false&& nodemon -e js,ts,json --exec babel-node --config-file ../../babel.config.json --extensions .ts,.js ./src/index.ts",
}

/project/packages/api/src/index.ts

require('@babel/register')({
  rootMode: 'upward',
  ignore: ['../../node_modules'],
  extensions: ['.js', '.ts'],
});

require('./server');

/project/babel.config.json

{
  "babelrcRoots": ["./packages/*"],
  "presets": [
    "@babel/preset-env",
    "@babel/preset-typescript",
    [
      "minify",
      {
        "builtIns": false,
        "evaluate": false,
        "mangle": false
      }
    ]
  ],
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "regenerator": true,
        "corejs": 3
      }
    ]
  ],
  "ignore": ["**/*.test.ts", "**/*.test.tsx", "**/*.test.js", "**/*.test.jsx"]
}

/package/tsconfig.json

{
  "compilerOptions": {
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "noImplicitAny": false,
    "allowSyntheticDefaultImports": true,
    "noEmit": true,
    "isolatedModules": true,
    "declaration": true,
    "downlevelIteration": true,
    "rootDir": ".",
    "baseUrl": ".",
    "outDir": "./.ts",
    "target": "ES5",
    "module": "ESNext",
    "moduleResolution": "node",
    "paths": {
      "@allido/*": ["./packages/*"]
    }
  },
  "include": ["./.storybook/main.tsx", "./packages/**/*"],
  "exclude": [
    "./node_modules",
    "./.storybook",
    "**/node_modules",
    "**/.next",
    "**/.lib",
    "**/out",
    "**/.ts",
    "**/*.test.ts",
    "**/*.test.js"
  ]
}

В общих компонентах нет ничего особенно важного. Еще одна странная часть этой истории заключается в том, что в той же рабочей области у меня есть веб-приложение nextjs, которое использует тот же пакет shared-components. Он также использует тот же файл babel.config.json, тот же файл tsconfig и отлично работает в докере.

Я думаю, что включил все соответствующие файлы, но, пожалуйста, дайте мне знать, если я пропустил что-то, что было бы важно увидеть. Я действительно сбит с толку тем фактом, что это прекрасно работает из моей локальной сети с идентичными параметрами, но не работает в самом простом из файлов докеров с общим томом.

Я был бы очень признателен за любую помощь или направление о том, как решить эту проблему. В сети почти ничего подходящего не нашел.

Спасибо!


person David Meents    schedule 24.06.2020    source источник
comment
Кажется, что core.js 3 не работает прямо сейчас. /a> к соответствующему ответу   -  person van    schedule 24.06.2020


Ответы (1)


Итак, оказалось, что проблема заключалась в запуске приложений внутри контейнера Linux и присоединении к нему скомпилированных оконных модулей node_modules. Поэтому, чтобы заставить его работать, мне пришлось установить зависимости изнутри контейнера с помощью сценария точки входа и настроить конфигурацию тома, чтобы исключить node_modules с моей локальной машины, но при этом разрешить горячую перезагрузку при изменении файлов src.

/project/docker-compose.yml

version: '3.8'
services:
  api:
    container_name: capi
    environment:
      - NODE_ENV=development
    volumes:
      - './packages/:/project/packages'
      - /project/packages/api/node_modules/
    build:
      context: '.'
      dockerfile: Dockerfile.dev
    working_dir: /project/packages/api
    entrypoint: ['../../entrypoint.dev.sh']
    ports:
      - '3000:3000'

/project/entrypoint.dev.sh

#! /bin/bash
echo "install dependencies..."
yarn --cwd /project install

echo "starting node..."
yarn run dev

/project/Dockerfile.dev

# configure container
FROM node:14
USER root

RUN mkdir /project
RUN chmod -R 777 /project
RUN chown -R  node: /project

COPY ./*.json /project/
COPY ./.infrastructure/entrypoint.dev.sh /project/entrypoint.dev.sh
person David Meents    schedule 24.06.2020