我有一个容器节点:18-alpine3.14作为基本图像。我有docker-compose文件与
command: ["prepare_config.sh","--","npm", "run", "start-p"]
in prepare config
#!/bin/bash
json_data=$(cat <<EOF
{
"url": "$URL"
}
EOF
)
echo "$json_data";
当我尝试运行这段代码时,我得到错误
prepare_config.sh:2
json_data=$(cat <<EOF
^^^
SyntaxError: missing ) after argument list
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1033:15)
at Module._compile (node:internal/modules/cjs/loader:1069:27)
at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Module._load (node:internal/modules/cjs/loader:827:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47
Node.js v18.1.0
你能帮忙解决这个问题吗?
快速修复(docker-compose)。yml相关)
看起来您的脚本不是由/bin/bash
运行,而是由节点("entrypoint">
要处理您的用例,您实际上有两个等效的解决方案:
- "reset entrypoint";并直接使用问题
中的command
→添加docker-compose.yml
服务定义:
myservice:
entrypoint: []
command: ["prepare_config.sh", "--", "npm", "run", "start-p"]
- 设置一个非空的
entrypoint
和command
:
→添加您的docker-compose.yml
服务定义,例如:
myservice:
entrypoint: ["prepare_config.sh", "--"]
command: ["npm", "run", "start-p"]
<<h3>小评论/h3>作为题外话:
解决方案1。允许一个等价的
docker run
命令:docker run --entrypoint="" image-name prepare_config.sh -- npm run start-p
但方案2。没有一个等价的
docker run
命令,给定CLI选项--entrypoint
只能接受一个参数(程序二进制),而不是一个列表…
一个更好的修复(Dockerfile相关)
但是,即使您的图像基于node:18-alpine3.14
,并且带有您想要覆盖的特定ENTRYPOINT
,直接修改您自己的Dockerfile
听起来更好。
通常,你会在这个文件的末尾写:
ENTRYPOINT ["prepare_config.sh", "--"]
CMD ["npm", "run", "start-p"]
如果您已经插入了一个命令来设置入口点的可执行位,例如:
RUN chmod a+x prepare_config.sh
有关ENTRYPOINT
和CMD
的更多详细信息,请参见例如这个其他StackOverflow答案:
CMD和ENTRYPOINT在Dockerfile中的区别是什么?
节点容器中的入口点脚本试图找出传递给它的命令是否应该由节点运行。
检查第一个参数是否为系统命令。您的脚本不是一个系统命令,所以entrypoint脚本决定它应该由节点运行。
要使入口点脚本相信您的命令不应该由节点运行,您可以显式地说您希望它由shell运行,像这样
command: ["/bin/sh", "-c", "prepare_config.sh -- npm run start-p"]
/bin/sh是一个系统命令,因此entrypoint脚本不会尝试让node运行该命令。
另外,请注意Alpine映像通常没有安装bash
,因此您可能必须在脚本中将#!/bin/bash
中的bash
更改为sh
或ash
。
目前只有这个变体可以正常工作
command: ["/bin/sh", "-c", "./prepare_config.sh && npm run start-p"]