use*_*658 9 docker google-cloud-run
我正在做的是在 Dockerfile 中的 RUN 命令中设置 sbcl 和 Quicklisp,然后使用 CMD 加载我的自定义代码。
当我在本地计算机上使用 Docker 运行它时,一切都很好,但是当我将其推送到“google run”时,lisp 代码(使用 CMD 加载)崩溃,因为它找不到 Quicklisp。
据我所知,这是因为 RUN (/root) 和 CMD (/home) 的 HOME 不同。
RUN 和 CMD 中是同一个用户 = uid=0(root) gid=0(root) groups=0(root)
我假设他们(谷歌运行)使用一些 linux 命令来更改用户的“用户上下文”(不知道用于 linux 的正确单词),但不知道他们为什么或如何这样做。因为我不知道他们这样做是什么或为什么,所以很难通过谷歌搜索解决方案。
欢迎大家提出意见。
要查看行为:
Dockerfile:
FROM phusion/baseimage
MAINTAINER Piet Pompies <piet@pompies.com>
RUN echo $HOME
CMD echo $HOME
Run Code Online (Sandbox Code Playgroud)
当您构建 $HOME 时,它将是 /root;当您部署并运行时,它将是 /home
编辑:我找到了解决方法(2020 年 6 月 12 日):
不确定我是否应该将解决方法放在答案中,或者只是像我在这里所做的那样进行编辑。将其保留在编辑中,直到另有通知为止。
解决方法:
您可以在 RUN 命令中转储核心并在 CMD 中使用它或使用 buildapp 来运行 lisp。buildapp 是您在最终版本中想要的。
完整的 woo 和 buildapp 示例
woo.lisp
(defun main (&rest args)
(declare (ignore args))
(woo:run
(lambda (env)
(cond ((equalp (getf env :REQUEST-URI) "/test")
(list 200
(list :content-type "text/plain")
(list (format nil "Hello, World - ~A" (getf env :REQUEST-URI)))))
(t
(list 200
(list :content-type "text/plain")
(list (format nil "~S" env))))))
:address "0.0.0.0"
:port 5000))
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM phusion/baseimage
MAINTAINER Piet Pompies <piet@pompies.com>
RUN apt-get update &&\
apt-get install -y sbcl curl wget rlwrap build-essential time libev-dev screen && \
cd /tmp && \
curl -O https://ufpr.dl.sourceforge.net/project/sbcl/sbcl/2.0.5/sbcl-2.0.5-source.tar.bz2 && \
tar jxvf sbcl-2.0.5-source.tar.bz2 && \
cd /tmp/sbcl-2.0.5 && \
sh ./make.sh && \
sh ./install.sh && \
rm -rf /tmp/sbcl*
RUN cd /tmp && \
wget http://www.xach.com/lisp/buildapp.tgz && \
tar xvf buildapp.tgz && \
cd /tmp/buildapp-1.5.6 && \
make install && \
rm -rf /tmp/buildapp*
RUN mkdir /src/
# install quicklisp (requirements: curl, sbcl)
RUN curl -k -o /tmp/quicklisp.lisp 'https://beta.quicklisp.org/quicklisp.lisp' && \
sbcl --noinform --non-interactive --load /tmp/quicklisp.lisp --eval \
'(quicklisp-quickstart:install :path "~/quicklisp/")' && \
sbcl --noinform --non-interactive --load ~/quicklisp/setup.lisp --eval \
'(ql-util:without-prompting (ql:add-to-init-file))' && \
echo '#+quicklisp(push "/src" ql:*local-project-directories*)' >> ~/.sbclrc && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY woo.lisp /src/woo.lisp
RUN sbcl --no-userinit \
--no-sysinit --non-interactive \
--load ~/quicklisp/setup.lisp \
--eval '(ql:quickload "woo")' \
--eval '(ql:write-asdf-manifest-file "quicklisp-manifest.txt")'
RUN buildapp \
--manifest-file quicklisp-manifest.txt \
--load-system woo \
--load /src/woo.lisp \
--entry main \
--output woo
EXPOSE 5000
CMD sleep 0.05; ./woo
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
804 次 |
最近记录: |