标签: docker

docker scrap 容器如何在没有 shell 的情况下运行我的应用程序?

基于该scratch镜像的 docker 容器缺少 shell。

那么它如何运行我放入其中的二进制文件呢?

linux docker

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

在 Debian 上安装 Nodejs 时出错

我正在尝试在 Debian Docker 容器上安装 Node(特别是基于 nginx 映像)。我检查了正确的安装脚本以从 nodesource 获取 6.x 版,但是一旦将签名密钥添加到密钥环,过程的 curl 部分就会出错。我对这种级别的服务器设置并不是特别有经验,并且以某种方式搜索我的错误并没有给我任何好的线索。

在 apt-get 更新和升级,并安装 sudo 和 curl 之后,我正在尝试执行以下操作:

sudo curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
Run Code Online (Sandbox Code Playgroud)

并最终总是打这个:

## Adding the NodeSource signing key to your keyring...

+ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
(23) Failed writing body
Error executing command, exiting
Run Code Online (Sandbox Code Playgroud)

这些程序中哪些是首选版本?我假设这些是同一事物的升级或变体。我不记得在尝试以这种方式安装节点时在其他系统上遇到过这个错误。不同版本的 Debian 会gnupg以可接受的方式安装 …

debian node.js docker

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

shell中的动态变量

我有一个以下脚本,它将从用户那里获取输入(源路径),并将在 docker 容器内附加卷

echo -n "Enter the source path: "

read path

docker run -v $path:/opt/$path/ fedora
Run Code Online (Sandbox Code Playgroud)

问题是,我想创建一个循环,以便用户可以提供多个源路径,并且可以将其附加到 docker 容器。

例如

docker run -v $path1:/opt/$path1 -v $path2:/opt/$path2
Run Code Online (Sandbox Code Playgroud)

等等,这些$path变量的数量取决于用户输入。

shell shell-script variable-substitution docker

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

当我看到一堆进程的 `write:broken pipe` 错误是什么意思?

当我看到一个write: broken pipe流程的一堆错误时,这意味着什么?

level=error msg="attach: stdout: write unix /var/run/docker.sock->@: write: broken pipe"

这是否意味着这个进程需要更多的文件描述符?或任何其他资源?我应该怎么看?

linux socket docker

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

如何在 Linux 容器内替换 /bin 中的二进制文件

我想做一些奇怪的容器,我的任务之一是替换uname二进制文件。
我编码它:

#include <stdio.h>
int main() {
   printf("This is a fake uname\n");
   return 0;
}  
Run Code Online (Sandbox Code Playgroud)

编译它:

gcc uname.c -o uname
Run Code Online (Sandbox Code Playgroud)

当我在我的 ubuntu 上运行它时它工作正常。

我创建了一个Dockerfile并将其复制到图像中:

cat > Dockerfile <<EOF
FROM alpine:latest
RUN rm /bin/uname
COPY uname /bin/
ENTRYPOINT sh;
WORKDIR /home
EOF  
Run Code Online (Sandbox Code Playgroud)

并建造它 docker build -t myimage -f Dockerfile .

当我运行图像时:

docker run -it --rm myimage  
Run Code Online (Sandbox Code Playgroud)

该文件存在,但是当我尝试运行它时,它写入它不存在:

/home # uname
sh: uname: not found
/home # ls -lia uname
ls: uname: No such file or directory
/home …
Run Code Online (Sandbox Code Playgroud)

container docker

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

如何检索已在 Docker 映像中添加然后删除的文件?

假设你有一个这样的工作目录:

$ tree .
.
??? Dockerfile
??? file.txt
Run Code Online (Sandbox Code Playgroud)

并且Dockerfile包含:

FROM debian:9

WORKDIR /usr/src/foo

COPY file.txt .

RUN echo Some random command involving file.txt \
  && rm -f file.txt
Run Code Online (Sandbox Code Playgroud)

然后构建相应的镜像并将其推送到给定的 Docker 注册表:

$ docker build -t foo/bar .
$ docker login #…
$ docker push foo/bar
Run Code Online (Sandbox Code Playgroud)

有没有一种方法(或几种方法)从图像中检索file.txt,添加内容然后在中间层中删除?答案是否取决于 的选择WORKDIR

docker

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

Docker 如何运行 GUI?

我编写了一些 Java 桌面应用程序,并认为我可以使用 Docker 运行它们来了解容器。

我将 Java 应用程序放入带有 ubuntu 映像的 Docker 容器中。就在那时,我意识到我需要让 Docker 能够访问我的 DISPLAY 变量,以便 GUI 能够工作/访问我的计算机的 I/O。连接后,我可以运行 docker 容器并在计算机屏幕上看到 GUI 弹出。

这就是我开始感到困惑的地方。如果我在 VirtualBox 中运行桌面 GUI,我可以在虚拟机中看到 GUI;它在虚拟计算机上。然后有一些智能设备可以将虚拟机 I/O 连接到本地计算机的 I/O。这对我来说很有意义。

但是 Docker 如何将 GUI 返回到我的实际计算机上呢?当我运行容器时,我可以在我的实际计算机上看到 GUI(而不是在像 virtualbox 这样的虚拟机中)。但是 GUI 本身如何在主机上呈现呢?当我与主机共享 I/O 时,Docker 是否有权将 GUI 文件发送回主机以显示 GUI?或者当我使用 ubuntu 映像创建容器时,我基本上创建了一个虚拟机吗?

virtual-machine gui container docker

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

为什么 CentOS Docker 容器说它是 Ubuntu?

我正在尝试验证为我的 Ubuntu 选择 Docker 容器映像文件时,我需要在它们之间匹配什么?

在 Lubuntu 上,一个 CentOS 容器说它是 CentOS,由

$ sudo docker run centos bash -c "cat /etc/*-release "
CentOS Linux release 7.6.1810 (Core) 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.6.1810 (Core) 
CentOS Linux release 7.6.1810 (Core) 
Run Code Online (Sandbox Code Playgroud)

但也说它与主机是相同的 Ubuntu:

$ sudo docker run centos bash -c "cat /proc/version"
Linux version 4.15.0-46-generic (buildd@lgw01-amd64-038) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #49-Ubuntu SMP Wed …
Run Code Online (Sandbox Code Playgroud)

kernel version proc docker

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

docker-compose.yaml 中“等待 $${!}”的含义?

我正在用letsencrypt和nginx做一些docker。在我遵循的教程中,有一个用于 certbot 容器的命令,它允许每 12 小时检查一次证书的有效性。

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'
Run Code Online (Sandbox Code Playgroud)

我做 bash 已经有一段时间了,但wait $${!}直到今天我还从未见过这样的事情?是什么$${!}意思?

编辑: 该命令是 docker-compose.yaml 的一部分,所以完整的命令是:

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

shell quoting docker yaml

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

在 docker 镜像中查找内核版本

我正在使用 docker 映像并尝试查看安装了哪些软件包。具体是哪些内核包。

执行此命令我得到以下内核包

rpm -qa kernel*
kernel-devel-2.6.32-754.6.3.el6.i686
kernel-headers-2.6.32-754.17.1.el6.centos.plus.i686
Run Code Online (Sandbox Code Playgroud)

但它丢失了...我如何找到验证特定内核正在运行。

kernel-2.6.32-754.3.5.el6.i686.rpm
Run Code Online (Sandbox Code Playgroud)

据我了解,docker 镜像使用本机操作系统内核来执行命令。但我试图确认这是 kernel-2.6.32-754.3.5.el6.i686.rpm。文档状态正在运行。

谢谢

kernel centos docker

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