har*_*ryz 65 shell containers docker
[Updated1]我有一个shell会在某些函数中更改TCP内核参数,但现在我需要让这个shell在Docker容器中运行,这意味着shell需要知道它在容器内运行并停止配置内核.
现在我不知道如何实现,这里是/proc/self/cgroup容器内部的内容:
9:hugetlb:/
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/
我可以使用上面的任何标志来确定此进程是否在容器内运行?
[Updated2]:我还注意到确定进程是否在lxc/Docker中运行,但在这种情况下似乎不起作用/proc/1/cgroup,我的容器中的内容是:
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/
没有/ lxc/containerid
at0*_*t0S 86
Docker 在容器的目录树顶部创建.dockerenv和.dockerinit
这样的事情应该有效.
#!/bin/bash
if [ -f /.dockerenv ]; then
    echo "I'm inside matrix ;(";
else
    echo "I'm living in real world!";
fi
Tho*_*rig 54
如果您在Docker容器内部,则要检查Docker容器内部是否可以通过/proc/1/cgroup.正如这篇文章建议你可以做到以下几点:
在docker容器之外的所有条目都在/proc/1/cgroup最后,/如下所示:
vagrant@ubuntu-13:~$ cat /proc/1/cgroup
11:name=systemd:/
10:hugetlb:/
9:perf_event:/
8:blkio:/
7:freezer:/
6:devices:/
5:memory:/
4:cpuacct:/
3:cpu:/
2:cpuset:/
在Docker容器内部,一些控制组将属于Docker(或LXC):
vagrant@ubuntu-13:~$ docker run busybox cat /proc/1/cgroup
11:name=systemd:/
10:hugetlb:/
9:perf_event:/
8:blkio:/
7:freezer:/
6:devices:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c2
5:memory:/
4:cpuacct:/
3:cpu:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c2
2:cpuset:/
小智 21
我们使用proc的sched(/ proc/$ PID/sched)来提取进程的PID.容器内的进程的PID将与主机上的PID(非容器系统)不同.
例如,容器上的/ proc/1/sched输出将返回:
root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)
在非容器主机上:
$ cat /proc/1/sched  | head -n 1
init (1, #threads: 1)
这有助于区分您是否在容器中.你可以这样做:
if [[ ! $(cat /proc/1/sched | head -n 1 | grep init) ]]; then {
    echo in docker
} else {
    echo not in docker
} fi
Hen*_*eld 17
托马斯的代码解决方案:
running_in_docker() {
  (awk -F/ '$2 == "docker"' /proc/self/cgroup | read non_empty_input)
}
注意
在read与一个虚拟变量是一个简单的成语,这是否产生任何输出?.它是一种紧凑的方法,用于转换可能冗长grep或模式awk的测试.
小智 8
对我有用的是检查“/”的 inode 编号。在 docker 内部,这是一个非常高的数字。在码头外,它是一个非常低的数字,如“2”。我认为这种方法也取决于所使用的文件系统。
例子
# ls -ali / | sed '2!d' |awk {'print $1'}
1565265
$ ls -ali / | sed '2!d' |awk {'print $1'}
2
在脚本中:
#!/bin/bash
INODE_NUM=`ls -ali / | sed '2!d' |awk {'print $1'}`
if [ $INODE_NUM == '2' ];
then
        echo "Outside the docker"
else
        echo "Inside the docker"
fi
为了我的钱,我更喜欢在 docker 镜像中设置一个环境变量,然后应用程序可以检测到它。
例如,这是演示Dockerfile配置的开始:
FROM node:12.20.1 as base
ENV DOCKER_RUNNING=true
RUN yarn install --production
RUN yarn build
第二行设置了一个名为的 envar DOCKER_RUNNING,然后很容易检测到。问题在于,在多阶段构建中,ENV每次FROM离开外部图像时都必须重复该行。例如,您可以看到 I FROMoff of node:12.20.1,其中包含许多额外的内容(例如 git)。后来在我的Dockerfile我然后COPY事情转移到一个基于 的新图像node:12.20.1-slim,它要小得多:
FROM node:12.20.1-slim as server
ENV DOCKER_RUNNING=true
EXPOSE 3000
COPY --from=base /build /build
CMD ["node", "server.js"]
即使这个图像目标server在同一个 中Dockerfile,它也需要重新定义 ENV 变量,因为它有一个不同的基础图像。
如果您使用 Docker-Compose,您可以轻松地在那里定义一个 envar。例如,您的docker-compose.yml文件可能如下所示:
version: "3.8"
services:
  nodeserver:
    image: michaeloryl/stackdemo
    environment:
      - NODE_ENV=production
      - DOCKER_RUNNING=true
| 归档时间: | 
 | 
| 查看次数: | 46071 次 | 
| 最近记录: |