Typescript 意外标记“;“出口”;在docker容器中使用babel和docker compose并键入脚本monorepo

Typescript 意外标记“;“出口”;在docker容器中使用babel和docker compose并键入脚本monorepo,typescript,docker-compose,babeljs,monorepo,yarn-workspaces,Typescript,Docker Compose,Babeljs,Monorepo,Yarn Workspaces,在过去的几天里,我一直在努力解决以下问题,似乎无法找到答案。我有一个带有共享包的类型脚本monorepo,我正试图使用docker compose在docker中开发它。我可以用纱线直接从本地机器上运行它们,一切都可以正常启动。但是,一旦我使用docker compose对它们进行docker化并使它们旋转起来,api就无法启动输出: /project/node_modules/@project/shared-components/index.ts:1 export * from './src'

在过去的几天里,我一直在努力解决以下问题,似乎无法找到答案。我有一个带有共享包的类型脚本monorepo,我正试图使用docker compose在docker中开发它。我可以用纱线直接从本地机器上运行它们,一切都可以正常启动。但是,一旦我使用docker compose对它们进行docker化并使它们旋转起来,api就无法启动输出:

/project/node_modules/@project/shared-components/index.ts:1
export * from './src';
^^^^^^
SyntaxError: Unexpected token 'export'
在我看来,巴贝尔不知何故失败了。docker compose文件执行我在本地使用的相同命令,并共享所有相同的配置文件。我还将每个docker容器的体积设置为包含我的包的工作区

文件结构

/project
  /packages
    /api
    /shared-components
从工作区根目录运行命令

yarn install
yarn run dev
/project/package.json

...
"workspaces": {
  "packages": [
    "packages/*"
  ]
},
"scripts": {
   ...
   "dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"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",
}
{
  "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"]
}
{
  "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"
  ]
}
/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'
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/Dockerfile.dev

# configure container
FROM node:14
USER root
# 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
/project/packages/api/package.json

...
"workspaces": {
  "packages": [
    "packages/*"
  ]
},
"scripts": {
   ...
   "dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"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",
}
{
  "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"]
}
{
  "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"
  ]
}
/project/packages/api/src/index.ts

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

require('./server');
/project/babel.config.json

...
"workspaces": {
  "packages": [
    "packages/*"
  ]
},
"scripts": {
   ...
   "dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"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",
}
{
  "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"]
}
{
  "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"
  ]
}
/package/tsconfig.json

...
"workspaces": {
  "packages": [
    "packages/*"
  ]
},
"scripts": {
   ...
   "dev": "docker-compose build --parallel && docker-compose up --remove-orphans -d"
}
...
"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",
}
{
  "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"]
}
{
  "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 web应用程序,它共享相同的
共享组件
包。它还共享相同的babel.config.json和相同的tsconfig文件,并且在docker中运行良好

我想我已经包括了所有相关的文件,但是如果我遗漏了任何重要的内容,请告诉我。我真的很困惑于这样一个事实:在本地使用相同的参数时,这种方法可以很好地工作,但在使用共享卷的最简单的DockerFile中却失败了

我真的非常感谢任何关于如何解决这个问题的帮助或指导。我在网上几乎找不到任何相关信息


谢谢

因此,问题在于在linux容器中运行应用程序,并将windows编译的node_模块附加到其中。因此,为了使其正常工作,我必须使用entrypoint脚本从容器内部安装依赖项,并调整卷配置以省略本地计算机中的node_模块,但仍然允许在src文件更改时进行热重新加载

/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'
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
# 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

看来core.js 3现在还没有解决这个问题。。答