我知道不建议在Docker容器上使用Systemd,但是有可能吗?
我在使用Ansible部署的Ubuntu 18.04云虚拟机上具有暂存/生产环境;
我当前的开发环境是Ubuntu 18.04 Vagrantfile
,它使用相同的Ansible playbook.yml
的暂存/生产
现在,我正在尝试用Vagrantfile
替换Dockerfile
进行开发,但是在应用systemd模块时Ansible playbook.yml
失败了。我也想在自己的开发环境中使用systemd
,以便可以在自己的playbook.yml
本地上测试更改。知道我该怎么做吗?
如果我尝试使用Dockerfile
和playbook.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
答案 0 :(得分:3)
这是应该使用docker-systemctl-replacement脚本的完美示例。
已被开发为允许ansible脚本同时针对虚拟机和docker容器。您无需启用真实的systemd,只需在否则受systemd控制的操作系统中覆盖/ usr / bin / systemctl。这样,docker容器将对ansible足够好看,而我更习惯于使用常规的“ service:”模块,而不是特定的“ systemd:”模块。
答案 1 :(得分:1)
如果可以选择的话,您也可以从已经启用this one available for ubuntu 18.04和see also here.的systemd
和https://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