ComputeEngine에서 CoreOS를 선택하면 시작 스크립트에서 docker가 보이지 않습니다.

개요





Google Compute Engine에서 CoreOS 이미지 (coreos-stable-1298-7-0-v20170401)를 사용하여 인스턴스를 만들면 시작 스크립트에서 docker 명령을 사용할 수 없다고 생각합니다.
Apr 21 12:20:59 xxx.internal rkt[1110]: + /usr/bin/google_metadata_script_runner --script-type startup
Apr 21 12:20:59 xxx.internal startup-script[1361]: INFO Starting startup scripts.
Apr 21 12:20:59 xxx.internal startup-script[1361]: INFO Found startup-script in metadata.
Apr 21 12:20:59 xxx.internal startup-script[1361]: INFO startup-script: /tmp/startup-qconLt/tmpI9QQlX: line 29: /usr/bin/docker: No such file or directory
Apr 21 12:20:59 xxx.internal startup-script[1361]: INFO startup-script: /tmp/startup-qconLt/tmpI9QQlX: line 33: /usr/bin/docker: No such file or directory
Apr 21 12:20:59 xxx.internal startup-script[1361]: INFO startup-script: Return code 1.
Apr 21 12:20:59 xxx.internal startup-script[1361]: INFO Finished running startup scripts.

어쩔 수 없기 때문에 Ignition 경유로 docker.service에 의존하는 서비스로서 스타트 업 스크립트를 보내기로 했다. (원래 여기가 본래의 사용법일지도 모르지만···)

Ignition



Ignition은 cloud-init과 같이 시작 설정을 단순화하는 도구로 cloud-init와 달리 설정을 JSON 형식으로 전달합니다. Compute Engine의 경우이 설정을 user-data라는 메타 데이터를 통해 전달할 수 있습니다 (참고 : Ignition Config)

설정 예는 이 근처에 있지만, 이번에는 시작 스크립트 용 Systemd 서비스 Unit을 정의 할 수 있으면 좋으므로,

user-data
{
  "ignition": { "version": "2.0.0" },
  "systemd": {
    "units": [{
      "name": "example.service",
      "enable": true,
      "contents": "[Service]\nType=oneshot\nExecStart=/usr/bin/echo Hello World\n\n[Install]\nWantedBy=multi-user.target"
    }]
  }
}

이 설정을 편집하고 사용합니다.

units는 등록하려는 Systemd 서비스의 Unit을 배열로 지정합니다. 각 Unit의 설정은 name, enable, contents의 3개의 속성을 가지는 객체로 되어 있으며, 각 속성은 각각 서비스명, enable로 하는지, unit 파일의 내용을 나타내고 있다.

시작 스크립트용 서비스 Unit



Docker가 시작된 후에 실행되도록하십시오.

startup.service
[Unit]
Description=Startup Script
Requires=docker.service
After=docker.service

[Service]
ExecStartPre=-/usr/bin/docker stop myservice
ExecStartPre=-/usr/bin/docker rm myservice
ExecStart=/usr/bin/docker run --name myservice jkawamoto/myservice
ExecStop=/usr/bin/docker stop myservice
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

(참고: docker 컨테이너를 systemd로 관리 )

이 unit 파일을 등록하기위한 Ignition config 파일은 다음과 같습니다.

user-data
{
  "ignition": { "version": "2.0.0" },
  "systemd": {
    "units": [{
      "name": "startup.service",
      "enable": true,
      "contents": "[Unit]\nDescription=Startup Script\nRequires=docker.service\nAfter=docker.service\n[Service]\nExecStartPre=-/usr/bin/docker stop myservice\nExecStartPre=-/usr/bin/docker rm myservice\nExecStart=/usr/bin/docker run --name myservice jkawamoto/myservice\nExecStop=/usr/bin/docker stop myservice\nRestart=always\nType=simple\n[Install]\nWantedBy=multi-user.target"
    }]
  }
}

그런 다음 텍스트 데이터를 user-data라는 메타 데이터로 전달하면됩니다.

좋은 웹페이지 즐겨찾기