我知道不建议在Docker容器上使用Systemd,但是有可能吗?

我在使用Ansible部署的Ubuntu 18.04云虚拟机上具有暂存/产品环境;

我当前的开发环境是Ubuntu 18.04 Vagrantfile,它使用相同的分期/生产的Ansible playbook.yml
现在,我尝试用Vagrantfile替换Dockerfile进行开发,但是在应用系统模块时Ansible playbook.yml失败。我也希望在我的开发环境中也有systemd,以便可以在本地playbook.yml上测试更改。知道我该怎么做吗?

如果我尝试使用Dockerfileplaybook.yml进行如下构建,则会收到错误Failed to find required executable systemctl in paths

如果我将RUN apt-get install systemd添加到Dockerfile并尝试构建,则会收到错误System has not been booted with systemd as init system
样本Dockerfile:

FROM ubuntu:18.04

ADD . /app
WORKDIR /app

# Install Python3 pip used to install Ansible
RUN apt-get update && apt-get install -y \
  python3-pip \

# Install Ansible
RUN pip3 install --trusted-host pypi.python.org ansible
RUN ansible-playbook playbook.yml -i inventory

EXPOSE 80

样本playbook.yml:
---
- name: Ansible playbook to setup dev environment
  hosts: all
  vars:
    ansible_python_interpreter: "/usr/bin/python3"
    debug: True
  become: yes
  become_method: sudo
  tasks:
    - name: Copy App Gunicorn systemd config
      template:
        src: app_gunicorn.service
        dest: /etc/systemd/system/

    - name: Enable App Gunicorn on systemd
      systemd: state=started name=app_gunicorn

样本inventory:
docker-dev ansible_host=localhost ansible_connection=local

最佳答案

这是应使用docker-systemctl-replacement脚本的完美示例。

它被开发为允许ansible脚本同时针对虚拟机和docker容器。您不需要启用真实的systemd,只需在否则受systemd控制的操作系统中覆盖/ usr / bin / systemctl。然后,docker容器将对ansible足够好看,而我更习惯于使用常规的“service:”模块,而不是特定的“systemd:”模块。

10-08 08:10
查看更多