Gluster Container Images are updated to GlusterFS version 3.7.3

The official images of GlusterFS are available @docker hub for some time now, however GlusterFS version 3.6 was embedded in the same. Recently these GlusterFS Docker Container images have been updated to latest version of GlusterFS ( ie 3.7.3).

To know more about GlusterFS 3.7 please visit this url and to know about 3.7.3 please visit this url

The container images are available with ‘gluster’ account in docker hub.

There are two images (fedora and CentOS) available in docker hub for GlusterFS.

docker.io docker.io/gluster/gluster-centos CentOS7 + GlusterFS 3.7 1 [OK]
docker.io docker.io/gluster/gluster-fedora Fedora21 + GlusterFS 3.7 1 [OK]

You can use below command to run these images:
docker run –privileged -t -i gluster/gluster-fedora

Once the container is started, key combination Ctrl + p + q can be used to detach.

To re-attach:
“docker exec -ti ca551f3295fe bash” command where ca551f3295fe is the container ID.

Below video shows how can you use these images for deploying gluster containers.

GlusterFS Containers with Docker, Kubernetes and Openshift

Thought of sharing consolidated news on GlusterFS containers efforts here. Below is the snip of the email which I sent a few days back to gluster-users and gluster-devel mailing list. I hope it gives a summary, if not please let me know.


I would like to provide you a status update on the developments with GlusterFS containers and its presence in projects like Docker, Kubernetes, and Openshift.

We have containerized GlusterFS with base image of CentOS and Fedora and its available at Docker Hub[1] to consume.

The Dockerfile of the image can be found at github[2].

You can pull the image with

# docker pull gluster/gluster-centos # docker pull gluster/gluster-fedora

The exact steps to be followed to run GlusterFS container is mentioned here[3].

We can deploy GlusterFS pods in Kubernetes Environment and an example blog about this setup can be found here [4].

There is GlusterFS volume plugin available in Kubernetes and openshift v3 which provides Persistent Volume
to the containers in the Environment, How to use GlusterFS containers for Persistent Volume and Persistent Volume Claim in Openshift has been recorded at [5].

[1]https://hub.docker.com/r/gluster/
[2]https://github.com/gluster/docker/
[3]http://tinyurl.com/jupgene
[4]http://tinyurl.com/zsrz36y
[5]http://tinyurl.com/hne8g7o

Please let us know if you have any comments/suggestions/feedback.

Persistent Volume and Claim in OpenShift and Kubernetes using GlusterFS Volume Plugin

[Update] There is a more advanced method of gluster volume provisioning available for kubernetes/openshift called dynamic volume provisioning as discussed here https://www.humblec.com/how-to-glusterfs-dynamic-volume-provisioner-in-kubernetes-v1-4-openshift/. However reading through this article is well encouraged to know what we had before dynamic volume provisioning and to know the method called static provisioning of volumes

.

.

OpenShift is a platform as a service product from Red Hat. The software that runs the service is open-sourced under the name OpenShift Origin, and is available on GitHub.

OpenShift v3 is a layered system designed to expose underlying Docker and Kubernetes concepts as accurately as possible, with a focus on easy composition of applications by a developer. For example, install Ruby, push code, and add MySQL.

Docker is an open platform for developing, shipping, and running applications. With Docker you can separate your applications from your infrastructure and treat your infrastructure like a managed application. Docker does this by combining kernel containerization features with workflows and tooling that help you manage and deploy your applications. Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. Available on GitHub.

Kubernetes is an open-source system for automating deployment, operations, and scaling of containerized applications. It groups containers that make up an application into logical units for easy management and discovery. Kubernetes builds upon a decade and a half of experience of running production workloads at Google, combined with best-of-breed ideas and practices from the community. Available on GitHub.

GlusterFS is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. GlusterFS is free and open source software. Available on GitHub.

Hope you know a little bit of all the above Technologies, now we jump right into our topic which is Persistent Volume and Persistent volume claim in Kubernetes and Openshift v3 using GlusterFS volume. So what is Persistent Volume? Why do we need it? How does it work using GlusterFS Volume Plugin?

In Kubernetes, Managing storage is a distinct problem from managing compute. The PersistentVolume subsystem provides an API for users and administrators that abstracts details of how storage is provided from how it is consumed. To do this we introduce two new API resources in kubernetes: PersistentVolume and PersistentVolumeClaim.

A PersistentVolume (PV) is a piece of networked storage in the cluster that has been provisioned by an administrator. It is a resource in the cluster just like a node is a cluster resource. PVs are volume plugins like Volumes, but have a lifecycle independent of any individual pod that uses the PV. This API object captures the details of the implementation of the storage, be that NFS, iSCSI, or a cloud-provider-specific storage system.

A PersistentVolumeClaim (PVC) is a request for storage by a user. It is similar to a pod. Pods consume node resources and PVCs consume PV resources. Pods can request specific levels of resources (CPU and Memory). Claims can request specific size and access modes (e.g, can be mounted once read/write or many times read-only).

In simple words, Containers in Kubernetes Cluster need some storage which should be persistent even if the container goes down or no longer needed. So Kubernetes Administrator creates a Storage(GlusterFS storage, In this case) and creates a PV for that storage. When a Developer (Kubernetes cluster user) needs a Persistent Volume in a container, creates a Persistent Volume claim. Persistent Volume Claim will contain the options which Developer needs in the pods. So from list of Persistent Volume the best match is selected for the claim and Binded to the claim. Now the developer can use the claim in the pods.


Prerequisites:

Need a Kubernetes or Openshift cluster, My setup is one master and three nodes.

Note: you can use kubectl in place of oc, oc is openshift controller which is a wrapper around kubectl. I am not sure about the difference.

#oc get nodes NAME LABELS STATUS AGE dhcp42-144.example.com kubernetes.io/hostname=dhcp42-144.example.com,name=node3 Ready 15d dhcp42-235.example.com kubernetes.io/hostname=dhcp42-235.example.com,name=node1 Ready 15d dhcp43-174.example.com kubernetes.io/hostname=dhcp43-174.example.com,name=node2 Ready 15d dhcp43-183.example.com kubernetes.io/hostname=dhcp43-183.example.com,name=master Ready,SchedulingDisabled 15d

2) Have a GlusterFS cluster setup, Create a GlusterFS Volume and start the GlusterFS volume.

# gluster v status Status of volume: gluster_vol Gluster process TCP Port RDMA Port Online Pid —————————————————————————— Brick 170.22.42.84:/gluster_brick 49152 0 Y 8771 Brick 170.22.43.77:/gluster_brick 49152 0 Y 7443 NFS Server on localhost 2049 0 Y 7463 NFS Server on 170.22.42.84 2049 0 Y 8792 Task Status of Volume gluster_vol —————————————————————————— There are no active volume tasks

3) All nodes in kubernetes cluster must have GlusterFS-Client Package installed.

Now we have the prerequisites \o/ …

In Kube-master administrator has to write required yaml file which will be given as input to the kube cluster.

There are three files to be written by administrator and one by Developer.

Service
Service Keeps the endpoint to be persistent or active.
Endpoint
Endpoint is the file which points to the GlusterFS cluster location.
PV
PV is Persistent Volume where the administrator will define the gluster volume name, capacity of volume and access mode.
PVC
PVC is persistent volume claim where developer defines the type of storage as needed.

STEP 1: Create a service for the gluster volume.

# cat gluster_pod/gluster-service.yaml apiVersion: “v1” kind: “Service” metadata: name: “glusterfs-cluster” spec: ports: – port: 1 # oc create -f gluster_pod/gluster-service.yaml service “glusterfs-cluster” created

Verify:

# oc get service NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE glusterfs-cluster 172.30.251.13 1/TCP 9m kubernetes 172.30.0.1 443/TCP,53/UDP,53/TCP 16d

STEP 2: Create an Endpoint for the gluster service

# cat gluster_pod/gluster-endpoints.yaml apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster subsets: – addresses: – ip: 170.22.43.77 ports: – port: 1

The ip here is the glusterfs cluster ip.

# oc create -f gluster_pod/gluster-endpoints.yaml endpoints “glusterfs-cluster” created # oc get endpoints NAME ENDPOINTS AGE glusterfs-cluster 170.22.43.77:1 3m kubernetes 170.22.43.183:8053,170.22.43.183:8443,170.22.43.183:8053 16d

STEP 3: Create a PV for the gluster volume.

# cat gluster_pod/gluster-pv.yaml apiVersion: “v1” kind: “PersistentVolume” metadata: name: “gluster-default-volume” spec: capacity: storage: “8Gi” accessModes: – “ReadWriteMany” glusterfs: endpoints: “glusterfs-cluster” path: “gluster_vol” readOnly: false persistentVolumeReclaimPolicy: “Recycle”

Note : path here is the gluster volume name. Access mode specifies the way to access the volume. Capacity has the storage size of the GlusterFS volume.

# oc create -f gluster_pod/gluster-pv.yaml persistentvolume “gluster-default-volume” created # oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-default-volume 8Gi RWX Available 36s

STEP 4: Create a PVC for the gluster PV.

# cat gluster_pod/gluster-pvc.yaml apiVersion: “v1” kind: “PersistentVolumeClaim” metadata: name: “glusterfs-claim” spec: accessModes: – “ReadWriteMany” resources: requests: storage: “8Gi”

Note: the Developer request for 8 Gb of storage with access mode rwx.

# oc create -f gluster_pod/gluster-pvc.yaml persistentvolumeclaim “glusterfs-claim” created # oc get pvc NAME LABELS STATUS VOLUME CAPACITY ACCESSMODES AGE glusterfs-claim Bound gluster-default-volume 8Gi RWX 14s

Here the pvc is bounded as soon as created, because it found the PV that satisfies the requirement. Now lets go and check the pv status

# oc get pv NAME LABELS CAPACITY ACCESSMODES STATUS CLAIM REASON AGE gluster-default-volume 8Gi RWX Bound default/glusterfs-claim 5m

See now the PV has been bound to “default/glusterfs-claim”. In this state developer has the Persistent Volume Claim bounded successfully, now the developer can use the pv claim like below.

STEP 5: Use the persistent Volume Claim in a Pod defined by the Developer.

# cat gluster_pod/gluster_pod.yaml kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: – name: mygluster image: humble/gluster-client command: [“/usr/sbin/init”] volumeMounts: – mountPath: “/home” name: gluster-default-volume volumes: – name: gluster-default-volume persistentVolumeClaim: claimName: glusterfs-claim

The above pod definition will pull the humble/gluster-client image(some private image) and start init script. The gluster volume will be mounted on the host machine by the GlusterFS volume Plugin available in the kubernetes and then bind mounted to the container’s /home. So all the Kubernetes cluster nodes must have glusterfs-client packages.

Lets try running.

# oc create -f gluster_pod/fedora_pod.yaml pod “mypod” created # oc get pods NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 1m

Wow its running… lets go and check where it is running.

# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec57d62e3837 humble/gluster-client “/usr/sbin/init” 4 minutes ago Up 4 minutes k8s_myfedora.dc1f7d7a_mypod_default_5d301443-ec20-11e5-9076-5254002e937b_ed2eb8e5 1439dd72fb1d openshift3/ose-pod:v3.1.1.6 “/pod” 4 minutes ago Up 4 minutes k8s_POD.e071dbf6_mypod_default_5d301443-ec20-11e5-9076-5254002e937b_4d6a7afb

Found the Pod running successfully on one of the Kubernetes node.

On the host:

# df -h | grep gluster_vol 170.22.43.77:gluster_vol 35G 4.0G 31G 12% /var/lib/origin/openshift.local.volumes/pods/5d301443-ec20-11e5-9076-5254002e937b/volumes/kubernetes.io~glusterfs/gluster-default-volume

I can see the gluster volume being mounted on the host \o/. Lets check inside the container. Note the random number is the container-id from the docker ps command.

# docker exec -it ec57d62e3837 /bin/bash [root@mypod /]# df -h | grep gluster_vol 170.22.43.77:gluster_vol 35G 4.0G 31G 12% /home

Yippy the GlusterFS volume has been mounted inside the container on /home as mentioned in the pod definition. Lets try writing something to it

[root@mypod /]# mkdir /home/demo [root@mypod /]# ls /home/ demo

Since the AccessMode is RWX I am able to write to the mount point.

That’s all Folks.

Me @ FOSDEM 2016

An amazing event! This year’s FOSDEM (https://fosdem.org/2016/ ) was held at Brussels. It was my first experience to meet more than 5000+ hackers at one venue where almost everyone is passionate about opensource. I would say its not just developers but also DevOps, Testers, System Administrators, Security groups and many more. I was surprised to see some opensource families at the venue. I was responsible for the Gluster booth at FOSDEM along with Kaushal. We also had help from Amye (@Amye),Neils (@nixpanic) and Kaleb. Kaushal has already blogged about this event here. I was really happy to get feedback about GlusterFS, and also to interact with Gluster users who are part of the vibrant Gluster community. Got a chance to talk with many users and most of the feedback is captured in Kaushal’s blog. However let me summarize what I heard from this awesome crowd.

*) Many have deployed Gluster at a smaller scale and they seem to be really happy with the way GlusterFS has been fulfilling their requirements. Nearly half of them are still running older versions of GlusterFS. I tried to convince them to move/upgrade to later versions to get further improvements in features and bug fixes.

*) Gluster has lot of deployments with Ovirt as Gluster is the right fit for VM store use case. Although it works perfectly for most of the users, some did face the issue of split brain at times. To address this concern, Gluster developer community has come up with this innovative solution called as the ‘arbitrator’. Users wanted to know more details about this feature. I managed to give an overview of the same and promised a blog post about this feature shared across ovirt and Gluster community. We will blog about it soon.

*) Containers and Gluster also garnered much interest. As of today, Gluster is containerized. I could answer all these queries as I am currently working on it. I have written a few blog posts [1] about it and felt good to share it with them. You can read about it here: [Building Gluster Containers] , GlusterFS cluster in kubernetes

*) “Wow Gluster logo is so cool, let me grab it”. Yes the logo is cool, so is Gluster. Many wanted to know the story behind the Gluster logo. We tried our best to make up a story in an opensource way 😛

IMG_20160130_160458

*) Some were curious about the new ‘sharding’ feature which is available in Gluster today.

*) Many users who have never used GlusterFS wanted to try it after hearing an overview about Gluster. They are always welcome to Gluster community.

*) We also had some queries from the other projects like OpenMandriva, DRLM, BareOS ..etc. Indeed it was good to meet them and discuss integration possibilities.

*) “Gluster Documentation has improved a lot recently”. Yes, it is and we will keep improving it. I was really happy to hear this, being one of the persons behind this task.

*) Few users also praised about the ease of deploying Gluster compared to other storage projects.

Finally, I was surprised to hear that there are people who use Gluster for Email and Database workloads and that it is working out really well for them!

Catching up with friends is always an addon when you attend a conference, FOSDEM gave me a great opportunity !
Thanks Red Hat for sponsoring my trip to FOSDEM. I am sure I wont miss FOSDEM 2017 😛

GlusterFS containers in Kubernetes Cluster for persistent data store !!

Everything is containerized, so Gluster . As you know, Gluster Container images are available for long time ( for both CentOS and Fedora ) in Docker hub. In previous blog posts, we saw how to build/run Gluster Containers. In this setup, we will try to set up a Kubernetes cluster with Gluster containers. If you dont know much about kubernetes , please go through this . In short, kubernetes is an orchestration software for container environment which brings the services like scheduling, service discovery..etc. We will deploy a kubernetes cluster in couple of atomic nodes. Then run Gluster containers on these atomic hosts via kubernetes. Once the gluster containers are running, we will form a trusted pool out of these gluster containers and export a volume, so that other application containers can make use of this volume to store its data in a persistent way!!.

Sounds interesting ? Yes, let us start.

NOTE: This article also discuss the steps to configure etcd server ( a key value store).
. For this particular setup we may not need to configure etcd. However your environment may need, for example to configure flannel.

Setup

Three centos ( You can also use fedora/RHEL) atomic hosts :

centos-atomic-KubeMaster centos-atomic-Kubenode1 centos-atomic-Kubenode2

To configure/install CentOS atomic hosts, please follow the steps mentioned here.
and the atomic images can be downloaded from here

Then start the atomic installation, if cloud init is configured, it will come into play and ask for “atomic host” login.

username: centos password: atomic

Note: The above is based on the cloud-init configuration. If you have customized the cloud-init configuration for different username and password, please supply the same. (wait till the vm to completely load meta-data and user-data. else it will throw invalid login till its completely loaded)

At this stage we have three atomic hosts.:

10.70.42.184 centos-atomic-KubeMaster 10.70.42.29 centos-atomic-Kubenode1 10.70.43.88 centos-atomic-Kubenode2

If you already have this setup, make sure all the machines are able to talk to each other.

First things first,

-bash-4.2# atomic host upgrade

Upgrade your system to latest docker, etcd, kubernetes..etc, in all nodes.
With the three systems in place, the next thing is to set up Kubernetes. Setting up Kubernetes on the Master, select any system to be master.

1. Etcd configuration:
Edit the /etc/etcd/etcd.conf. The etcd service needs to be configured to listen on all interfaces to ports 2380. (ETCD_LISTEN_PEER_URLS) and port 2379 (ETCD_LISTEN_CLIENT_URLS), and listen on 2380 on localhost (ETCD_LISTEN_PEER_URLS)

-bash-4.2# cat /etc/etcd/etcd.conf | grep -v “#” ETCD_NAME=default ETCD_DATA_DIR=”/var/lib/etcd/default.etcd” ETCD_LISTEN_PEER_URLS=”http://0.0.0.0:2380″ ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379″ ETCD_ADVERTISE_CLIENT_URLS=”http://0.0.0.0:2379″


2. Kubernetes Configuration:

Edit the /etc/kubernetes/config file and change the KUBE_MASTER line to identify the location of your master server (it points to 127.0.0.1, by default). Leave other settings as they are.

KUBE_MASTER=”–master=http://10.70.42.184:8080″


3. Kubernetes apiserver Configuration:

Edit the /etc/kubernetes/apiserver and add a new KUBE_ETCD_SERVERS line (as shown below), then review and change other lines in the apiserver configuration file. Change KUBE_API_ADDRESS to listen on all network addresses(0.0.0.0), instead of just localhost. Set an address range for the KUBE_SERVICE_ADDRESS that Kubernetes can use to assign to services (see a description of this address below). Finally, remove the term “ServiceAccount” from the KUBE_ADMISSION_CONTROL instruction.

-bash-4.2# cat /etc/kubernetes/apiserver | grep -v “#” KUBE_API_ADDRESS=”–address=0.0.0.0″ KUBE_ETCD_SERVERS=”–etcd_servers=http://10.70.42.184:2379″ KUBE_SERVICE_ADDRESSES=”–service-cluster-ip-range=10.254.100.0/24″ KUBE_ADMISSION_CONTROL=”–admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota” KUBE_API_ARGS=””

4. Start master services:

To run the Kubernetes master services, you need to enable and start several systemd services. From the master, run the following for loop to start and enable Kubernetes systemd services on the master:

-bash-4.2# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do systemctl restart $SERVICES; systemctl enable $SERVICES; systemctl status $SERVICES; done

5. Setting up Kubernetes on the Nodes

On each of the two Kubernetes nodes, you need to edit several configuration files and start and enable several Kubernetes systemd services:

1.Edit /etc/kubernetes/config:

Edit the KUBE_MASTER line in this file to identify the location of your master (it is 127.0.0.1, by default). allow_privileged must be set to true. Leave other settings as they are.

KUBE_ALLOW_PRIV=”–allow_privileged=true” KUBE_MASTER=”–master=http://10.70.42.184:8080″

2.Edit /etc/kubernetes/kubelet:

In this file on each node, modify KUBELET_ADDRESS (0.0.0.0 to listen on all network interfaces), KUBELET_HOSTNAME (replace hostname_override with the hostname or IP address of the local system). You may leave this blank to use the actual hostname, set KUBELET_ARGS, and KUBELET_API_SERVER as below. --host-network-sources=* is specified to use the host networking option of docker(–net=host). You can use any networking mode of docker. However in this setup, we use --net=host option to make sure we get maximum performance.

bash-4.2# cat /etc/kubernetes/kubelet | grep -v “#” KUBELET_ADDRESS=”–address=0.0.0.0″ KUBELET_HOSTNAME=”–hostname_override=” KUBELET_API_SERVER=”–api_servers=http://10.70.42.184:8080″ KUBELET_ARGS=”–register-node=true –host-network-sources=*”


3. Edit /etc/kubernetes/proxy:
No settings are required in this file. If you have set KUBE_PROXY_ARGS, you can comment it out:

bash-4.2# cat /etc/kubernetes/proxy ### # kubernetes proxy config # default config should be adequate # Add your own! #KUBE_PROXY_ARGS=”–master=http://master.example.com:8080″

4. Start the Kubernetes nodes systemd services:

On each node, you need to start several services associated with a Kubernetes node:

-bash-4.2# for SERVICES in docker kube-proxy.service kubelet.service; do systemctl restart $SERVICES; systemctl enable $SERVICES; systemctl status $SERVICES; done

5. Check the services:
Run the netstat command on each of the three systems to check which ports the services are running on. The etcd service should only be running on the master.

From master:

-bash-4.2# netstat -tulnp | grep -E “(kube)|(etcd)” tcp 0 0 127.0.0.1:10251 0.0.0.0:* LISTEN 17805/kube-schedule tcp 0 0 127.0.0.1:10252 0.0.0.0:* LISTEN 17764/kube-controll tcp6 0 0 :::6443 :::* LISTEN 17833/kube-apiserve tcp6 0 0 :::2379 :::* LISTEN 17668/etcd tcp6 0 0 :::2380 :::* LISTEN 17668/etcd tcp6 0 0 :::8080 :::* LISTEN 17833/kube-apiserve

From nodes:


-bash-4.2# netstat -tulnp | grep kube
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 104398/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 104331/kube-proxy
tcp6 0 0 :::10250 :::* LISTEN 104398/kubelet
tcp6 0 0 :::57421 :::* LISTEN 104331/kube-proxy
tcp6 0 0 :::10255 :::* LISTEN 104398/kubelet
tcp6 0 0 :::34269 :::* LISTEN 104331/kube-proxy
tcp6 0 0 :::58239 :::* LISTEN 104331/kube-proxy
tcp6 0 0 :::4194 :::* LISTEN 104398/kubelet

Read more

“Running with unpopulated /etc” – Failing to run systemd based container ?

Recently I experienced, systemd based container fails to run in certain version of distros.

For ex: If I run my container with systemd I get below messages.

#docker run –rm -t -i –privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN) Detected virtualization docker. Detected architecture x86-64. Running with unpopulated /etc. …. Set hostname to . Initializing machine ID from random generator. Populated /etc with preset unit settings. Unit etc-hosts.mount is bound to inactive unit dev-mapper-X.X.root.device. Stopping, too. Unit etc-hostname.mount is bound to inactive unit dev-mapper-X.X.root.device. Stopping, too…. Unit etc-resolv.conf.mount is bound to inactive unit dev-mapper-X.X.root.device. Stopping, too. Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory. Startup finished in 106ms. Failed to create unit file /run/systemd/generator.late/network.service: File exists Failed to create unit file /run/systemd/generator.late/netconsole.service: File exists

The line ‘Running with unpopulated /etc’ looked suspicious to me, after some attempts we were able to conclude that, the things were going wrong in absense of ‘/etc/machine-id’ file which used to be there. If you came across similar to this situation, make an entry in your docker file to create /etc/machine-id as shown below and give a try!

#RUN touch /etc/machine-id

now, build your image and start the container from a new image. Let me know how it goes.

[go get] : “no buildable Go source files in the repo”

So, you are here with, “no buildable Go source files in the repo” error message.

Quick Solution :

# go get github.com/x/some-go-package/… ”

where “x/some-go-package” is for example, however pay attention to “…” part in the above command. It will get you all packages and their dependencies under that path. Because the error is caused by the absence of “go” files in the provided ( root) path. In this example there is no ‘go’ files in ‘x/some-go-package’. If the issue is still not resolved please leave a comment.

Docker gotchas ( 3 . docker Save Vs Export . Whats the difference between them ?)

Well, Everyone want to save the image or container after some amount of work on the container. When looking for the options they see there are mainly 2 options.

#docker save
#docker export

Along with the above commands, the follow-up commands are also available which are:

#docker load
#docker import

Now, you are confused about which one to use?. It’s simple: The docker save and export commands are used for saving, but what? Its simple, docker export save the container and docker save do it for the image.

In short: save is for the image, export for container.

When docker export is used, some type of merging happening under the hood and the outcome is a single flat layer. You lose the history and metadata of the build process of the container.

However in docker save, the history is maintained. Which one to use? Up to you, based on your use case. One other difference is that the export tar will be less in size compared to ‘save’d tar, obviously because the save carries the history and metadata with it.

Docker gotchas ( 2. Docker build with –no-cache)

There is always a misconception that when you build an image from the docker file in a frequent interval, which has base image defined something like below, the base image updates ( for example a CVE or vulnerability fix) are by default pulled into your newly built image. This is wrong!

For example:

FROM fedora21

Docker uses the caches when building and when there is no change in the instructions of Dockerfile, docker skips doing an update of the image to the latest version.
To avoid/overcome this, remove the cache in the build process! but, how? below is the method you can use to remove the cache while building docker image.

#docker build -no-cache .