在Docker中运行Lua脚本

时间:2016-11-20 20:03:02

标签: docker lua

我无法从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镜像时运行脚本。

3 个答案:

答案 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"]