echo to file in docker file не работает при сборке из armhf / ubuntu в dind - PullRequest
1 голос
/ 09 мая 2019

Я использую конвейеры CI на Gitlab для создания образов докеров для развертывания в Raspbian.Поскольку мои сборки нуждаются в доступе к некоторым частным пакетам NPM, я включаю в файл Docker следующую строку, в которой создается файл токена с использованием значения, хранящегося в переменной окружения $ NPM_TOKEN:

RUN echo //registry.npmjs.org/:_authToken=$NPM_TOKEN > ~/.npmrc

Это прекрасно работает при сборке измое обычное изображение (resin/raspberrypi3-node).Однако один из моих контейнеров построен из armhf/ubuntu.При выполнении приведенной выше строки сборка завершается с ошибкой:

standard_init_linux.go:207: exec user process caused "no such file or directory"
The command '/bin/sh -c echo //registry.npmjs.org/:_authToken=$NPM_TOKEN >> ~/.npmrc' returned a non-zero code: 1

Сборка выполняется нормально с docker build на моей машине для разработки (Windows 10), но не в конвейере gitlab.

Я попытался сократить файлы докера и конвейера до минимума и удалил переменную окружения и тильду из пути, но это все равно не помогло образу ubuntu (но не смоле).

Dockerfile.test.ubuntu:

FROM armhf/ubuntu

RUN echo hello > world.txt

Dockerfile.test.resin:

FROM resin/raspberrypi3-node

RUN echo hello > world.txt

gitlab-ci.yml:

build_image:
  image: docker:git
  services:
  - docker:dind
  script:
  - docker build -f Dockerfile.test.resin . # Succeeds
  - docker build -f Dockerfile.test.ubuntu . # Fails
  only:
    - master

Я искалпохожие проблемы и видели эту ошибку сообщается при запуске файла .sh, который содержит CRLF комбинаций.Хотя я работаю в Windows, моя IDE (VS Code) настроена на использование LF, а не CRLF, и я проверил все перечисленные выше файлы на соответствие.

1 Ответ

1 голос
/ 09 мая 2019

Поскольку здесь , попробуйте использовать в качестве аргумента эха двойные кавычки:

RUN echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc

И сначала, в вашем Dockerfile, выполните RUN ls -alrth ~/, чтобы проверить доступность /наличие целевой папки.

Эта ошибка также была зарегистрирована в этой теме (без ответа), с примером , где окончательная версия Dockerfile , как видно здесь, используйте этот .gitlab-ci.yml.

OP bighairdave подтверждает в комментариях:

Я скопировал следующее из примера, который @VonC дал , и это сработало:

variables: 
  DOCKER_HOST: "tcp://docker:2375" 
  DOCKER_DRIVER: overlay2 
before_script: 
  - docker run --rm --privileged hypriot/qemu-register
...