我无法从Docker镜像中获取Lua脚本。
我有一个非常简单的Lua脚本,我需要将其包含在图像中:
function main(...)
print("hello world")
end
我创建了一个Dockerfile:
FROM debian:latest
RUN apt-get -y update && apt-get -y install lua5.1 lua-socket lua-sec
ADD hello.lua /home/user/bin/hello.lua
CMD ["/bin/sh", "-c", “lua /home/user/bin/hello.lua”]
但是当我尝试运行Docker镜像时出现以下错误:
/bin/sh: 1: [/bin/sh,: not found
有一个很好的解释,为什么我得到这个错误以及如何在运行Docker镜像时运行脚本。
答案 0 :(得分:1)
Dockerfile的最后一行应该是
CMD ["lua", "/home/user/bin/hello.lua"]
请记住,你好hello.lua什么都不打印。 它定义了函数main,但在此示例中从不调用此函数。
它不是Python,当你调用一个lua文件时,Lua会调用主块。 如果要从命令行传递参数:
CMD ["lua", "/home/user/bin/hello.lua", "param1"]
hello.lua:
-- get all passed parameters into table
local params = {...}
-- print first parameters if any
print(params[1])
答案 1 :(得分:1)
你的最终命令在lua命令中有智能引号。这些是无效的json字符:
CMD ["/bin/sh", "-c", “lua /home/user/bin/hello.lua”]
因此,Docker正在尝试执行该字符串并抛出有关缺少[/bin/sh,
的错误。将引号切换为正常引号(并避免使用添加了这些引号的编辑器):
CMD ["/bin/sh", "-c", "lua /home/user/bin/hello.lua"]
正如其他人所提到的,你可以完全跳过shell:
CMD ["lua", "/home/user/bin/hello.lua"]
您的hello.lua主函数将不会被调用,因此您可以将其简化为您想要运行的命令:
print("hello world")
最后,您应该看到类似的内容:
$ cat hello.lua
print("hello world")
$ cat Dockerfile
FROM debian:latest
RUN apt-get -y update && apt-get -y install lua5.1 lua-socket lua-sec
ADD hello.lua /home/user/bin/hello.lua
CMD ["lua", "/home/user/bin/hello.lua"]
$ docker build -t luatest .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM debian:latest
---> 7b0a06c805e8
Step 2 : RUN apt-get -y update && apt-get -y install lua5.1 lua-socket lua-sec
---> Using cache
---> 0634e4608b04
Step 3 : ADD hello.lua /home/user/bin/hello.lua
---> Using cache
---> 35fd4ca7f0f0
Step 4 : CMD /bin/sh -c lua /home/user/bin/hello.lua
---> Using cache
---> 440098465ee4
Successfully built 440098465ee4
$ docker run -it luatest
hello world
答案 2 :(得分:0)
您可以直接在Dockerfile中使用lua
命令作为CMD:
CMD ["lua", "/home/user/bin/hello.lua"]