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

时间:2018-11-19 22:16:00

标签: docker ubuntu systemd

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

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

我当前的开发环境是Ubuntu 18.04 Vagrantfile,它使用相同的Ansible playbook.yml的暂存/生产

现在,我正在尝试用Vagrantfile替换Dockerfile进行开发,但是在应用systemd模块时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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

如果可以选择的话,您也可以从已经启用this one available for ubuntu 18.04see also here.systemdhttps://github.com/gazay/gon的docker映像开始

这是一个示例dockerfile,我们从该图像开始并为我们的应用程序需求安装python3.8:

FROM jrei/systemd-ubuntu


# INSTALL PYTHON
RUN apt-get update -q -y
RUN apt-get install -q -y python3.8 python3-distutils curl libpq-dev build-essential python3.8-dev
RUN rm /usr/bin/python3
RUN ln -s /usr/bin/python3.8 /usr/bin/python3
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
RUN python3.8 get-pip.py
RUN pip3.8 install --upgrade pip
RUN pip3.8 install -q -r requirements.txt

RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 10
ENV PYTHONPATH "${PYTHONPATH}:."

### then setting the app needs and entrypoint