From 69a9f80f49c0123dcb63779cd1ec429ced10469a Mon Sep 17 00:00:00 2001 From: Miguel Berrio Date: Sun, 15 May 2022 18:44:51 +0200 Subject: [PATCH 1/5] feat: add param extra_volumes for mounting multiple directories --- lua/lspcontainers/init.lua | 45 ++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/lua/lspcontainers/init.lua b/lua/lspcontainers/init.lua index ba7734c..403533f 100644 --- a/lua/lspcontainers/init.lua +++ b/lua/lspcontainers/init.lua @@ -68,29 +68,34 @@ local supported_languages = { } -- default command to run the lsp container -local default_cmd = function (runtime, workdir, image, network, docker_volume) +local default_cmd = function (runtime, workdir, image, network, docker_volume, extra_volumes) if vim.fn.has("win32") then workdir = Dos2UnixSafePath(workdir) end - local mnt_volume + local cmd = { + runtime, + 'container', + 'run', + '--interactive', + '--rm', + '--network=' .. network, + '--workdir=' .. workdir, + } + if docker_volume ~= nil then - mnt_volume ="--volume="..docker_volume..":"..workdir + table.insert(cmd, "--volume="..docker_volume..":"..workdir) else - mnt_volume = "--volume="..workdir..":"..workdir + table.insert(cmd, "--volume="..workdir..":"..workdir) end - return { - runtime, - "container", - "run", - "--interactive", - "--rm", - "--network="..network, - "--workdir="..workdir, - mnt_volume, - image - } + for _, v in pairs(extra_volumes) do + table.insert(cmd, "--volume="..v) + end + + table.insert(cmd, image) + + return cmd end local function command(server, user_opts) @@ -101,6 +106,7 @@ local function command(server, user_opts) cmd_builder = default_cmd, network = "none", docker_volume = nil, + extra_volumes = {}, } -- If the LSP is known, it override the defaults: @@ -118,7 +124,14 @@ local function command(server, user_opts) return 1 end - return opts.cmd_builder(opts.container_runtime, opts.root_dir, opts.image, opts.network, opts.docker_volume) + return opts.cmd_builder( + opts.container_runtime, + opts.root_dir, + opts.image, + opts.network, + opts.docker_volume, + opts.extra_volumes + ) end Dos2UnixSafePath = function(workdir) From 5c53cf12a0abf55bf63c800262b052b44584cacb Mon Sep 17 00:00:00 2001 From: Miguel Berrio Date: Sun, 15 May 2022 19:10:03 +0200 Subject: [PATCH 2/5] docs: Add info for extra_volumes in README --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index c769b31..6bf2a2b 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,28 @@ require'lspconfig'.omnisharp.setup { } ``` +#### Mount Additional Volumes + +You can mount additional volumes to let the lsp server access caches or other directories. + +```lua +require'lspconfig'.rust_analyzer.setup { + cmd = require'lspcontainers'.command( + 'rust_analyzer', + { + extra_volumes = { + '/home/[UserName]/.cargo:/root/.cargo:ro', + ... + } + } + ), + ... +} +``` + +The property `extra_volumes` recieves a list of strings formated for the `--volume` option of Docker. +[See reference](https://docs.docker.com/engine/reference/run/#volume-shared-filesystems). + ### Podman Support If you are using podman instead of docker it is sufficient to just specify "podman" as `container_runtime`: From 4efcfac1c4680930e6b2d074a6f3e95c4988669b Mon Sep 17 00:00:00 2001 From: Miguel Berrio Date: Fri, 8 Jul 2022 22:50:08 +0200 Subject: [PATCH 3/5] feat: add param extra_volumes for mounting multiple directories --- lua/lspcontainers/init.lua | 51 ++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/lua/lspcontainers/init.lua b/lua/lspcontainers/init.lua index 0fae8e5..c9c7561 100644 --- a/lua/lspcontainers/init.lua +++ b/lua/lspcontainers/init.lua @@ -25,9 +25,9 @@ local supported_languages = { local user = user_id..":"..group_id if runtime == "docker" then - network = "bridge" + network = "bridge" elseif runtime == "podman" then - network = "slirp4netns" + network = "slirp4netns" end return { @@ -69,29 +69,34 @@ local supported_languages = { } -- default command to run the lsp container -local default_cmd = function (runtime, workdir, image, network, docker_volume) - if vim.loop.os_uname().sysname == "Windows_NT" then +local default_cmd = function (runtime, workdir, image, network, docker_volume, extra_volumes) + if vim.fn.has("win32") then workdir = Dos2UnixSafePath(workdir) end - local mnt_volume + local cmd = { + runtime, + 'container', + 'run', + '--interactive', + '--rm', + '--network=' .. network, + '--workdir=' .. workdir, + } + if docker_volume ~= nil then - mnt_volume ="--volume="..docker_volume..":"..workdir..":z" + table.insert(cmd, "--volume="..docker_volume..":"..workdir..":z") else - mnt_volume = "--volume="..workdir..":"..workdir..":z" + table.insert(cmd, "--volume="..workdir..":"..workdir..":z") end - return { - runtime, - "container", - "run", - "--interactive", - "--rm", - "--network="..network, - "--workdir="..workdir, - mnt_volume, - image - } + for _, v in pairs(extra_volumes) do + table.insert(cmd, "--volume="..v) + end + + table.insert(cmd, image) + + return cmd end local function command(server, user_opts) @@ -102,6 +107,7 @@ local function command(server, user_opts) cmd_builder = default_cmd, network = "none", docker_volume = nil, + extra_volumes = {}, } -- If the LSP is known, it override the defaults: @@ -119,7 +125,14 @@ local function command(server, user_opts) return 1 end - return opts.cmd_builder(opts.container_runtime, opts.root_dir, opts.image, opts.network, opts.docker_volume) + return opts.cmd_builder( + opts.container_runtime, + opts.root_dir, + opts.image, + opts.network, + opts.docker_volume, + opts.extra_volumes + ) end Dos2UnixSafePath = function(workdir) From 9d99c918dcf90bdf0b9e8edbff556c76339a6d09 Mon Sep 17 00:00:00 2001 From: Miguel Berrio Date: Sun, 15 May 2022 19:10:03 +0200 Subject: [PATCH 4/5] docs: Add info for extra_volumes in README --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 52b9553..58e6dba 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,28 @@ require'lspconfig'.omnisharp.setup { } ``` +#### Mount Additional Volumes + +You can mount additional volumes to let the lsp server access caches or other directories. + +```lua +require'lspconfig'.rust_analyzer.setup { + cmd = require'lspcontainers'.command( + 'rust_analyzer', + { + extra_volumes = { + '/home/[UserName]/.cargo:/root/.cargo:ro', + ... + } + } + ), + ... +} +``` + +The property `extra_volumes` recieves a list of strings formated for the `--volume` option of Docker. +[See reference](https://docs.docker.com/engine/reference/run/#volume-shared-filesystems). + ### Podman Support If you are using podman instead of docker it is sufficient to just specify "podman" as `container_runtime`: From a43fbabe18c8f5879b8edd9522da28fffa99b15d Mon Sep 17 00:00:00 2001 From: Miguel Berrio Date: Fri, 8 Jul 2022 23:01:13 +0200 Subject: [PATCH 5/5] fix: merge conflict --- lua/lspcontainers/init.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lua/lspcontainers/init.lua b/lua/lspcontainers/init.lua index c9c7561..abfd336 100644 --- a/lua/lspcontainers/init.lua +++ b/lua/lspcontainers/init.lua @@ -27,7 +27,7 @@ local supported_languages = { if runtime == "docker" then network = "bridge" elseif runtime == "podman" then - network = "slirp4netns" + network = "slirp4netns" end return { @@ -61,7 +61,7 @@ local supported_languages = { solargraph = { image = "docker.io/lspcontainers/solargraph" }, sumneko_lua = { image = "docker.io/lspcontainers/lua-language-server" }, svelte = { image = "docker.io/lspcontainers/svelte-language-server" }, - tailwindcss= { image = "docker.io/lspcontainers/tailwindcss-language-server" }, + tailwindcss = { image = "docker.io/lspcontainers/tailwindcss-language-server" }, terraformls = { image = "docker.io/lspcontainers/terraform-ls" }, tsserver = { image = "docker.io/lspcontainers/typescript-language-server" }, vuels = { image = "docker.io/lspcontainers/vue-language-server" }, @@ -69,19 +69,19 @@ local supported_languages = { } -- default command to run the lsp container -local default_cmd = function (runtime, workdir, image, network, docker_volume, extra_volumes) - if vim.fn.has("win32") then +local default_cmd = function(runtime, workdir, image, network, docker_volume, extra_volumes) + if vim.loop.os_uname().sysname == "Windows_NT" then workdir = Dos2UnixSafePath(workdir) end local cmd = { runtime, - 'container', - 'run', - '--interactive', - '--rm', - '--network=' .. network, - '--workdir=' .. workdir, + "container", + "run", + "--interactive", + "--rm", + "--network=" .. network, + "--workdir=" .. workdir, } if docker_volume ~= nil then @@ -101,7 +101,7 @@ end local function command(server, user_opts) -- Start out with the default values: - local opts = { + local opts = { container_runtime = "docker", root_dir = vim.fn.getcwd(), cmd_builder = default_cmd,