dockersystemdcoreosetcdfleet

Docker Container won't start with systemctl


I have just started checking out coreos

I have tried to setup redis and mysql docker instances, but with little succcess.

I initially expected everything to work on start up out of the box, but it appeared not to be the case.

So based on this documentation on systemd on the coreos site, I decided to try this to start my docker instace

cd /etc/systemd/system

sudo systemctl enable redis.service
$ sudo systemctl start redis.service

This did not work.

I used docker events to track its initialisation

docker event &

I am not sure what I am probably missed out..

Here is my cloud config file

#cloud-config
hostname: user1
# include one or more SSH public keys
ssh_authorized_keys:
  - ssh-rsa....
users:
  - name: user2
    passwd: temp123
    groups:
      - sudo
      - docker
    ssh-authorized-keys:
      - ssh-rsa....
coreos:
  etcd2:
    #generate a new token for each unique cluster from https://discovery.etcd.io/new?size=#{number_instances}
    discovery: https://discovery.etcd.io/fdadfadjskd546887878kfksdjfds
    # multi-region and multi-cloud deployments need to use 1.1.1.1
    advertise-client-urls: http://1.1.1.1:2379
    initial-advertise-peer-urls: http://2.2.2.2:2380
    # listen on both the official ports and the legacy ports
    # legacy ports can be omitted if your application doesn't depend on them
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    listen-peer-urls: http://2.2.2.2:2380,http://2.2.2.2:7001
  fleet:
    public-ip: 1.1.1.1
  flannel:
    interface: 3.3.3.51/23
  units:
    - name: systemd-networkd
      command: stop
    - name: 00-static.network
      runtime: true
      content:   "[Match]\n\
        Name=ens19\n\
        [Network]\n\
        Address=3.3.3.3/23\n\
        Gateway=3.3.3.255\n\
        DNS=8.8.8.8\n\
        DNS=8.8.4.4  \n"
    - name: systemd-networkd
      command: start
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start
    - name: redis.service
      command: start
      enable: true
      content: "[Unit]\n\
        Description=Redis Server Docker Container\n\
        After=docker.service\n\
        Requires=docker.service\n\
        [Service]\n\
        TimeoutStartSec=0 \n\
        EnvironmentFile=/etc/environment\n\
        ExecStartPre=-/usr/bin/docker kill %p\n\
        ExecStartPre=-/usr/bin/docker rm %p\n\
        ExecStartPre=/usr/bin/docker pull redis:latest \n\
        ExecStart=/usr/bin/docker run --name=redis --detach=true --publish=6379:6379 redis \n\
        ExecStop=/usr/bin/docker stop redis \n\
        [Install] \n\
        WantedBy=multi-user.target \n"
    - name: mysql.service
      command: start
      enable: true
      content: "[Unit]\n\
        Description=MySQL Server Docker Container\n\
        After=docker.service\n\
        Requires=docker.service\n\
        [Service]\n\
        TimeoutStartSec=0 \n\
        EnvironmentFile=/etc/environment\n\
        ExecStartPre=-/usr/bin/docker kill %p\n\
        ExecStartPre=-/usr/bin/docker rm %p\n\
        ExecStartPre=/usr/bin/docker pull mysql:latest \n\
        ExecStart=/usr/bin/docker run --name=mysql --env MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} --env MYSQL_USER=${MYSQL_USER} --env MYSQL_PASSWORD=${MYSQL_PASSWORD} --env MYSQL_DATABASE=${MYSQL_DATABASE} --detach --publish 3306:3306 --volume=/path/to/dumps/:/dumps/ mysql\n\
        ExecStop=/usr/bin/docker stop mysql\n\
        [Install] \n\
        WantedBy=multi-user.target \n"
write_files:
  - path: /etc/environment
    permissions: 0644
    content: "\nMYSQL_USER='user1'\n\
      MYSQL_DATABASE='db1'\n\
      MYSQL_CONTAINER_NAME='mysql'\n\
      MYSQL_ROOT_PASSWORD=$(cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 32 | sed 1q) \n"

Solution

  • You are running redis container in detached mode so docker utility starts container and then exits. From systemd point of view this looks like controlled process exited so systemd executes ExecStop script which in your case stops redis container.

    You need to keep process running so systemd won't try to stop or restart your container. One way to achieve this is to remove --detach flag. You can also use KillMode=none so systemd won't send SIGTERM to docker utility but will execute only ExecStop instead.

    [Unit]
    Requires=docker.service
    After=docker.service
    
    [Service]
    TimeoutStartSec=0
    KillMode=none
    Restart=always
    RestartSec=5s
    
    
    ExecStartPre=-/usr/bin/docker kill %p
    ExecStartPre=-/usr/bin/docker rm -v %p
    
    ExecStart=/usr/bin/docker --name=redis --publish=6379:6379 redis
    
    ExecStop=/usr/bin/docker stop %p
    ExecStopPost=-/usr/bin/docker stop %p