使用docker exec运行nvm

4
我希望能够通过docker exec来运行nvm。
类似于:
docker run -d <image>
docker exec <container> nvm use v6.13.0 && npm install

但是我遇到了一个错误

OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"nvm\": executable file not found in $PATH": unknown

我知道我可以做一些能够工作的类似的事情。
docker exec <container> /bin/bash -c 'source "$NVM_DIR"/nvm.sh && nvm use v6.13.0'

但是我不想这样做。为什么?因为重点在于创建一个Docker容器,该容器可以与我所有的项目一起使用,并且可以使用不同版本的Python和Node,并直接从gitlab-ci运行nvm use <version> && npm install命令,使用我的项目中的.nvmrc文件。

我的gitlab-cy.yml运行一个Makefile,基本上运行nvm use和npm install命令。

image: cracky5457/nvm-pyenv-yarn

stages:
  - install
  - test

variables:
  GITLAB_CACHING: "true"

cache:
  paths:
    - pip-cache/
  key: "python_2.7"

installing:
  stage: install
  script:
    - make install
  artifacts:
    paths:
      - venv/
      - node_modules/
    expire_in: 1 hour
  tags:
    - docker-runner

我不想在我的 makefile 文件中添加 /bin/bash -c,因为这会使项目在本地变得依赖于 Docker。

这是我的 Docker 镜像及其运行指令(你需要创建一个文件 base_dependencies.txt、node-versions.txt 和 python-versions.txt),或者你可以直接使用 docker pull cracky5457/nvm-pyenv-yarn

https://hub.docker.com/r/cracky5457/nvm-pyenv-yarn/

FROM phusion/baseimage:0.10.0

 # Make sure bash is the standard shell
RUN rm /bin/sh && ln -sf /bin/bash /bin/sh

ENV ENV ~/.profile
ENV PYENV_ROOT /root/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH

# Add yarn registry
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

# Install base system libraries.
ENV DEBIAN_FRONTEND=noninteractive
COPY base_dependencies.txt /base_dependencies.txt
RUN apt-get update && \
    apt-get install -y $(cat /base_dependencies.txt)

# Install pyenv and default python version.
ENV PYTHONDONTWRITEBYTECODE true
RUN git clone https://github.com/yyuu/pyenv.git /root/.pyenv && \
    cd /root/.pyenv && \
    git checkout `git describe --abbrev=0 --tags` && \
    eval "$(pyenv init -)"

# Install nvm and default node version.
ENV NVM_DIR /usr/local/nvm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash && \
    echo 'source $NVM_DIR/nvm.sh' >> /etc/profile

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install python and node versions
COPY python-versions.txt /python-versions.txt
RUN for version in $(cat python-versions.txt); do pyenv install $version; pyenv global $version; pip install virtualenv; done
COPY node-versions.txt /node-versions.txt
RUN for version in $(cat node-versions.txt); do source $NVM_DIR/nvm.sh; nvm install $version; done

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]
1个回答

1
我没有找到合适的方法。
您可以在/usr/bin/nvm中创建一个bash文件,并使用chmod +x /usr/bin/nvm命令。
#!/bin/bash

export NVM_DIR="/usr/local/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

nvm "$@"

然后

docker exec <container> nvm use

但这很棘手,我无法在我的exec中添加其他指令,例如我无法同时执行docker exec <container> nvm use && npm install

但最终我直接在gitlab-ci.yaml文件中解决了我的问题,使用了以下内容:

 $(NVM_DIR)/nvm.sh && nvm use && npm install

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接