标签: docker

如何在 Wayland 下的容器中运行图形应用程序?

当我使用 X11 桌面时,我可以通过共享$DISPLAY变量和/tmp/X11-unix目录在 docker 容器中运行图形应用程序。例如:

docker run -ti -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix some:ubuntu xclock
Run Code Online (Sandbox Code Playgroud)

现在,我在 Fedora 25 上运行 Wayland,所以没有 X11 基础设施与容器共享。如何在容器中启动图形应用程序,并让它显示在我的桌面上?有什么办法可以绑定 XWayland 吗?

x11 wayland docker

21
推荐指数
1
解决办法
3万
查看次数

Podman 卷安装:何时使用 :z 或 :Z 后缀?

Podman 手册页解释了卷安装/绑定:

\n
\n

像 SELinux 这样的标签系统要求在装载到容器中的卷\n内容上放置适当的标签。如果没有标签,安全系统可能\n会阻止容器内运行的进程使用该内容。默认情况下,Podman 不会更改操作系统设置的标签。

\n

要更改容器上下文中的标签,您可以将两个后缀\n :z:Z之一添加到卷装载。这些后缀告诉 Podman 重新标记共享卷上的文件\n对象。z选项告诉 Podman 两个容器共享卷内容。因此,Podman 使用共享\n内容标签来标记内容。共享卷标签允许所有容器读取/写入内容。\nZ选项告诉 Podman 使用私有非共享标签来标记内容。

\n
\n

然而,故障排除页面用几乎相同的词语解释了同样的事情。

\n

现在,对于 Podman 和 SELinux 相当陌生,想知道我实际上应该在什么时候使用什么?\n我知道,当我收到权限错误时,它们可能是由 SELinux 引起的,所以两个开关之一可以解决这个问题。但这两个选项(小写 z 和大写 Z)有什么区别呢?

\n

它所说的区别是:

\n
    \n
  • :z创建共享内容标签
  • \n
  • :Z创建私人非共享标签
  • \n
\n

这引入了许多新词:

\n
    \n
  • 共享和非共享(这是什么意思?)
  • \n
  • ??? vs private(再次,it\xe2\x80\x99s 不清楚这对我来说意味着什么)
  • \n
  • 它还表示一个选项为 \xe2\x80\x9ccontent label\xe2\x80\x9d ,而另一个选项仅表示 \xe2\x80\x9clabel\xe2\x80\x9d \xe2\x80\x93 这些之间有区别吗两个术语还是相同?
  • \n
\n

那么这些词在这种情况下意味着什么?\n最后一个问题:我什么时候应该使用什么?

\n

selinux container docker podman

21
推荐指数
1
解决办法
2万
查看次数

Docker容器创建的文件归root所有

我有一个 Docker 映像,当发生错误时它会生成类似日志的文件。我已使用绑定安装将其写入的目录安装到我的主机上。但是,创建的文件归root. chown尽管我的用户帐户具有 root 权限,但每次运行容器后chgrp检查文件都非常繁琐。

有没有办法让容器将文件的所有者和组设置为运行容器的用户的所有者和组?

对于某些上下文,这是我创建的一个玩具示例:

Dockerfile

FROM debian

WORKDIR /root
VOLUME /root/output

COPY run.sh /root/

ENTRYPOINT ["./run.sh"]
Run Code Online (Sandbox Code Playgroud)

运行sh

#!/bin/bash

echo hello > output/dump
Run Code Online (Sandbox Code Playgroud)

我的执行命令是

docker run -v $PWD/output:/root/output test
Run Code Online (Sandbox Code Playgroud)

permissions docker

20
推荐指数
2
解决办法
2万
查看次数

如何在 Jenkins 的 Docker 容器中运行构建

我正在尝试使用 Jenkins 在 Docker 容器中构建 C++ 项目。我在 Jenkins 中构建或在 Jenkins 之外的容器中构建都没有问题。

以下是我尝试过的。为清楚起见,我省略了卷映射。

情况1

以下命令在 shell 中成功运行构建。

docker run --rm --interactive=true --tty=true $IMAGE make
Run Code Online (Sandbox Code Playgroud)

但是,当在 Jenkins 中作为“执行 shell”步骤运行时,Docker 会返回以下错误。

cannot enable tty mode on non tty input
Run Code Online (Sandbox Code Playgroud)

案例二

以下命令与前一个命令类似,但禁用交互性。

docker run --rm $IMAGE make
Run Code Online (Sandbox Code Playgroud)

Jenkins 可以成功运行构建。但是,在中止构建时会出现严重的问题。构建会立即标记为中止,但容器会继续运行,直到构建完成。退出后容器也不会被移除。

在 shell 中运行时,命令会成功构建,但无法中断它。退出后容器也会被移除。

有谁知道如何在 Jenkins 的 Docker 容器中干净地运行构建并保留中止构建的能力?

使用任何 Jenkins 插件都不是一种选择,因为 Docker 调用在脚本内部并且无法轻松提取。

tty jenkins pty docker

19
推荐指数
1
解决办法
2万
查看次数

X11 从远程服务器中的 docker 容器转发

我想通过 ssh 进入我的 linux mint 18 服务器(运行 X11)并登录到 docker 容器并将 iPython matplotlib 图转发到本地客户端(也是 mint)。都在局域网内。

我发现的最接近的问题是:https : //stackoverflow.com/questions/25281992/alternatives-to-ssh-x11-forwarding-for-docker-containers

在此之后,我可以-e DISPLAY=$DISPLAY通过传递给docker run命令的选项从 docker 获取绘图 GUI 到本地机器的显示器(即 mint 服务器)。我还可以通过 ssh-X选项连接到服务器以获取xeyes客户端的窗口。

但是,如果我使用-X选项SSH 进入服务器并登录到使用 运行的容器-DISPLAY=localhost or client IP,我仍然无法获得客户端计算机的绘图。

我知道我可以使用 VNC 来解决它。但是,如何正确使用 X11 转发来做到这一点?

ssh x11 docker

19
推荐指数
2
解决办法
4万
查看次数

如何在 Docker 中替换 lsof(本机,而不是基于 LXC)

我对 Docker 容器内部lsof -i不产生任何输出感到有些困惑。

示例(来自容器内部的所有命令/输出):

[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
Run Code Online (Sandbox Code Playgroud)

还请注意如何不显示 PID 或程序名称netstatfuser也给出了一些令人困惑的输出,并且也无法确定 PID。

任何人都可以对此有所了解吗?

  • 我该如何替换lsof -i(还要查看进程名称!)
  • 为什么输出也netstat瘫痪了?

注意:容器使用 运行"ExecDriver": "native-0.1",即 Docker 自己的执行层,而不是 LXC。


[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file …
Run Code Online (Sandbox Code Playgroud)

linux docker libcontainer

18
推荐指数
1
解决办法
1万
查看次数

centos6 中的 locale-gen 命令

在我的裸 centos6.5 系统中,它是一个docker容器,en_US.utf-8缺少语言环境:

bash-4.1# locale -a
C
POSIX
Run Code Online (Sandbox Code Playgroud)

通常在 Ubuntu 中有locale-gen执行此操作的命令:

# locale-gen en_US.UTF-8
# echo 'LANG="en_US.UTF-8"' > /etc/default/locale
Run Code Online (Sandbox Code Playgroud)

我怎么能在centos 6.5中做到这一点?

centos locale docker

17
推荐指数
2
解决办法
5万
查看次数

什么是 cgroupfs 以及它如何与 Docker 一起使用?

在 Docker 文档中讨论了本机 execdriver ( https://docs.docker.com/engine/reference/commandline/daemon/ )的选项。文档说

native.cgroupdriver 选项指定容器的 cgroup 的管理。您可以指定 cgroupfs 或 systemd。如果指定 systemd 并且它不可用,则系统使用 cgroupfs。默认情况下,如果没有指定选项,execdriver 首先尝试 systemd 并回退到 cgroupfs。此示例将 execdriver 设置为 cgroupfs:

我的问题是在这种情况下cgroupfs它是什么以及它如何比较systemd?谷歌搜索信息cgroupfs导致了一条推文

--exec-opt native.cgroupdriver=cgroupfs FTW。认真的@docker,放弃对由 systemd 管理的 cgroup 的支持,这是一场灾难

但我希望有人可以提供更多关于它实际作用的详细信息,而不是仅仅说使用与默认设置不同的设置。

linux docker

17
推荐指数
1
解决办法
1万
查看次数

是否可以通过shell脚本修改yml文件?

这就是我的 docker-compose.yml 的样子。

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
  links:
    - 'anything'
Run Code Online (Sandbox Code Playgroud)

现在我需要通过 shell 脚本(在 ubuntu 服务器上)添加一些内容。我不太确定是否有可能:

  1. 添加新元素到nginx/links,如果它不存在
  2. newthing如果不存在 newthing-block 则追加块

新内容应如下所示:

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
    - '/etc/letsencrypt:/etc/letsencrypt'
  links:
    - 'anything'
    - 'newthing'

newthing:
  container_name: foo
  image: 'newthing:1.2.3'
  restart: always
  hostname: 'example.com'
Run Code Online (Sandbox Code Playgroud)

ubuntu shell-script text-processing docker yaml

17
推荐指数
3
解决办法
5万
查看次数

列出 Docker 容器中的 IP 表

我想iptables在 Ubuntu 16.04 Docker 容器中运行该命令。我创建了一个用户,赋予该用户 root 权限,将它们添加到sudo组中,但我仍然被告知我没有iptables以 root 身份运行。

$ groups
stack root sudo

$ sudo whoami
root

$ sudo iptables --list
iptables v1.6.0: can't initialize iptables table `filter': Permission 
denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
Run Code Online (Sandbox Code Playgroud)

在我的/etc/sudoers文件中,我有一行:%sudo ALL=(ALL:ALL) ALL,我相信它应该允许sudo组中的任何用户(我是)运行任何命令,但我仍然收到权限被拒绝的错误。

我如何iptables以该用户身份成功运行命令?

请注意,我在带有图像的 Docker 容器中执行此操作: ubuntu:16.04

ubuntu permissions iptables docker

17
推荐指数
1
解决办法
3万
查看次数