Ошибка Powershell: отсутствует спецификация файла после оператора перенаправления - PullRequest
0 голосов
/ 25 февраля 2020

Я только начал учебник по Docker и после загрузки и следовал команде на официальной домашней странице, что

PS C:\COCcal> cat > Dockerfile <<EOF
>> FROM busybox
>> CMD echo "Hello world! This is my first Docker image."
>> EOF

дает мне

At line:1 char:19
+ cat > Dockerfile <<EOF
+                   ~
Missing file specification after redirection operator.
At line:1 char:18
+ cat > Dockerfile <<EOF
+                  ~
The '<' operator is reserved for future use.
At line:1 char:19
+ cat > Dockerfile <<EOF
+                   ~
The '<' operator is reserved for future use.
At line:2 char:1
+ FROM busybox
+ ~~~~
The 'from' keyword is not supported in this version of the language.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingFileSpecification

Эта ошибка. Я искал сообщение об ошибке в Google, но не могу найти тот же случай со мной. Какие-либо настройки отсутствуют? или что я должен сделать, чтобы работать эти команды? Я ценю это заранее.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Похоже, вы запускаете Linux команды оболочки внутри PowerShell. В зависимости от вашей конфигурации это может быть проблематично c. Я бы предложил открыть оболочку Linux или использовать команды, которые поддерживаются PowerShell.

# Run the Set-Content Command Below
Set-Content -Path Dockerfile

# After Running the above command, I am prompted to enter data:
Value[0]: FROM busybox
Value[1]: CMD echo "Hello world! This is my first Docker image."
Value[2]:

Когда вы запустите указанную выше команду, вам будет предложено ввести Value[0], Value[1], et c. (при условии, что вы нажимаете Enter после ввода данных в каждой строке), пока вы не нажмете Enter в строке без какого-либо другого ввода. Каждый из этих входов будет находиться на отдельной строке в Dockerfile.

Что касается операторов Перенаправление в PowerShell, поддерживаются только >, >> и >&1. Если cat работает вообще, это потому, что это псевдоним. Вы можете запустить Get-Alias cat, чтобы увидеть, к какой команде он относится. В моей системе это Get-Content.


Существуют и другие способы PowerShell для выполнения sh этой задачи, если вам не требуется такой же опыт, какой дают команды Linux. Ниже приведен только один пример.

$Content = @'
line 1 stuff
line 2 stuff
line 3 stuff
'@
$Content | Set-Content -Path Dockerfile

См. Ниже для вывода с кодированием UTF8NoBOM.

$Content = @'
line 1 stuff
line 2 stuff
line 3 stuff
'@
[IO.File]::WriteAllLines('C:\COCcal\Dockerfile',$Content,[Text.UTF8Encoding]::new($false))

Я не могу говорить для запуска этой конфигурации Docker с уважение к Docker. Таким образом, при запуске собственных команд PowerShell можно учитывать некоторые моменты.

  1. Если для Dockerfile требуется наличие определенных символов конца строки, Set-Content может используйте некоторую комбинацию возврата каретки и символов новой строки в каждой строке, которая не нравится Docker.
  2. Docker может ожидать определенную кодировку Dockerfile. Хотя Set-Content предлагает параметр -Encoding, он все равно может не обеспечивать то, что вам нужно. Например, вы можете использовать -Encoding UTF8. В Windows PowerShell это будет UTF8 с спецификацией (для этой команды в Windows PowerShell опция «Нет спецификации» отсутствует). Кодировка по умолчанию в Windows PowerShell будет Default, что вероятно ANSI. В PowerShell Core кодировкой по умолчанию является UTF8NoBOM.
0 голосов
/ 25 февраля 2020

В powershell нет оператора <<. cat может быть псевдонимом для get-content. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...