当我尝试使用令牌时,令牌无效或意外 wait-for-it.sh

Invalid or unexpected token when i try to use wait-for-it.sh

提问人:Tai Le 提问时间:11/13/2023 最后编辑:MureinikTai Le 更新时间:11/13/2023 访问量:39

问:

/thuytinh/backend/wait-for-it.sh:2
# Use this script to test if a given TCP host/port are available
^

SyntaxError: Invalid or unexpected token
    at internalCompileFunction (node:internal/vm:73:18)
    at wrapSafe (node:internal/modules/cjs/loader:1178:20)
    at Module._compile (node:internal/modules/cjs/loader:1220:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:86:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.18.2

我的docker compose文件:

version: '3.8'
services:
  database-mysql:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_DATABASE=nhahang
      - MYSQL_ROOT_PASSWORD=12345
    ports:
      - 3306:3306
  backend:
    build: 
      context: ../server
      dockerfile: Dockerfile
    restart: unless-stopped
    environment:
      - DB_PORT=3306
      - DB_HOST=database-mysql
    ports:
      - 8000:8000
    depends_on:
      - database-mysql
    command: ["./wait-for-it.sh", "database-mysql:3306", "--", "node", "dist/main.js"]
  nginx:
    image: nginx:1.23.3
    ports:
      - 80:80
    volumes:
      - ../admin/dist:/var/www/admin/dist
      - ../client/dist:/var/www/client/dist
      - ./default.conf:/etc/nginx/conf.d/default.conf

我在后端的 docker 文件:

FROM node:18-alpine

WORKDIR /thuytinh/backend

COPY package*.json ./

RUN npm install

RUN npm install -g webpack webpack-cli webpack-node-externals

COPY . .

COPY wait-for-it.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/wait-for-it.sh

RUN npm run build
CMD [ "node", "dist/main.js" ]

等待mysql初始化,然后后端会初始化并连接到mysql

JavaScript 节点 .js docker

评论

0赞 Community 11/13/2023
请澄清您的具体问题或提供其他详细信息以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
0赞 CherryDT 11/13/2023
看起来 bash 脚本在节点而不是 bash 中错误地运行。

答:

0赞 David Maze 11/13/2023 #1

在 Dockerfile 中,使脚本的副本可执行。但是,当您在 Compose 文件中覆盖图像的命令时,您会用完当前目录。COPY wait-for-it.sh /usr/local/bin/./wait-for-it.sh

该映像具有一些复杂的行为,如果您给它的命令看起来不是可执行的,它将自动在 下运行它。这旨在支持无需重复解释器名称等用例。如果脚本存在于当前目录中(因此将其包含在映像中)但不可执行,你将看到你描述的行为。nodenodedocker run node index.jsCOPY . .

由于在默认的 Linux 搜索中,最简单的解决方法是将覆盖更改为不包括相对路径,而只包含脚本命令名称/usr/local/bin$PATHcommand:

command: ["wait-for-it.sh", ...]
#         ^^ remove ./ here

评论

0赞 David Maze 11/13/2023
(我还会考虑将其重构为入口点包装脚本,因此您不需要覆盖。command: