提问人:Tai Le 提问时间:11/13/2023 最后编辑:MureinikTai Le 更新时间:11/13/2023 访问量:39
当我尝试使用令牌时,令牌无效或意外 wait-for-it.sh
Invalid or unexpected token when i try to use wait-for-it.sh
问:
/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
答:
0赞
David Maze
11/13/2023
#1
在 Dockerfile 中,使脚本的副本可执行。但是,当您在 Compose 文件中覆盖图像的命令时,您会用完当前目录。COPY wait-for-it.sh /usr/local/bin/
./wait-for-it.sh
该映像具有一些复杂的行为,如果您给它的命令看起来不是可执行的,它将自动在 下运行它。这旨在支持无需重复解释器名称等用例。如果脚本存在于当前目录中(因此将其包含在映像中)但不可执行,你将看到你描述的行为。node
node
docker run node index.js
COPY . .
由于在默认的 Linux 搜索中,最简单的解决方法是将覆盖更改为不包括相对路径,而只包含脚本命令名称/usr/local/bin
$PATH
command:
command: ["wait-for-it.sh", ...]
# ^^ remove ./ here
评论
0赞
David Maze
11/13/2023
(我还会考虑将其重构为入口点包装脚本,因此您不需要覆盖。command:
评论