如何使用 Ubuntu18.04 在 Dockerfile 上启用 systemd

vme*_*zes 3 ubuntu systemd docker

我知道在 Docker 容器上不推荐 Systemd,但有可能吗?

我在使用 Ansible 部署的 Ubuntu 18.04 云虚拟机上有临时/生产环境;

我当前的开发环境是 Ubuntu 18.04 Vagrantfile,它使用与playbook.ymlstaging/prod相同的 Ansible

现在我正在尝试VagrantfileDockerfilefor development替换 ,但是playbook.yml在应用 systemd 模块时Ansible失败。我也想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
Run Code Online (Sandbox Code Playgroud)

样品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
Run Code Online (Sandbox Code Playgroud)

样品inventory

docker-dev ansible_host=localhost ansible_connection=local
Run Code Online (Sandbox Code Playgroud)

Gui*_*eim 6

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

它的开发允许 ansible 脚本同时针对虚拟机和 docker 容器。您不需要启用真正的 systemd,只需在其他受 systemd 控制的操作系统中覆盖 /usr/bin/systemctl 即可。然后 docker 容器对于 ansible 来说看起来已经足够好了,而我更习惯于使用通用的 'service:' 模块而不是特定的 'systemd:' 模块。

  • 建议的`docker-systemctl-replacement` 工作得很好!我所要做的就是从那个 repo 下载 `systemctl3.py` 并将它添加到我的 Dockerfile 中作为 `COPY deploy/environments/dev-docker/files/systemctl3.py /usr/bin/systemctl` 和 `RUN test - L /bin/systemctl || ln -sf /usr/bin/systemctl /bin/systemctl` (2认同)