“google cloud run”将 HOME 更改为 CMD 的 /home,其中 RUN 使用 /root

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)