NodeJS 'appendFile' не создает файл в контейнере Docker
У меня есть приложение, которое создает несколько файлов CSV в своем рабочем каталоге во время работы. Приложение отлично работает вне моего контейнера докеров, но когда я запускаю его внутри, я получаю сообщение об ошибке:
Error: ENOENT: no such file or directory, open 'Data/Output.csv'
Файл записывается с использованием приведенного ниже вызова функции в файле myApp.js. Я пробовал использовать абсолютный / относительный путь и явно устанавливать флаги в третьем параметре appendFile. Каждый раз одна и та же ошибка.
fs.appendFile('Data/Output.csv', Text, (err) => {
if (err) throw err;
});
Для отладки я прикоснулся к Output.csv и установил следующую строку в моем Dockerfile, чтобы увидеть, действительно ли файл там, и ниже представлен результат этого.
Step 7/8 : RUN ls -al ~/myApp/src/Data
---> Running in 2dfabf2dd92b
total 8
drwxr-xr-x 2 root root 4096 Feb 7 16:17 .
drwxr-xr-x 5 root root 4096 Feb 7 16:17 ..
-rw-r--r-- 1 root root 0 Feb 7 16:17 .gitkeep
-rwxrwxrwx 1 root root 0 Feb 7 16:17 Output.csv
Тем не менее, когда я запускаю докер myApp/myApp, я получаю сообщение об ошибке, что такого файла или каталога нет.
Мой Dockerfile:
FROM ubuntu
#Install dependencies
RUN apt update -y && apt install -y git ssh nodejs npm gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
#install go and libraries
RUN wget https://dl.google.com/go/go1.13.7.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.13.7.linux-amd64.tar.gz && <some git clones of private repos>
#clone from local repo
ARG SSH_PRIVATE_KEY
ARG SSH_CONFIG
RUN mkdir ~/.ssh && chmod 0700 ~/.ssh && ssh-keyscan <private repo> ~/.ssh/known_hosts && echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_ed25519 && echo "${SSH_CONFIG}" > ~/.ssh/config && chmod 0600 ~/.ssh/id_ed25519 && cd ~/ && git clone <private repo> && rm -rf ~/.ssh && touch ~/myApp/src/Data/Output.csv && chmod 777 ~/myApp/src/Data/Output.csv && cd ~/myApp/src && npm install
#CMD ["node", "root/myApp/src/myApp.js"]
ENTRYPOINT /bin/bash #for debugging
1 ответ
Твой WORKDIR
не установлен должным образом, чтобы относительный путь работал так, как вы ожидаете. Пример вашего Dockerfile с добавленнымWORKDIR
и изменил CMD
.
(Также проверьте, есть ли у вас папкаData
уже создан, в противном случае это также может привести к ошибке)
FROM ubuntu
RUN apt update -y && apt install -y git ssh nodejs npm gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
RUN wget https://dl.google.com/go/go1.13.7.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.13.7.linux-amd64.tar.gz && <some git clones of private repos>
ARG SSH_PRIVATE_KEY
ARG SSH_CONFIG
RUN mkdir ~/.ssh && chmod 0700 ~/.ssh && ssh-keyscan <private repo> ~/.ssh/known_hosts && echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_ed25519 && echo "${SSH_CONFIG}" > ~/.ssh/config && chmod 0600 ~/.ssh/id_ed25519 && cd ~/ && git clone <private repo> && rm -rf ~/.ssh && touch ~/myApp/src/Data/Output.csv && chmod 777 ~/myApp/src/Data/Output.csv && cd ~/myApp/src && npm install
WORKDIR /root/src
CMD ["node", "app.js"]