【问题标题】:Dockerfile, how install snap, snapd: unrecognized serviceDockerfile,如何安装 snap,snapd:无法识别的服务
【发布时间】:2020-02-11 14:00:42
【问题描述】:

好吧,我的 Dockerfile 出了点问题,实际上我尝试在几乎所有版本的 Debian 和 Ubuntu 上安装 snapd

当我尝试启动命令时出现此错误

error: cannot communicate with server: Post http://localhost/v2/snaps/rocketchat-server: dial unix /run/snapd.socket: connect: no such file or directory

于是我尝试查看服务是否开启,并没有叫snapd的服务,即使我尝试用systemctl启动systemctl start snapd,还是报错

Failed to connect to bus: No such file or directory

所以我安装了dbus,当我现在重试时出现此错误

Failed to start snapd.service: Launch helper exited with unknown return code 1

我尝试使用 service 或 journalctl 启动服务,结果显示

snapd: unrecognized service

当我列出我的所有服务时,我有这个

 [ - ]  apparmor

 [ - ]  bootmisc.sh

 [ - ]  checkfs.sh

 [ - ]  checkroot-bootclean.sh

 [ - ]  checkroot.sh

 [ + ]  dbus

 [ - ]  hostname.sh

 [ ? ]  hwclock.sh

 [ - ]  killprocs

 [ - ]  mountall-bootclean.sh

 [ - ]  mountall.sh

 [ - ]  mountdevsubfs.sh

 [ - ]  mountkernfs.sh

 [ - ]  mountnfs-bootclean.sh

 [ - ]  mountnfs.sh

 [ ? ]  ondemand

 [ - ]  procps

 [ - ]  rc.local

 [ - ]  sendsigs

 [ + ]  udev

 [ - ]  umountfs

 [ - ]  umountnfs.sh

[ - ]  umountroot

 [ - ]  urandom

FROM ubuntu:16.04

RUN apt-get update && apt-get -y upgrade &&\
    apt-get install -y snap snapd

RUN snap install rocketchat-server
#"error: cannot communicate with server: Post #http://localhost/v2/snaps/rocketchat-server: dial unix #/run/snapd.socket: connect: no such file or directory"

RUN snap --version
#snap    2.40
#snapd   unavailable
#series  -

EXPOSE 3000

ENTRYPOINT Server is running .... && tail -f /dev/null

我知道使用 docker 玩服务不好,但我不知道如何改进我的 Dockerfile,我从 Rocketchat doc debian 开始,然后是 ubuntu,然后是 snap(因为它更容易),以及所有这些我收到了这个错误。

【问题讨论】:

    标签: docker ubuntu service debian dockerfile


    【解决方案1】:

    首先,您不想安装“snap”包,因为它与“snapd”无关。 其次,我偶然发现了在 docker 容器中安装 snapd 的问题: TLDR;目前不支持以这种方式运行 snapd。

    但这个问题已经在 snapcraft 论坛上提出过。 snapd 的依赖项之一是 systemd,如果没有重新启动或重新登录,则 snapd 服务无法正确初始化。根据所有发行版的文档,这是所需的过程,但显然不是 docker 中的选项。

    至少这个开放式问题最能复制您的问题: unable-to-install-snapcraft-snap-in-docker-image-ubuntu-19-10

    Evan at the snapcraft forum here 发布了一个方法,我也无法开始工作。

    唯一可行的方法类似于在 docker 内部运行 docker,即:

    • 在 docker 主机上安装 snapd
    • 在运行时将 snapd-socket 挂载到已安装 snapd 的容器中。

    warnings/side-effects 与运行 docker-in-docker 一样适用。

    【讨论】:

    • 最后一个链接(关于 docker-in-docker)有一个注释说它是在 2020 年 7 月更新的。我不太了解它。有人可以更新这个答案吗?看来原作者跑题了。
    • @DavidKnipe 引用页面中的注释与使 docker-in-docker 工作的各种方法之一有关。在这种情况下可以忽略不计。我的回答提出了 snapd 套接字的绑定安装,这与让 docker-in-docker 工作的方法相同。警告和副作用仍然适用。
    【解决方案2】:

    我也遇到了这个问题,但是能够在 DockerHub 上使用 EFF 的 prebuilt Certbot images

    FROM certbot/certbot:latest(见all tags

    【讨论】:

    • 救命稻草!我将添加我在 GCP 的 chrome-os 中使用的命令
    【解决方案3】:

    我在 GCP 的容器专用操作系统上遇到了类似的问题。 这就是它对我的工作方式(基于 Joseph Lust 的回复):

    开始之前:

    • 确保 DNS 指向您的虚拟机外部 IP
    • 确保任何人都可以访问端口 80
    • 如果容器正在使用端口 80,则停止容器与您的应用程序(certbot 容器将在端口 80 上创建一个 http 服务器)

    运行 certbot 容器:

    sudo docker run -it --rm --name certbot \
                -v "/etc/letsencrypt:/etc/letsencrypt" \
                -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
                -p 80:80 \
                certbot/certbot certonly
    

    选择选项 1,然后输入您的域。 (如果能找到一种自动化的方法就好了……)

    使用已安装的卷启动您的容器:

            -v "/etc/letsencrypt:/etc/letsencrypt" 
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt"
    

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多