cos-init-docker.yaml 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #cloud-config
  2. write_files:
  3. - path: /etc/systemd/system/upgrade-docker.service
  4. permissions: 0644
  5. owner: root
  6. content: |
  7. [Unit]
  8. Description=Upgrade Docker Binaries
  9. Requires=network-online.target
  10. After=network-online.target docker.service
  11. [Service]
  12. Type=oneshot
  13. # RemainAfterExit so the service runs exactly once.
  14. RemainAfterExit=yes
  15. ExecStartPre=/bin/mkdir -p /home/upgrade-docker/bin
  16. ExecStartPre=/bin/mount --bind /home/upgrade-docker/bin /home/upgrade-docker/bin
  17. ExecStartPre=/bin/mount -o remount,exec /home/upgrade-docker/bin
  18. ExecStart=/bin/bash /tmp/upgrade-docker/upgrade.sh
  19. ExecStartPost=-/bin/rm -rf /home/upgrade-docker/download
  20. [Install]
  21. WantedBy=multi-user.target
  22. - path: /tmp/upgrade-docker/upgrade.sh
  23. permissions: 0644
  24. owner: root
  25. content: |
  26. # This script reads a GCE metadata key for the user specified Docker
  27. # version, downloads, and replaces the builtin Docker with it.
  28. set -x
  29. set -o errexit
  30. set -o nounset
  31. set -o pipefail
  32. # Checks if a Docker binary is the version we want.
  33. # $1: Docker binary
  34. # $2: Requested version
  35. check_installed() {
  36. local docker_bin="$1"
  37. local requested_version="$2"
  38. [[ "$(${docker_bin} --version)" =~ "Docker version ${requested_version}," ]]
  39. }
  40. # $1: Docker version
  41. download_and_install_docker() {
  42. local requested_version="$1"
  43. local download_dir=/home/upgrade-docker/download/docker-"${requested_version}"
  44. local install_location=/home/upgrade-docker/bin
  45. local docker_tgz="docker-${requested_version}.tgz"
  46. if [[ "${requested_version}" =~ "rc" ]]; then
  47. # RC releases all have the word "rc" in their version
  48. # number, e.g., "1.11.1-rc1".
  49. download_url="https://test.docker.com/builds/Linux/x86_64/${docker_tgz}"
  50. else
  51. download_url="https://get.docker.com/builds/Linux/x86_64/${docker_tgz}"
  52. fi
  53. echo "Downloading Docker version ${requested_version} from "\
  54. "${download_url} to ${download_dir} ..."
  55. # Download and install the binaries.
  56. mkdir -p "${download_dir}"/binaries
  57. /usr/bin/curl -o "${download_dir}/${docker_tgz}" --fail "${download_url}"
  58. tar xzf "${download_dir}/${docker_tgz}" -C "${download_dir}"/binaries
  59. cp "${download_dir}"/binaries/docker/docker* "${install_location}"
  60. mount --bind "${install_location}"/docker /usr/bin/docker
  61. mount --bind "${install_location}"/docker-containerd /usr/bin/docker-containerd
  62. mount --bind "${install_location}"/docker-containerd-shim /usr/bin/docker-containerd-shim
  63. mount --bind "${install_location}"/dockerd /usr/bin/dockerd
  64. mount --bind "${install_location}"/docker-proxy /usr/bin/docker-proxy
  65. mount --bind "${install_location}"/docker-runc /usr/bin/docker-runc
  66. echo "PATH=/home/upgrade-docker/bin:/sbin:/bin:/usr/sbin:/usr/bin" >> /etc/default/docker
  67. }
  68. # $1: Metadata key
  69. get_metadata() {
  70. /usr/bin/curl --fail --retry 5 --retry-delay 3 --silent --show-error \
  71. -H "X-Google-Metadata-Request: True" \
  72. http://metadata.google.internal/computeMetadata/v1/instance/attributes/"$1"
  73. }
  74. main() {
  75. # Get the desired Docker version through the following metadata key.
  76. local requested_version="$(get_metadata "gci-docker-version")"
  77. if [[ -z "${requested_version}" ]]; then
  78. exit 0
  79. fi
  80. # Check if we have the requested version installed.
  81. if check_installed /usr/bin/docker "${requested_version}"; then
  82. echo "Requested version already installed. Exiting."
  83. exit 0
  84. fi
  85. # Stop the docker daemon during upgrade.
  86. /usr/bin/systemctl stop docker
  87. download_and_install_docker "${requested_version}"
  88. # Assert that the upgrade was successful.
  89. local rc=0
  90. check_installed /usr/bin/docker "${requested_version}" || rc=1
  91. /usr/bin/systemctl start docker && exit $rc
  92. }
  93. main "$@"
  94. runcmd:
  95. - systemctl daemon-reload
  96. - systemctl start upgrade-docker.service
  97. - mount /tmp /tmp -o remount,exec,suid
  98. - usermod -a -G docker jenkins
  99. - mkdir -p /var/lib/kubelet
  100. - mkdir -p /home/kubernetes/containerized_mounter/rootfs
  101. - mount --bind /home/kubernetes/containerized_mounter/ /home/kubernetes/containerized_mounter/
  102. - mount -o remount, exec /home/kubernetes/containerized_mounter/
  103. - wget https://dl.k8s.io/gci-mounter/mounter.tar -O /tmp/mounter.tar
  104. - tar xvf /tmp/mounter.tar -C /home/kubernetes/containerized_mounter/rootfs
  105. - mkdir -p /home/kubernetes/containerized_mounter/rootfs/var/lib/kubelet
  106. - mount --rbind /var/lib/kubelet /home/kubernetes/containerized_mounter/rootfs/var/lib/kubelet
  107. - mount --make-rshared /home/kubernetes/containerized_mounter/rootfs/var/lib/kubelet
  108. - mount --bind /proc /home/kubernetes/containerized_mounter/rootfs/proc
  109. - mount --bind /dev /home/kubernetes/containerized_mounter/rootfs/dev
  110. - rm /tmp/mounter.tar