Eos: Docker eosiocpp command throwing error.

Created on 14 Jun 2018  ยท  7Comments  ยท  Source: EOSIO/eos

I came across this issue, which I think is related, but I'm still having trouble. I've got my docker containers set up and running. I've successfully created keys and accounts, and successfully completed the tutorial https://github.com/EOSIO/eos/wiki/Tutorial-eosio-token-Contract and am now working on https://github.com/EOSIO/eos/wiki/Tutorial-Hello-World-Contract.
I've set the following alias "alias eosiocpp='docker-compose exec keosd /opt/eosio/bin/eosiocpp'", but when I run "eosiocpp -o hello.wast hello.cpp", I get "clang-4.0: error: no such file or directory: 'hello.cpp'"
I am sure I'm running from the correct directory. I'm likely misunderstanding the docs, some clarification would be great!

Thank you

Support

Most helpful comment

Add the volume mapping change to your docker-compose.yml, then your docker-compose.yml would like this:

version: "3"

services:
  builder:
    build:
      context: builder
    image: eosio/builder

  nodeosd:
    container_name: nodeosd
    build:
      context: .
    image: eosio/eos-dev
    command: /opt/eosio/bin/nodeosd.sh --data-dir /opt/eosio/bin/data-dir -e
    hostname: nodeosd
    ports:
      - 8888:8888
      - 9876:9876
    expose:
      - "8888"
    volumes:
      - nodeos-data-volume:/opt/eosio/bin/data-dir
      - ../contracts:/contracts

  keosd:
    container_name: keosd
    image: eosio/eos-dev
    command: /opt/eosio/bin/keosd --wallet-dir /opt/eosio/bin/data-dir --http-server-address=127.0.0.1:8900
    hostname: keosd
    links:
      - nodeosd
    volumes:
      - keosd-data-volume:/opt/eosio/bin/data-dir
      - ../contracts:/contracts

volumes:
  nodeos-data-volume:
    external: true
  keosd-data-volume:
    external: true
  contracts:
    external: true

After the containers are running up by run docker-compose up -d, there will be a contract folder in your nodeosd and keosd container under / path, verify via these commands:

docker exec -it keosd pwd
docker exec -it keosd ls
docker exec -it keosd ls contracts

Then you will know where you are and what you have.

Every time you want to reference the contract file inside contracts folder you need to specify the path of the contract file, for example:

eosiocpp -o /contracts/hello/hello.wast /contracts/hello/hello.cpp

P.S. If you want to run eos command anywhere then use these alias (add them to your .bashrc and do not forget to change the path):

alias cleos='docker-compose -f DIR-TO-YOUR-EOS-FOLDER/Docker/docker-compose.yml exec nodeosd /opt/eosio/bin/cleos -u http://nodeosd:8888 --wallet-url http://localhost:8900'

alias eosiocpp='docker-compose -f DIR-TO-YOUR-EOS-FOLDER/eos/Docker/docker-compose.yml exec nodeosd /opt/eosio/bin/eosiocpp'

All 7 comments

+1

I get the same error with the lastest eod-dev (v1.0.6) docker image. I have no clue what to alias besides cleos. https://developers.eos.io/eosio-nodeos/docs/docker-quickstart#section-cleos

What is the correct alias for nodeos and eosiocpp?

I realized the file system is actually mounted from Docker to your local file system here: /tmp/eosio. So to get eosiocpp to actually compile the code, i created a contracts directory in /tmp/eosio/data/contracts then created a folder called mycontract and copied the mycontract.cpp and mycontract.hpp files over after adding my own logic (or you can generate using the skeleton command) .

Next, to generate the compiled code, I ran this docker command (notice the eosiocpp code is actually ran in docker, not your local terminal):

docker exec eosio bash -c 'cd mnt/dev/data/contracts/mycontract && eosiocpp -o mycontract.wast mycontract.cpp'

Now you can see the compiled source code on your local file system at /tmp/eosio/data/contracts

@ntheile is correct here. @joaoritter if you are using docker, you need to pass the contract location inside your Docker. When you call eosiocpp -o hello.wast hello.cpp, it's actually looking for hello.cpp inside the root folder of your Docker which doesn't exist. You need to map your contracts to a location inside the Docker and then pass the contract location inside your Docker to eosiocpp

Add the volume mapping change to your docker-compose.yml, then your docker-compose.yml would like this:

version: "3"

services:
  builder:
    build:
      context: builder
    image: eosio/builder

  nodeosd:
    container_name: nodeosd
    build:
      context: .
    image: eosio/eos-dev
    command: /opt/eosio/bin/nodeosd.sh --data-dir /opt/eosio/bin/data-dir -e
    hostname: nodeosd
    ports:
      - 8888:8888
      - 9876:9876
    expose:
      - "8888"
    volumes:
      - nodeos-data-volume:/opt/eosio/bin/data-dir
      - ../contracts:/contracts

  keosd:
    container_name: keosd
    image: eosio/eos-dev
    command: /opt/eosio/bin/keosd --wallet-dir /opt/eosio/bin/data-dir --http-server-address=127.0.0.1:8900
    hostname: keosd
    links:
      - nodeosd
    volumes:
      - keosd-data-volume:/opt/eosio/bin/data-dir
      - ../contracts:/contracts

volumes:
  nodeos-data-volume:
    external: true
  keosd-data-volume:
    external: true
  contracts:
    external: true

After the containers are running up by run docker-compose up -d, there will be a contract folder in your nodeosd and keosd container under / path, verify via these commands:

docker exec -it keosd pwd
docker exec -it keosd ls
docker exec -it keosd ls contracts

Then you will know where you are and what you have.

Every time you want to reference the contract file inside contracts folder you need to specify the path of the contract file, for example:

eosiocpp -o /contracts/hello/hello.wast /contracts/hello/hello.cpp

P.S. If you want to run eos command anywhere then use these alias (add them to your .bashrc and do not forget to change the path):

alias cleos='docker-compose -f DIR-TO-YOUR-EOS-FOLDER/Docker/docker-compose.yml exec nodeosd /opt/eosio/bin/cleos -u http://nodeosd:8888 --wallet-url http://localhost:8900'

alias eosiocpp='docker-compose -f DIR-TO-YOUR-EOS-FOLDER/eos/Docker/docker-compose.yml exec nodeosd /opt/eosio/bin/eosiocpp'

Perfect!

@luckyyang i tried your docker-compose but getting error while using eosiocpp , when i run eosiocpp

alias eosiocpp='docker-compose -f /EOSBlockchain/eos/Docker/docker-compose.yml exec nodeosd /opt/eosio/bin/eosiocpp'

and run eosiocpp , i get error

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/opt/eosio/bin/eosiocpp\": stat /opt/eosio/bin/eosiocpp: no such file or directory": unknown

Which docker image are you using? The eosio/eos docker image doesn't contain the eosiocpp binary. Try eosio/eos-dev instead

Was this page helpful?
0 / 5 - 0 ratings

Related issues

zxf969175364 picture zxf969175364  ยท  3Comments

jiazechen picture jiazechen  ยท  3Comments

bezalel picture bezalel  ยท  3Comments

yashbhavsar007 picture yashbhavsar007  ยท  3Comments

jcalfee picture jcalfee  ยท  3Comments