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



好吧,我的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的服务,即使我尝试从systemctlsystemctl 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

我尝试使用服务或日志启动服务,它显示

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

埃文在Snapcraft论坛上发布了一个方法,我也无法开始工作。

唯一可能有效的方法类似于在 docker 中运行 docker,即:

  • 在 Docker 主机上安装 Snapd
  • 运行时将快照套接字装载到已安装快照的容器中。

但是相同的警告/副作用适用于在码头坞中运行 docker。

我也遇到了这个问题,但是能够在DockerHub上使用EFF的预构建的Certbot映像

FROM certbot/certbot:latest(查看所有标签(

我在 GCP 的容器专用操作系统上遇到了类似的问题。 这就是它对我的工作方式(基于约瑟夫·卢斯特的回复(:

开始之前:

  • 确保 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

选择选项 1,然后输入您的域。(找到一种方法来自动化这一点会很好...

使用挂载的卷启动容器:

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

如果您使用的是 WSL2,您可以通过在/etc/wsl.conf中添加以下行来解决此问题:

[boot]
systemd=true

不要忘记使用 PowerShell 重新启动 WSL:

wsl.exe --shutdown
wsl.exe

最新更新