Dockerfile,如何安装 snap,snapd:无法识别的服务

Dockerfile, how install snap, snapd: unrecognized service

好吧,我的 Dockerfile 出现了一些问题,实际上我尝试在 Debian 上安装 snapd 并在几乎所有版本中安装 Ubuntu。

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

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 (因为它更容易),并且所有这些我都得到了这个错误。

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

但是这个问题已经在 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.

我 运行 也遇到过这个问题,但是能够在 DockerHub

上使用 EFF prebuilt Certbot images

FROM certbot/certbot:latest(参见all tags

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

开始之前:

  • 确保 DNS 指向您的 VM 外部 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

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

启动您的容器并安装以下卷:

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