Giter VIP home page Giter VIP logo

d4m-nfs's People

Contributors

dbingham avatar genezys avatar if-kenn avatar if-kyle avatar jgoulah avatar nbr avatar palkan avatar sponomarev avatar yovasx2 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

d4m-nfs's Issues

d4m doing weird things in my console

Hello,
When I turn on my laptop and open a terminal, something really weird happens: it looks like d4m-nfs is running itself in a loop... problem: I didn't even start it !

Click to see the video instead of the gif
Click to see a video of the problem

How do I turn this off? It is really disturbing
Thank you

Any working examples?

Can we have a working example please?

I got this error when run d4m-nfs.sh:

exports:1: got options with no exported directory: -e # d4m-nfs exports
exports:7: path contains non-directory or non-existent components: /Users/root
exports:7: no usable directories in export entry
exports:7: using fallback (marked offline): /
Something is wrong with your /etc/exports file, please check it.

Script will fail if my home directory is not standard

Early I moved home directory to another volume (e.g. /Volumes/Data/username)
But your script expecting that my directory located inside /Users/username and /cat/exports contain invalid folder after script execution

Is it possible to add a step-by-step guide?

Hello! I would love to use this solution but I don't understand how to correctly change my current docker-compose setup to use your solution. What do I have to run? Do I have to add a d4m-with-nfs.sh anywhere? If so do I have to execute it before running docker compose? Could I still run just docker-compose up?

I might be asking a lot but could you help me through this?

Thank you.

Cannot docker-compose up on laradock: Mounts denied

Hello, I followed laradock's doc to build up my dev environment.

On docker-machine, everything worked just fine. That means that the docker-compose.yml does not have any error or misconfiguration (afaik at least)

But when I run it on Mac, the following error occurs:

$ docker-compose up -d nginx mysql
laradock_mysql_1 is up-to-date
Starting laradock_applications_1

ERROR: for applications  Cannot start service applications: Mounts denied: r more info.
.
 /Users/thevinh/docker_laradock/magento/www
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces fo
ERROR: Encountered errors while bringing up the project.
  1. My D4M Settings:

Imgur

  1. d4m-nfs/etc/d4m-nfs-mounts.txt content:
/Users:/Users:504:20
/Volumes:/Volumes
/private:/private
  1. /tmp/d4m-mount-nfs.sh content:
ln -nsf /tmp/d4m-apk-cache /etc/apk/cache
apk update
apk add nfs-utils sntpc
rpcbind -s > /dev/null 2>&1

DEFGW=$(ip route|awk '/default/{print $3}')
FSTAB="\n\n# d4m-nfs mounts\n"

if true && ! $(grep ':/mnt' /tmp/d4m-nfs-mounts.txt > /dev/null 2>&1); then
  mkdir -p /mnt

  FSTAB="${FSTAB}${DEFGW}:/Users/thevinh /mnt nfs nolock,local_lock=all 0 0"
fi

if [ -e /tmp/d4m-nfs-mounts.txt ]; then
  while read MOUNT; do
    DSTDIR=$(echo "$MOUNT" | cut -d: -f2)
    mkdir -p ${DSTDIR}
    FSTAB="${FSTAB}\n${DEFGW}:$(echo "$MOUNT" | cut -d: -f1) ${DSTDIR} nfs nolock,local_lock=all 0 0"
  done < /tmp/d4m-nfs-mounts.txt
fi

if ! $(grep "d4m-nfs mounts" /etc/fstab > /dev/null 2>&1); then
    echo adding d4m nfs config to /etc/fstab:
    echo -e $FSTAB | tee /etc/fstab
else
    echo d4m nfs mounts already exist in /etc/fstab
fi

sntpc -i 10 ${DEFGW} &

sleep .5
mount -a
touch /tmp/d4m-done
  1. /tmp/d4m-nfs-mounts.txt content
/Users:/Users:504:20
/Volumes:/Volumes
/private:/private
  1. /etc/exports content
# VAGRANT-BEGIN: 504 115ebe2e-e327-401a-b203-c9c57be985e0
#"/Users/thevinh/www" 192.168.10.10 -alldirs -mapall=504:20
# VAGRANT-END: 504 115ebe2e-e327-401a-b203-c9c57be985e0
# docker-machine-nfs-begin default #
#/Users 192.168.99.100 -alldirs -mapall=504:20
# docker-machine-nfs-end default #



# d4m-nfs exports

"/Users" -alldirs -mapall=504:20 localhost
"/Volumes" -alldirs -mapall=504:20 localhost

Running d4m-nfs.sh on bash (not zsh which is my default sh prog) returns:

bash-3.2$ ./d4m-nfs.sh
[d4m-nfs] You will need to provide your Mac password in order to setup NFS.
Password:
# d4m-nfs exports

"/Users" -alldirs -mapall=504:20 localhost
"/Volumes" -alldirs -mapall=504:20 localhost

[d4m-nfs] Copy the Moby VM APK Cache back.
[d4m-nfs] Create the script for Moby VM.
[d4m-nfs] Start and restop nfsd, for some reason restart is not as kind.
Stopping the nfsd service (use 'disable' to make permanent)
/System/Library/LaunchDaemons/com.apple.nfsd.plist: Operation not permitted while System Integrity Protection is engaged
The nfsd service is already running.
[d4m-nfs] Wait until NFS is setup.
[d4m-nfs] Wait until D4M is running.
[d4m-nfs] Copy back the APK cache.

cp: /tmp/d4m-apk-cache/*: No such file or directory

# d4m-nfs

I don't think the Docker native for Mac recognizes what we have in the NFS settings, it just read what it has in the File Sharing settings.

Is that mac's System Integrity Protection causing this issue ?

My other info:

  • Docker community edition Version 17.03.1-ce-mac5 (16048)
  • macOS 10.12.4

Mounts denied

Hi I', trying to run example ./d4m-with-nfs.sh but it fails with:

c0fb98657c9a0414d092b2c6df47ea2e0736e3a9eef6451653135e44cbd8733a
docker: Error response from daemon: Mounts denied: 
The path /mnt/www
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
..

any ideas what to check? Thanks.

cp: /tmp/d4m-apk-cache/*: No such file or directory

I've gotten this to work before hence I post I wrote on stackoverflow as an answer to the step by step guide. However, on a new computer I'm having a frustrating time getting it to work and can't figure out what I'm doing wrong.

It seems no matter what I do the mounts do not work and the exports file is never set correctly. I think its using a cache somewhere but I don't know how to reset it or where it is.

Kendras-MBP:d4m-nfs kendra$ ./d4m-nfs.sh
[d4m-nfs] You will need to provide your Mac password in order to setup NFS.
Password:
[d4m-nfs] Copy the Moby VM APK Cache back.
[d4m-nfs] Create the script for Moby VM.
[d4m-nfs] Start and restop nfsd, for some reason restart is not as kind.
The nfsd service is already running.
[d4m-nfs] Wait until NFS is setup.
[d4m-nfs] Wait until D4M is running.
[d4m-nfs] Copy back the APK cache.

cp: /tmp/d4m-apk-cache/*: No such file or directory

# d4m-nfs

With the Docker for Mac's (D4M) current implementation of osxfs, depending on how read and write heavy containers are on mounted volumes, performance can be abismal.

d4m-nfs blantently steals from the way that DockerRoot/xhyve used NFS mounts to get around i/o performance issues. With this implementation D4M appears to even outperform DockerRoot/xhyve under a full Drupal stack (mariadb/redis/php-fpm/nginx/varnish/haproxy), including persistent MySQL databases.

The advantage of this over a file sync strategy is simpler, less overhead and not having to duplicate files.

In order to make use of NFS, you will want to run ./d4m-nfs.sh before bringing up your containers, **please note this must be run via the bash shell and not the sh shell**. You will either need to change your volume paths to use /mnt, or configure the mounts in etc/d4m-nfs-mounts.txt. Look at the example directory for docker or docker-compose simple examples and an example d4m-nfs-mounts.txt. Please keep in mind that since NFS is the underlying glue that is this project, that all rules of NFS must be followed. Unlike Docker which creates the directory for you, if it doesn't exist, NFS needs it to exist. Since NFS and Docker have no idea of the other, it is up to you to create the skeleton directory structure for bootstrap.  The way in which I often bootstrap is start up a stack normally without using NFS, use docker cp to get what the containers of docker had made, and then use that copied directory to map it via a Docker volume.

By default, if the script doesn't find any other volumes bound to /mnt in your etc/d4m-nfs-mounts.txt, it will mount your home directory (eg. /Users/username) on /mnt to be exposed for the container. If you'd like to disable this, you may set the environment variable AUTO_MOUNT_HOME to false.

Alpine Linux NFS packages are now cached so that d4m-nfs can be used when not online. In order for this to work, you must of run it once before while online.

You can now specify what mounts you want in the d4m-nfs-mounts.txt file. Note that if you do this, you need to make sure that it does not conflict with D4M settings, in other words if you want to have /Users be served by NFS instead of osxfs you will need to remove it from the D4M Preferences -> File Sharing. The /tmp share must stay since that is how d4m-nfs exchanges information with the D4M Moby VM. 

This is the default file sharing:
![D4M Default File Sharing](/examples/img/d4m-default-file-sharing.png?raw=true "D4M Default File Sharing")

Please make sure that /tmp is still shared:
![D4M Minimal File Sharing](/examples/img/d4m-min-file-sharing.png?raw=true "D4M Minimal File Sharing")

Please note:
* To connect to the D4M moby linux VM use: screen -r d4m
* To disconnect from the D4M moby linux VM tty screen session use Ctrl-a d.
* To run d4m-nfs faster and/or offline, leave the files in d4m-apk-cache and the hello-world image.
* If you switch between D4M stable and beta, you might need to remove files in d4m-apk-cache and the hello-world image.

# Opening Github Issues
**Please keep in mind that everyone's environment is quite unique and this make helping people much harder. In that spirit when opening an issue, please provide the following:**

1. Comment out mounts from compose file and add them one at a time. Due to NFS, d4m-nfs cannot make the empty directory structure and will error.  Read paragraphs above for more.
2. Please ensure you have looked at the "examples" directory in the root of this site.
3. include the text of the any approriate error message
4. screenshot of Docker for Mac's Preferences -> File Sharing
5. attachment of d4m-nfs/etc/d4m-nfs-mounts.txt
6. attachment of /tmp/d4m-mount-nfs.sh
7. attachment of /tmp/d4m-nfs-mounts.txt
8. attachment of /etc/exports

## Common Problem
It appears as though a number of people are blindly copying the mounts from the preference in Docker for Mac to d4m-nfs/etc/d4m-nfs-mounts.txt. In doing this they end up having a /Volumes, /private and /Users mounts. If you are getting an error similar to the following, you might of done this:

ERROR: for applications Cannot start service applications: Mounts denied: r more info.


In all likelihood this is not what you want. The location /Volumes on a Mac is actually just a symlink to /, and it is never good to export a symlink. On top of that, with NFS, you can not export child directories which are on the same file system, and since both /Users and /private this could cause problems. You probably will need have to clean up your /etc/exports to remove all the lines from # d4m-nfs exports down.

Please keep in mind that since NFS is the underlying glue that is this project, that all rules of NFS must be followed. Unlike Docker which creates the directory for you, if it doesn't exist, NFS needs it to exist. Since NFS and Docker have no idea of the other, it is up to you to create the skeleton directory structure for bootstrap.  The way in which I often bootstrap is start up a stack normally without using NFS, use docker cp to get what the containers of docker had made, and then use that copied directory to map it via a Docker volume.

You may also want to check on the latest file system changes that the Docker team is working on: https://blog.docker.com/2017/05/user-guided-caching-in-docker-for-mac/


# Use Stable Docker for Mac channel
Currently d4m-nfs is known to work on the stable channel of 'Docker for Mac' both versions 1.12 and 1.13, we cannot guarantee how it will work on the beta channel of 'Docker for Mac'.  Please use the stable channel of Docker for Mac https://docs.docker.com/docker-for-mac/

# Integration with text editors

## Sublime Text

If you use Sublime, please checkout the plugin by Yves to help with auto reloads on file changes - https://github.com/yvess/sublime_d4m

## Atom

The easiest way to enable auto reloading is to install [on-save](https://atom.io/packages/on-save) package and set it up with this config:

```json
[
  {
    "srcDir": ".",
    "files": "**/**",
    "command": "screen -S d4m -p 0 -X stuff \"touch \\\"`pwd`/${srcFile}\\\"\"\r"
  }
]

I went to take a look at the /tmp directory which appears to be a symlink on my default install on the system, I'll attach every picure that might be relevant.

![screen shot 2017-10-25 at 10 04 06 pm](https://user-images.githubusercontent.com/8128863/32035832-8d6c7464-b9d0-11e7-8099-927cec09591d.png)
![screen shot 2017-10-25 at 10 02 52 pm](https://user-images.githubusercontent.com/8128863/32035833-8d8694a2-b9d0-11e7-88d1-8774b1594666.png)
![screen shot 2017-10-25 at 10 03 24 pm](https://user-images.githubusercontent.com/8128863/32035834-8d9e4296-b9d0-11e7-9a51-c2378e4fff92.png)
![screen shot 2017-10-25 at 10 03 37 pm](https://user-images.githubusercontent.com/8128863/32035835-8db65962-b9d0-11e7-8dfd-9e21cdc91aac.png)

Eternal "Wait until D4M is running....."

With the latest version of Docker for Mac beta (release Version 1.12.3-rc1-beta29 (13397)), when I start the script it says

Start and restop nfsd, for some reason restart is not as kind.
Stopping the nfsd service (use 'disable' to make permanent)
Starting the nfsd service
Wait until NFS is setup..
Wait until D4M is running......

and it never end. Docker for Mac is running. What could be?

Unable to mount home dir to /mnt

On the latest Docker for Mac CE, MobyVM by default has /mnt created with a db/ subdirectory in it. When d4m-nfs.sh tries to mount $HOME from the host to the VM, a permission error results.

sh /tmp/d4m-mount-nfs.sh
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
v3.5.1-77-g9de0a6fd7f [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
OK: 5655 distinct packages available
(1/9) Installing libtirpc (1.0.1-r0)
(2/9) Installing rpcbind (0.2.3-r3)
Executing rpcbind-0.2.3-r3.pre-install
(3/9) Installing device-mapper-libs (2.02.168-r3)
(4/9) Installing libevent (2.0.22-r2)
(5/9) Installing libmount (2.28.2-r1)
(6/9) Installing libnfsidmap (0.25-r1)
(7/9) Installing sqlite-libs (3.15.2-r0)
(8/9) Installing nfs-utils (1.3.4-r0)
(9/9) Installing sntpc (0.9-r6)
Executing busybox-1.25.1-r0.trigger
OK: 41 MiB in 59 packages
adding d4m nfs config to /etc/fstab:
# d4m-nfs mounts
192.168.65.1:/Users/jwong /mnt nfs nolock,local_lock=all 0 0
192.168.65.1:/Users/jwong/Documents/workspace/cloudflare/repos /repos nfs nolock,local_lock=all 0 0
192.168.65.1:/Users/jwong/dev-stack-data /data nfs nolock,local_lock=all 0 0
mount.nfs: access denied by server while mounting 192.168.65.1:/Users/jwong
mount.nfs: access denied by server while mounting 192.168.65.1:/Users/jwong
mount: mounting 192.168.65.1:/Users/jwong on /mnt failed: Permission denied
/ # touch /repos/.d4m /data/.d4m
/ #

screen shot 2017-03-08 at 23 17 27

screen shot 2017-03-08 at 23 13 26

$ cat etc/d4m-nfs-mounts.txt 
/Users/jwong/Documents/workspace/cloudflare/repos:/repos:0:0
/Users/jwong/dev-stack-data:/data:0:0
$ cat /tmp/d4m-mount-nfs.sh 
ln -nsf /tmp/d4m-apk-cache /etc/apk/cache
apk update
apk add nfs-utils sntpc
rpcbind -s > /dev/null 2>&1

DEFGW=$(ip route|awk '/default/{print $3}')
FSTAB="\n\n# d4m-nfs mounts\n"

if true && ! $(grep ':/mnt' /tmp/d4m-nfs-mounts.txt > /dev/null 2>&1); then
  mkdir -p /mnt

  FSTAB="${FSTAB}${DEFGW}:/Users/jwong /mnt nfs nolock,local_lock=all 0 0"
fi

if [ -e /tmp/d4m-nfs-mounts.txt ]; then
  while read MOUNT; do
    DSTDIR=$(echo "$MOUNT" | cut -d: -f2)
    mkdir -p ${DSTDIR}
    FSTAB="${FSTAB}\n${DEFGW}:$(echo "$MOUNT" | cut -d: -f1) ${DSTDIR} nfs nolock,local_lock=all 0 0"
  done < /tmp/d4m-nfs-mounts.txt
fi

if ! $(grep "d4m-nfs mounts" /etc/fstab > /dev/null 2>&1); then
    echo adding d4m nfs config to /etc/fstab:
    echo -e $FSTAB | tee /etc/fstab
else
    echo d4m nfs mounts already exist in /etc/fstab
fi

sntpc -i 10 ${DEFGW} &

sleep .5
mount -a
touch /tmp/d4m-done
$ cat /tmp/d4m-nfs-mounts.txt 
/Users/jwong/Documents/workspace/cloudflare/repos:/repos:0:0
/Users/jwong/dev-stack-data:/data:0:0
$ cat /etc/exports
# d4m-nfs exports

"/Users/jwong/Documents/workspace/cloudflare/repos" -alldirs -mapall=0:0 localhost
"/Users/jwong/dev-stack-data" -alldirs -mapall=0:0 localhost

I have to turn off AUTO_MOUNT_HOME to get rid of that permission error. I'm not sure if a better solution is to have $HOME mounted on somewhere else other than /mnt.

Docker + PHPStorm + d4m-nfs

Hi !

I try to setup Docker with PHPStorm 2016.3 in order to use XDebug properly but I have an issue and I think it's due to the sharing with d4m-nfs as the errors is

com.github.dockerjava.api.exception.DockerException: Mounts denied: /osxfs/#namespaces for more info.
.
nts/Workspace/Akeneo/PIM/1.6_ce_orm_php-5.6
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac

	at com.intellij.remoteServer.util.AgentTaskExecutor.execute(AgentTaskExecutor.java:29)
	at com.intellij.docker.remote.run.runtime.RemoteDockerRuntime.executeAgentTask(RemoteDockerRuntime.java:111)
	at com.intellij.docker.remote.run.runtime.RemoteDockerApplicationRuntime.executeAgentTask(RemoteDockerApplicationRuntime.java:162)
	at com.intellij.docker.remote.run.runtime.RemoteDockerApplicationRuntime.start(RemoteDockerApplicationRuntime.java:61)
	at com.intellij.docker.remote.run.runtime.RemoteDockerApplicationRuntime.startAndAttach(RemoteDockerApplicationRuntime.java:76)
	at com.intellij.docker.remote.run.runtime.RemoteDockerApplicationRuntime.startAndGetOutput(RemoteDockerApplicationRuntime.java:105)
	at com.jetbrains.php.remote.docker.PhpDockerRemoteProcessRunner.getProcessOutput(PhpDockerRemoteProcessRunner.java:70)
	... 16 more

But I can't see the full path PHPStorm tries to give to PHPStorm, could you have a look on it please ? Thanks !

Issue with webpack

Hey,

I am using d4m-nfs with a Symfony (PHP) project that uses webpack to build assets. The FS events are sent fine I think (the recompiling is triggered), but webpack doesn't seem to be able to access the modified file (maybe permission issue?) :
Module build failed: Error: EIO: i/o error, open '/srv/coopcycle/js/app/cart/Cart.jsx'

It compiles well if I stop/start my webpack container.

Any idea on how I might debug that?

Session data file is not created by your uid

I get the error "Session data file is not created by your uid" in my symfony project.

Does anyone have an idea to solve it?

My /etc/exports:

# d4m-nfs exports

"/Users" -alldirs -mapall=501:20 localhost
"/Volumes" -alldirs -mapall=501:20 localhost
"/private" -alldirs -mapall=501:20 localhost

In my docker-compose:

        volumes:
            - .:/var/www

Blank space on /etc/d4m-nfs-mounts.txt break script d4m-nfs.sh

I introduced a return character of the end of my file, and the script tried to do something weird accessing to a unexisting directory giving me this error:

exports:6: got host/group with no directory?: ""
[d4m-nfs] Something is wrong with your /etc/exports file, please check it.

Running d4m-nfs.sh gives something wrong with /etc/exports file error.

The error I get is something is wrong with your /etc/exports file

Here is attached image of the error I get.

screen shot 2017-03-08 at 8 21 59 am

  1. screenshot of Docker for Mac's Preferences -> File Sharing

screen shot 2017-03-08 at 8 21 00 am

  1. attachment of d4m-nfs/etc/d4m-nfs-mounts.txt

/Users/josephastrahan:mnt:0:0

  1. attachment of /tmp/d4m-mount-nfs.sh ?? (I don't think I need this right? I'm using docker-compose.yml files)

  2. attachment of /tmp/d4m-nfs-mounts.txt

screen shot 2017-03-08 at 8 56 45 am

  1. attachment of /etc/exports

-e # d4m-nfs exports

"/Users/josephastrahan" -alldirs -mapall=501:20 localhost

Bash command not found for command substitution syntax wrapper around ps and grep

When running the script I get an error on line 22 where it tries to run the ps and grep commands within the $().
I can confirm this by just trying to run that same command in the shell both with and without the $()

10:18:55 ~$ $(ps auxwww |grep docker |grep vmstateevent |grep '"vmstate":"running"')
-bash: patakijv: command not found
10:18:59 ~$ ps auxwww |grep docker |grep vmstateevent |grep '"vmstate":"running"'
patakijv         51442   0.0  0.0 556624300   4868   ??  S    10:22AM   0:00.01 /Applications/Docker.app/Contents/MacOS/com.docker.frontend {"action":"vmstateevent","args":{"vmstate":"running"}}
patakijv         51441   0.0  0.0 556642232   5188   ??  S    10:22AM   0:00.01 /Applications/Docker.app/Contents/MacOS/com.docker.frontend {"action":"vmstateevent","args":{"vmstate":"running"}}

I can remove the $() wrapper around the command line in lines 22 and 29 but not yet sure if that will introduce other issues that the rest of the script requires. I am still early in the evaluation and testing of this.

Clues? Comments?

Migrate from d4m-nfs to native Docker NFS Volumes discussion

It doesn't work with Docker for Mac Version 17.12.0-ce-mac46

$ ~/d4m-nfs/d4m-nfs.sh
[d4m-nfs] You will need to provide your Mac password in order to setup NFS.
Password:
[d4m-nfs] Copy the Moby VM APK Cache back.
[d4m-nfs] Create the script for Moby VM.
[d4m-nfs] Start and restop nfsd, for some reason restart is not as kind.
The nfsd service is already running.
[d4m-nfs] Wait until NFS is setup.
[d4m-nfs] Wait until D4M is running.
[d4m-nfs] Setup 'screen' to work properly with the D4M tty, while at it name it 'd4m'.
[d4m-nfs] Run Moby VM d4m-nfs setup script.
[d4m-nfs] Waiting until d4m-nfs setup is done
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
.........................................................................................
......................

Are mounts read-only?

All my docker container say they cannot write.
I have simply ./d4m-nfs.sh without any config.

Are the mounts read-only by default and if so, how to change that?

Any elegant solution for relative paths?

Our docker-compose files do not contain /Users/$USER - they use relative paths for portability. What would be the elegant way to adapt these to use d4m-nfs? Could we for instance unmount /Users and put osxfs on /mnt instead?

Files and folders are created in the host machine but is owned by root user

Hi guys!

Issue

I'm not sure if this is weird but I have my web/php service with Drush installed using:

RUN php -r "readfile('https://s3.amazonaws.com/files.drush.org/drush.phar');" > drush \
    && php drush core-status \
    && chmod +x drush \
    && mv drush /usr/local/bin

When I run docker exec -i myproject_web_1 drush dl flag the owner is not set to me but to the root user unlike the other existing modules like so:

drwxr-xr-x  26 leotan  staff   884B May 31 09:03 file_entity
drwxr-xr-x  20 root    staff   680B Sep 23  2016 flag
drwxr-xr-x   9 leotan  staff   306B May 31 09:03 google_tag

Is this normal?

Configuration details

Docker for Mac's Preferences -> File Sharing
docker-file-sharing

d4m-nfs/etc/d4m-nfs-mounts.txt

/Users/leotan:/Users/leotan:0:0

/tmp/d4m-mount-nfs.sh

ln -nsf /tmp/d4m-apk-cache /etc/apk/cache
apk update
apk add nfs-utils sntpc
rpcbind -s > /dev/null 2>&1

DEFGW=$(ip route|awk '/default/{print $3}')
FSTAB="\n\n# d4m-nfs mounts\n"

if true && ! $(grep ':/mnt' /tmp/d4m-nfs-mounts.txt > /dev/null 2>&1); then
  mkdir -p /mnt

  FSTAB="${FSTAB}${DEFGW}:/Users/leotan /mnt nfs nolock,local_lock=all 0 0"
fi

if [ -e /tmp/d4m-nfs-mounts.txt ]; then
  while read MOUNT; do
    DSTDIR=$(echo "$MOUNT" | cut -d: -f2)
    mkdir -p ${DSTDIR}
    FSTAB="${FSTAB}\n${DEFGW}:$(echo "$MOUNT" | cut -d: -f1) ${DSTDIR} nfs nolock,local_lock=all 0 0"
  done < /tmp/d4m-nfs-mounts.txt
fi

if ! $(grep "d4m-nfs mounts" /etc/fstab > /dev/null 2>&1); then
    echo adding d4m nfs config to /etc/fstab:
    echo -e $FSTAB | tee /etc/fstab
else
    echo d4m nfs mounts already exist in /etc/fstab
fi

sntpc -i 10 ${DEFGW} &

sleep .5
mount -a
touch /tmp/d4m-done

/tmp/d4m-nfs-mounts.txt

/Users/leotan:/Users/leotan:0:0

/etc/exports

# d4m-nfs exports

"/Users/leotan" -alldirs -mapall=0:0 localhost

Data from MYSQL is removed from /tmp

I've been successfully using this with multiple projects. So I would have volumes on /tmp/docker/project1/mysql, /tmp/docker/project2/mysql and etc.

I noticed that after I would restart my machine, the /tmp/docker folder is gone and I would need to import large databases again.

Am I doing something wrong on why it's not persistent or is this really how this works?

Thanks!

Cannot chown files inside the container

I started using d4m-nfs, but my scripts changing file ownership cannot run. I get:

chown: changing ownership of 'filename_here': Operation not permitted

How can I solve that?

Include benchmarks in readme

Check this out: docker/for-mac#77 (comment)

Thank you @goneflyin so much for creating d4m-nfs!

This is incredible, and should be bragged about in the readme :)

Benchmark - dd if=/dev/zero of=speedtest bs=1024 count=100000

* On host
100000+0 records in
100000+0 records out
102400000 bytes transferred in 0.307839 secs (332641246 bytes/sec)

real    0m0.327s
user    0m0.020s
sys 0m0.296s

* Within Docker for Mac without a host volume
100000+0 records in
100000+0 records out
real    0m 2.06s
user    0m 0.01s
sys 0m 2.04s

* Within Docker for Mac within a host volume
100000+0 records in
100000+0 records out
real    0m 31.69s
user    0m 0.11s
sys 0m 3.66s

* Within Docker for Mac within a host volume using NFS
100000+0 records in
100000+0 records out
real    0m 1.73s
user    0m 0.00s
sys 0m 0.60s

NFS is 18x faster than OSXFS - and even faster (or at least on par with) than not using a host volume at all (which blows the file-synchronization workarounds away from consideration)!

This gist currently includes the benchmark from @Journerist, feel free to add more if necessary, albeit the above already tells the story imo.

To reproduce this benchmark on your own machine, step into a temporary folder and run:

git clone https://github.com/IFSight/d4m-nfs.git
git clone https://gist.github.com/488998820e31f65c4ae01b4bf4d42146.git bench-77
d4m-nfs/d4m-nfs.sh
bench-77/bench-d4m-nfs.sh

Local folder permissions got totally messed up

So I ran d4m-nfs.sh on its own and it installed just fine. For some reason, after doing that, all of the files in the mount got their permissions reassigned to 1000 _appstore. So while the files were accessible within the mount, OSX considered them read-only since my local user didn't have permissions. Once I reset the permissions, the mount started to fail with permissions issues.

Here's the /etc/exports that it generated:

# d4m-nfs exports
"/Users/greg" -alldirs -mapall=503:20 localhost

Any ideas?

how to clean up nfs?

First of all, I really appreciate this repository as it helps a lot when mounting volumes on mac docker.

In the future, if I decide to abandon this approach. What should I do to clean up what have done by the d4m-nfs.sh script?

I noticed it creates some files in /tmp and /etc and also setup screen and Moby VM. How should I clean them all?

Not allowed to stop the nfsd service on Mac OS 10.12.4

When running the install.sh script, I get the following error:

[d4m-nfs] Start and restop nfsd, for some reason restart is not as kind.
Stopping the nfsd service (use 'disable' to make permanent)
/System/Library/LaunchDaemons/com.apple.nfsd.plist: Operation not permitted while System Integrity Protection is engaged

Any ideas on how to solve this?

Mounting directories that do not exist on the host?

Hello,
I often run into what I think it's a quirk of d4m-nfs: if the host directory (or file, I suppose) does not exist, the volume mount fails. osxfs and native Linux docker work properly in such scenario, by just creating the host directory.

This works 100% (tmpfs is on osxfs):

docker run -v /tmp/something-nonexisting:/sth -it centos:7 /bin/bash

this fails even though /Users is shared:

docker run -v /Users/alan/something-nonexisting:/sth -it centos:7 /bin/bash

docker: Error response from daemon: Mounts denied: fo.
.

The path /Users/alan/something-nonexisting
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more in.

this works 100%:

mkdir -p /Users/alan/something-nonexisting
sleep 10
docker run -v /Users/alan/something-nonexisting:/sth -it centos:7 /bin/bash

(additionally, there seems to be a sort of 'race condition', the new nfs dir on the host is not recognized immediately inside the docker vm).

Any idea of how the issue could be fixed/worked around?

Writes are extremely slow

I got this up and working correctly on OS X Sierra 10.12.2 on 1.13.0, but writes are really slow compared to the native filesystem. Read appears to be working and definitely faster than the native filesystem. Has anyone else encountered this, or know of a solution?

Cannot start service applications: Mounts denied

I just want to say the script was working for me a while ago and now it no longer seems to mount correctly, or it does so oddly.

I noticed in the notes of d4m it says...

Common Problem

It appears as though a number of people are blindly copying the mounts from the preference in Docker for Mac to d4m-nfs/etc/d4m-nfs-mounts.txt. In doing this they end up having a /Volumes, /private and /Users mounts. If you are getting an error similar to the following, you might of done this:

My exports file after its created looks like this...


# d4m-nfs exports

"/Users" -alldirs -mapall=0:0 localhost
"/private" -alldirs -mapall=0:0 localhost

Current error I get when doing docker-compose up is (ERROR: for dbdev Cannot start service dbdev: Mounts denied: osxfs/#namespaces for more info.)

Any help or ideas is appreciated. Oddly restarting my computer makes it work the first time but if I shutdown docker-compose then it won't start back up again?? Any help is appreciated and I'll update my stackoverflow answer to reflect the fix. (For your reference here it is, http://stackoverflow.com/questions/38168130/docker-on-osx-slow-volumes/42679301#42679301, shows step by step what I did just with the only change now being what I'm doing with the export file)

Just wanted to update and say that it seems to work when I restart docker the first time and then doesn't work if I have to docker-compose down and up again. It never did this before though and worked perfectly which is odd?

mount.nfs: access denied by server while mounting 192.168.65.1:/Users

Hi,

First of all let me thank you for such a brilliant solution, it works great!

But I have one problem with specifying custom mount points, I noticed the following errors in the moby VM:

mount.nfs: access denied by server while mounting 192.168.65.1:/Users
mount.nfs: access denied by server while mounting 192.168.65.1:/Users
mount: mounting 192.168.65.1:/Users on /Users failed: Permission denied

What might be the cause of this problem?

Many thanks.

echo commands in script are not working as expected

on initial run the script places a line in the /etc/exports file that causes it to error:
-e # d4m-nfs exports

after removing the -e from the file
during the run several more echos of -e and -n are seen.

Ultimately nothing is mounted into the Alpine VM, but the directory names are seen of what I attempted to specify in the file

NFS UID mapping not working

Hi there,

I have some issues with the ownership mapping.
What i want to accomplish is that mounted /Users/ volume will have UID:1000 and GUID:1000.
So what i did is in etc/d4m-nfs-mounts.txt added:

/Volumes:/Volumes:1000:1000
/private:/private:1000:1000
/Users:/Users:1000:1000

osx $ cat /etc/exports

# d4m-nfs exports

"/Volumes" -alldirs -mapall=1000:1000 localhost
"/private" -alldirs -mapall=1000:1000 localhost
"/Users" -alldirs -mapall=1000:1000 localhost`

Everything is looking fine so far (also tried to remove localhost) but when i go into the d4m screen (screen -r d4m) the ownership is not 1000 but still the osx user id.

/ # cd /Users/
/Users # ls -la
total 20
drwxr-xr-x    6 root     cdrw           204 Jun 15 13:58 .
drwxrwxrwt   24 root     root           540 Nov 21 13:49 ..
-rw-r--r--    1 root     root             0 May 11  2016 .localized
drwxr-xr-x   11 201      201            374 Sep 30  2014 Guest
drwxrwxrwt   12 root     root           408 Oct 29 10:39 Shared
drwxrwxrwx  146 501      dialout       4964 Nov 21 13:57 lennard
/Users #

OSX version: MacOS siera 10.12.2 bèta (16C48b)
Docker version: 10.12.2 bèta (16C48b)

Make d4m-nfs.sh autorun at startup?

Is it possible to make d4m-nfs.sh autorun at startup?

I created ~/Library/LaunchAgents/local.d4m-nfs:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Label</key>
   <string>local.d4m-nfs</string>
   <key>Program</key>
   <string>/usr/local/d4m-nfs/d4m-nfs.sh</string>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

then run launchctl start local.d4m-nfs.

It didn't work, any idea?

Problem with d4m-nfs setup on Docker v1.12.5

I am seeing the following output when attempting to setup D4M NFS on Sierra:

$ ./d4m-nfs.sh
[d4m-nfs] Copy the Moby VM APK Cache back.
[d4m-nfs] Create the script for Moby VM.
[d4m-nfs] Start and restop nfsd, for some reason restart is not as kind.
Stopping the nfsd service (use 'disable' to make permanent)
Starting the nfsd service
[d4m-nfs] Wait until NFS is setup..
[d4m-nfs] Wait until D4M is running.
[d4m-nfs] Setup 'screen' to work properly with the D4M tty, while at it name it 'd4m'.
[d4m-nfs] Run Moby VM d4m-nfs setup script.
[d4m-nfs] Waiting until d4m-nfs setup is done...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

It then continues to wait for the d4m-nfs setup to complete indefinitely; I waited for ~5mins before terminating.

Attachment of File Sharing

image

mounts.txt

Is an empty file.

/tmp/d4m-mount-nfs.sh

ln -nsf /tmp/d4m-apk-cache /etc/apk/cache
apk update
apk add nfs-utils sntpc
rpcbind -s > /dev/null 2>&1

DEFGW=$(ip route|awk '/default/{print $3}')
FSTAB="\n\n# d4m-nfs mounts\n"

if true && ! $(grep ':/mnt' /tmp/mounts.txt > /dev/null 2>&1); then
  mkdir -p /mnt

  FSTAB="${FSTAB}${DEFGW}:/Users/davidk /mnt nfs nolock,local_lock=all 0 0"
fi

if [ -e /tmp/mounts.txt ]; then
  while read MOUNT; do
    DSTDIR=$(echo "$MOUNT" | cut -d: -f2)
    mkdir -p ${DSTDIR}
    FSTAB="${FSTAB}\n${DEFGW}:$(echo "$MOUNT" | cut -d: -f1) ${DSTDIR} nfs nolock,local_lock=all 0 0"
  done < /tmp/mounts.txt
fi

if ! $(grep "d4m-nfs mounts" /etc/fstab > /dev/null 2>&1); then
    echo adding d4m nfs config to /etc/fstab:
    echo -e $FSTAB | tee /etc/fstab
else
    echo d4m nfs mounts already exist in /etc/fstab
fi

sntpc -i 10 ${DEFGW} &

sleep .5
mount -a
touch /tmp/d4m-done

/tmp/d4m-nfs-mounts.txt

Does not exist.

/etc/exports

# d4m-nfs exports

"/Users/davidk" -alldirs -mapall=0:0 localhost

Vagrant entries in /etc/exports causes ./d4m-nfs.sh to fail

Hi guys,

I'm trying to set this up with Docker for Mac on Yosemite. Currently I have projects on Vagrant and I noticed some entries on /etc/exports. When I run ./d4m-nfs.sh, I get an error:

d4m-nfs git:(master) /bin/bash d4m-nfs.sh
[d4m-nfs] Copy the Moby VM APK Cache back.
exports:28: /Users/leotan conflicts with existing export /Users/leotan/Documents/vm/myproject
[d4m-nfs] Something is wrong with your /etc/exports file, please check it.

Currently to test if this is working, I just created a backup of my exports file with the Vagrant entries.

Is there a way that they can work together?

Thanks!

mount.nfs: requested NFS version or transport protocol is not supported

Hello guys, suddently, probably after an update or something it does not work anymore.

mount.nfs: requested NFS version or transport protocol is not supported
mount: mounting 192.168.65.1:/xxxxxxon /xxxx failed: Not supported

On my mac:

rpcinfo -u localhost nfs
Can't contact rpcbind on localhost
rpcinfo: RPC: Unknown host

Do you have an idea?

Mount Denied

I have tried for 2 days to get this to work. It constantly reports mount denied when trying to run the d4m-nfs.sh script. I was trying to mount /opt from my host which has group ownership of wheel but my user account is the owner. I finally gave up on that and just tried to mount my user directory but that didn't work either. It's likely in a bad state and I have no idea how to reset it. I tried deleting everything in /tmp, removed the /etc/exports file and tried to rerun the script, same result. Hopefully somebody has some suggestions. I attached all my relevant files.

Thanks,
Grant

dockerfilesharingprefs

d4m-nfs-mounts-etc.txt
d4m-nfs-mounts-tmp.txt
d4m-mount-nfs.sh.txt
exports.txt

Mounting a single file

This is really great stuff. I'm having trouble mounting a single file (rather than an entire directory). I can work around it as my directory only contains one file (so I can volume-map in the directory). So I'm not in a great rush, but this would be great!

fsevents / inotify

If this is a custom script anyway, would it be possible to integrate filesystem notifications?

Can't mount volume directory that does not exist on host

This is a followup to #25 (since it got closed, I supposed you didn't read my late followup); I'm rewriting everything here, btw.

If I try mounting a volume with an host directory that does not exist, I get an error, while the very same behaviour is 100% working on Linux and/or using osxfs:

AlanEnerlife-mbpro:d4m-nfs alan$ docker run -v /Users/alan/asdasdasd:/asdasdasd -it ubuntu:xenial /bin/bash
docker: Error response from daemon: Mounts denied:
The path /Users/alan/asdasdasd
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
..
AlanEnerlife-mbpro:d4m-nfs alan$

image

AlanEnerlife-mbpro:d4m-nfs alan$ cat etc/d4m-nfs-mounts.txt
/Users:/Users:0:0
/Volumes:/Volumes
/private:/private
AlanEnerlife-mbpro:d4m-nfs alan$ cat /tmp/d4m-mount-nfs.sh
ln -nsf /tmp/d4m-apk-cache /etc/apk/cache
apk update
apk add nfs-utils sntpc
rpcbind -s > /dev/null 2>&1

DEFGW=$(ip route|awk '/default/{print $3}')
FSTAB="\n\n# d4m-nfs mounts\n"

if false && ! $(grep ':/mnt' /tmp/d4m-nfs-mounts.txt > /dev/null 2>&1); then
  mkdir -p /mnt

  FSTAB="${FSTAB}${DEFGW}:/Users/alan /mnt nfs nolock,local_lock=all 0 0"
fi

if [ -e /tmp/d4m-nfs-mounts.txt ]; then
  while read MOUNT; do
    DSTDIR=$(echo "$MOUNT" | cut -d: -f2)
    mkdir -p ${DSTDIR}
    FSTAB="${FSTAB}\n${DEFGW}:$(echo "$MOUNT" | cut -d: -f1) ${DSTDIR} nfs nolock,local_lock=all 0 0"
  done < /tmp/d4m-nfs-mounts.txt
fi

if ! $(grep "d4m-nfs mounts" /etc/fstab > /dev/null 2>&1); then
    echo adding d4m nfs config to /etc/fstab:
    echo -e $FSTAB | tee /etc/fstab
else
    echo d4m nfs mounts already exist in /etc/fstab
fi

sntpc -i 10 ${DEFGW} &

sleep .5
mount -a
touch /tmp/d4m-done
AlanEnerlife-mbpro:d4m-nfs alan$ cat /tmp/d4m-nfs-mounts.txt
/Users:/Users:0:0
/Volumes:/Volumes
/private:/private
AlanEnerlife-mbpro:d4m-nfs alan$ cat /etc/exports
# d4m-nfs exports

"/Users" -alldirs -mapall=0:0 localhost
"/Volumes" -alldirs -mapall=0:0 localhost
"/private" -alldirs -mapall=0:0 localhost

Relative paths

Hi,
I have this working (and it works very well, thanks!) when using an absolute path to for the volume mount source (eg, /mnt/workspace/example/app:/app). The problem with this though is that with this absolute path my docker-compose file is now not portable - it's completely specific to my machine.

Usually I would use relative paths to the local source (eg, ./app:/app) to mount my sourec code into a container.

Is there a way that this can be made to work with relative paths so that we can keep our docker-compose files portable and reusable?

Error with mounting volumes with docker-compose

The error is:

ERROR: for app-quota-api  Cannot start service app-quota-api: Mounts denied: es for more info.
.
rs/admin/la_projects/der-ibe/ibe-quotas-api
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespace

image

d4m-nfs/etc/d4m-nfs-mounts.txt

/Users:/Users:0:0
/Volumes:/Volumes
/private:/private

/etc/d4m-nfs-mounts.txt

/Users:/Users:0:0
/Volumes:/Volumes
/private:/private

/tmp/d4m-mount-nfs.sh

ln -nsf /tmp/d4m-apk-cache /etc/apk/cache
apk update
apk add nfs-utils sntpc
rpcbind -s > /dev/null 2>&1

DEFGW=$(ip route|awk '/default/{print $3}')
FSTAB="\n\n# d4m-nfs mounts\n"

if true && ! $(grep ':/mnt' /tmp/d4m-nfs-mounts.txt > /dev/null 2>&1); then
  mkdir -p /mnt

  FSTAB="${FSTAB}${DEFGW}:/Users/admin /mnt nfs nolock,local_lock=all 0 0"
fi

if [ -e /tmp/d4m-nfs-mounts.txt ]; then
  while read MOUNT; do
    DSTDIR=$(echo "$MOUNT" | cut -d: -f2)
    mkdir -p ${DSTDIR}
    FSTAB="${FSTAB}\n${DEFGW}:$(echo "$MOUNT" | cut -d: -f1) ${DSTDIR} nfs nolock,local_lock=all 0 0"
  done < /tmp/d4m-nfs-mounts.txt
fi

if ! $(grep "d4m-nfs mounts" /etc/fstab > /dev/null 2>&1); then
    echo adding d4m nfs config to /etc/fstab:
    echo -e $FSTAB | tee /etc/fstab
else
    echo d4m nfs mounts already exist in /etc/fstab
fi

sntpc -i 10 ${DEFGW} &

sleep .5
mount -a
touch /tmp/d4m-done

/tmp/d4m-nfs-mounts.txt

/Users:/Users:0:0
/Volumes:/Volumes
/private:/private

/etc/exports

# d4m-nfs exports
"/Users" -alldirs -mapall=0:0 localhost
"/Volumes" -alldirs -mapall=0:0 localhost
"/private" -alldirs -mapall=0:0 localhost

-------------------------------------------------------------------------

Looks like the problem is incorrect using strings... I am very weak in this, so I couldn't even assume where the problem is.
#32 (comment) - this similar problem in open issue, but the man don't say anything more about it... It's a pity.

I use docker-compose version 3. Maybe in this problem. When I used version 2 with volume_from everything was ok. But then I switched and try to write next lines:

php:
        build: docker/php
        restart: always
        container_name: mc_php
        links:
            - db
        volumes:
            - ./user-api:/var/www/microservice/user-api
            - ./quota-api:/var/www/microservice/quota-api
            - ./gateway-api:/var/www/microservice/gateway-api

1 to 1 mapping

Currently it is suggested to use /mnt path in xhyve. Wouldn't it be possible to use /Users, etc? So that peoople wouldn't need to change their docker-compose files.

AFAIK, Docker has an option to prevent /Users directories from being mounted.

Persist mounts when Docker restarted

d4m-nfs works great for me when I follow instructions provided in README.

However, the mounts are valid only until Docker is restarted.
Is there any way to make mounts in Docker persist after restart?
Or is there a way to make Docker to mount nfs resources automatically after started?

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.