CentOS 与 Docker 上的 Systemd

Posted

技术标签:

【中文标题】CentOS 与 Docker 上的 Systemd【英文标题】:CentOS with Systemd on Docker 【发布时间】:2017-07-05 22:12:19 【问题描述】:

我实际上正在使用 Gitlab-CI 对我的剧本进行自动化测试,Ubuntu 运行良好,没有遇到任何问题。

实际上我遇到的问题是 CentOS 和 Systemd,首先是 Playbook(在 CentOS7 中安装 Postgres 9.5):

- name: Ensure PostgreSQL is running
  service:
    name: postgresql-9.5
    state: restarted
  ignore_errors: true   
  when:
    - ansible_os_family == 'RedHat'

所以,如果我想在容器内启动 postgres,这就是我得到的:

Failed to get D-Bus connection: Operation not permitted\nFailed to get D-Bus connection: Operation not permitted\nFailed to get D-Bus connection: Operation not permitted\nFailed to get D-Bus connection: Operation not permitted\nFailed to get D-Bus connection: Operation not permitted\n

我已经必须在特权模式下运行容器,使用 c-groups 和其他任何东西。已经尝试过不同的 Docker 容器,但没有任何效果。

【问题讨论】:

【参考方案1】:

使用 docker 时,我认为最好使用 postgres 来启动服务器。

之类的命令
postgres -D /opt/postgresql/data/ > /var/log/postgresql/pg_server.log 2>&1 &

【讨论】:

【参考方案2】:

当你使用 docker 时,你没有一个功能齐全的 systemd。

您可以使用@KJocker 建议的解决方案来制作postgresql 功能容器。或者,您可以将 systemd 配置为在容器内工作,这是一个文档 check

【讨论】:

在我启动了我的 docker-systemctl-replacement 脚本之后,我很幸运,我不必再经历启动 systemd 守护进程的麻烦了;)【参考方案3】:

在 Docker 容器上使用 Ansible 时,我也遇到了同样的问题。我为此编写了 docker-systemctl-replacement。它适用于 PostgreSQL - 无需更改 Ansible 脚本,它可以在真机上进行部署。

【讨论】:

【参考方案4】:

编辑你的 gitlab runner 实例的 conf /etc/gitlab-runner/config.toml

发件人:

[runners.docker]
    privileged = false
    volumes = ["/cache"]

收件人:

[runners.docker]
    privileged = true
    volumes = ["/sys/fs/cgroup:/sys/fs/cgroup:ro", "/cache"]

添加:

[runners.docker.tmpfs]
    "/run" = "rw"
    "/tmp" = "rw"
[runners.docker.services_tmpfs]
    "/run" = "rw"
    "/tmp" = "rw"

重启 gitlab-runner。

在您的 docker 镜像上,编辑 getty tty1 服务以允许在 systemd 启动后自动登录用户 root

sed -e 's|/sbin/agetty |/sbin/agetty -a root |g' -i /etc/systemd/system/getty.target.wants/getty\@tty1.service 

.gitlab-ci.yml 的镜像名称部分使用该 docker 镜像并添加以下内容以启动 systemd。不要编辑入口点

  script: 
    - /lib/systemd/systemd --system --log-target=kmsg &
    - sleep 5
    - systemctl start postgresql-9.5

【讨论】:

以上是关于CentOS 与 Docker 上的 Systemd的主要内容,如果未能解决你的问题,请参考以下文章

Docker阿里云镜像加速器 for CentOS 7

Podman 执行参数与命令

centos7 安装docker私有仓库

Centos7中docker开启远程访问

Centos系统修改docker默认网络参数

Centos 7: 改变docker的image存放目录