Estou no processo de construção de uma nova imagem Docker e estou tentando instalar o NVM para que possa gerenciar nodejs.
Lendo os documentos sobre como instalar o NVM, eles mencionam que você precisa fornecer seu arquivo .bashrc para começar a usar o NVM.
Tentei configurar isso em um Dockerfile, mas até agora a construção falhou com o erro:
"bash: nvm: comando não encontrado"
Aqui estão as linhas relevantes do meu Dockerfile:
ADD files/nvm_install.sh /root/
RUN chmod a+x /root/nvm_install.sh
RUN bash -c "/root/nvm_install.sh"
RUN bash -l -c "source /root/.bashrc"
RUN cd /root
RUN bash -l -c "nvm install 0.10.31"
Aqui está o resultado da tentativa de construir:
docker build -t nginx_dock.
Step 0 : FROM ubuntu
---> 826544226fdc
Step 1 : MAINTAINER dficociello
---> Using cache
---> da3bc340fbb3
Step 2 : RUN apt-get update
---> Using cache
---> 6b6b611feb4f
Step 3 : RUN apt-get install nginx curl -y
---> Using cache
---> 159eb0b16d23
Step 4 : RUN touch /root/.bashrc
---> Using cache
---> 5e9e8216191b
Step 5 : ADD files/nginx.conf /etc/nginx/
---> Using cache
---> c4a4a11296a2
Step 6 : ADD files/nvm_install.sh /root/
---> Using cache
---> b37cba2a18ca
Step 7 : RUN chmod a+x /root/nvm_install.sh
---> Using cache
---> bb13e2a2893d
Step 8 : RUN bash -c "/root/nvm_install.sh"
---> Using cache
---> 149b49a8fc71
Step 9 : RUN bash -l -c "source /root/.bashrc"
---> Running in 75f353ed0d53
---> 0eae8eae7874
Removing intermediate container 75f353ed0d53
Step 10 : RUN cd /root
---> Running in feacbd998dd0
---> 284293ef46b0
Removing intermediate container feacbd998dd0
Step 11 : RUN bash -l -c "nvm install 0.10.31"
---> Running in 388514d11067
bash: nvm: command not found
2014/09/17 13:15:11 The command [/bin/sh -c bash -l -c "nvm install 0.10.31"] returned a non-zero code: 127
Eu sou muito novo no Docker, então posso estar perdendo algo fundamental para escrever Dockerfiles, mas até agora todas as leituras que fiz não me mostraram uma boa solução.
Respostas:
Quando você
RUN bash...
cada vez que é executado em um processo separado, nada definido no ambiente não é mantido. É assim que eu instalonvm
:fonte
v0.20.0
parav0.24.1
0.31.0
e node,v4.2.3
o caminho é/usr/local/nvm/versions/node/v4.2.3/bin
. $NVM_DIR/nvm.sh
, evitando o binário de origem.Para ajudar a todos que procuram uma maneira de instalar o Node.js com NVM no Ubuntu (última versão), fiz o dockerfile abaixo. Estou usando a última versão do Docker, Ubuntu, Node.js e o NVM está funcionando corretamente (o $ PATH foi corrigido). Estou usando isso em um ambiente de produção.
dockerfile:
fonte
source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Os caminhos do nvm foram alterados desde a resposta aceita, portanto, se você quiser usar uma versão do nvm mais atualizada, precisará fazer algumas alterações. Além disso, não é necessário remapear
sh
para que funcione:Não tenho certeza se você precisará da
--delete-prefix
opção nonvm use
- eu precisava, mas isso pode ser algo estranho na minha imagem base.fonte
Cada
RUN
um em um Dockerfile é executado em um contêiner diferente. Portanto, se você originar um arquivo em um contêiner, seu conteúdo não estará disponível no próximo.É por isso que quando você instala um aplicativo e precisa realizar várias etapas, deve fazê-lo no mesmo container.
Com o seu exemplo:
fonte
RUN ["/bin/bash", ...]
. Não deve ser circundado por[...]
e não é necessário especificar o intérprete/bin/bash -c
.Isso é baseado na principal resposta e funciona em 2018:
Observe que
nvm
não é um comando bash, é um alias. Isso pode atrapalhar você, se você estiver contando com isso$PATH
.fonte
Atualização 20/02/2020 : Esta solução funciona se você estiver usando uma
debian
imagem de base. Se você estiver usandoubuntu
, veja esta resposta .Esta é a maneira mais limpa de instalar
nvm
que encontrei:Explicação
A primeira linha define o shell padrão do Dockerfile para um shell de login bash . Nota: isso significa que todos os subseqüentes
RUN
,CMD
eENTRYPOINT
serão executados sob o usuário atual (geralmente root) e fornecerão o arquivo ~ / .bashrc se executado na forma de shell .A segunda linha é instalada
nvm
com bash. Quando o script é executado com bash, ele é anexado ao arquivo ~ / .bashrc .A terceira linha instala uma versão particular de nodejs e a usa. Os
nvm
,npm
enode
comandos estão disponíveis, porque eles são executados através de um shell de login bash (ver linha 1).fonte
NVM_DIR
(como mostrado em várias das outras respostas) corrigiu para mim.RUN
conjuntos de comandosNVM_DIR
em~/.bashrc
.sh
e, portanto, ignora.bashrc
. Além disso, você.bashrc
tem certeza de que é realmente fornecido antes de executar osRUN
comandos? Em meu breve teste com abash
imagem oficial , parecia que não.SHELL
endereço da primeira linha (a instrução). Faz com que os comandos RUN consecutivos usem um shell de login que origina o.bashrc
arquivo. Nota: só funciona se os comandos forem executados no modo shell, por exemplo.RUN nvm --version
. Não funcionará se os comandos forem executados no modo exec, por exemplo.RUN ["nvm", "--version"]
. Atualizei o link que forneci para o formulário de shell para tornar isso mais óbvio.Com base na sugestão na resposta de @Kuhess, substituí o comando de origem pelo seguinte em meu Dockerfile
fonte
Aqui está minha versão de trabalho
Recebeu ajuda das respostas de @abdulljibali e @shamisis.
fonte
~/.nvm/nvm.sh
arquivo era a chave de que precisava.Devo começar com o fato de que procurei por toda parte para obter um exemplo funcional de
nvm
dentrodocker
e não encontrei nenhum. Mesmo as respostas neste tópico não funcionaram.Então, passei um bom tempo e descobri um que funciona:
fonte
Uma diferença fundamental entre a tentativa de obter o comando nvm na questão:
que não funciona e a tentativa de fazer o mesmo na resposta aceita:
É que a segunda versão origina o script nvm.sh diretamente, enquanto a original tenta fazê-lo por meio do arquivo .bashrc.
O arquivo .bashrc tem uma linha inicial que sai se estiver sendo executado em um shell não interativo:
Portanto, nunca chega ao ponto em que teria originado o nvm.sh, o que realmente coloca o comando nvm em seu shell.
Eu não ficaria surpreso se o docker estivesse executando essas coisas em um shell não interativo. Isso não tinha sido explicitamente apontado, então pensei em mencioná-lo, pois foi o que me surpreendeu quando estava fazendo algo semelhante com o vagrant.
fonte
Levei uma ou duas horas para descobrir a maneira mais limpa de fazer isso. --login não parece executar .bashrc, então você deve fornecer -i para iniciá-lo no modo interativo. Isso faz com que o Docker grite com você um pouco, então eu só inicio dessa forma para a instalação e, em seguida, redefino para o meu shell padrão.
fonte
ubuntu
como imagem base (mas a sua sim). Eu estava usandodebian
imagens baseadas. Não tenho certeza do que está causando a discrepância entre os dois. Alguma ideia?Nada disso funcionou para mim, para meu
python3-onbuild
contêiner, tive que forçar a criação de links simbólicos para a instalação do nvm.fonte
$HOME/.nvm
para mim também.Isso é o que funcionou para mim (estou usando o debian buster):
Agora você deve ser capaz de fazer
nvm install <version>
.fonte
Apenas uma resposta coloca a instalação curl, mas não funciona em todo o Dockerfile
Aqui está meu Dockerfile pronto para copiar / colar no qual instalo a última versão do nvm 2020 com Ubuntu 18.04.3 LTS
fonte