Tôi đã cố gắng khắc phục sự cố này trong bộ chứa Dock của CentOS: 7. Tôi đã theo dõi chủ yếu Hướng dẫn về dự án hình ảnh Dock của CentOS .
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
# Install anything. The service you want to start must be a SystemD service.
CMD ["/usr/sbin/init"]
Bây giờ, xây dựng hình ảnh và chạy nó bằng cách sử dụng ít nhất các đối số sau đây để ra docker run
lệnh:-v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro
Sau đó, điểm chính là /usr/sbin/init
phải là quá trình đầu tiên bên trong container Docker.
Vì vậy, nếu bạn muốn sử dụng một tập lệnh tùy chỉnh thực thi một số lệnh trước khi chạy /usr/sbin/init
, hãy khởi chạy nó ở cuối tập lệnh của bạn bằng cách sử dụng exec /usr/sbin/init
(trong tập lệnh bash).
Đây là một ví dụ:
ADD cmd.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/cmd.sh
CMD ["/usr/local/bin/cmd.sh"]
Và đây là nội dung của cmd.sh
:
#!/bin/bash
# Do some stuffs
exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8
Bạn có thể có System is booting up. See pam_nologin(8)
nếu bạn sử dụng hệ thống PAM, trong trường hợp đó, hãy xóa /usr/lib/tmpfiles.d/systemd-nologin.conf
trong Dockerfile
vì bạn tạo tệp /var/run/nologin
tạo ra lỗi cụ thể này.
sudo
?